lunes, 25 de febrero de 2013

Fuentes de Consulta


Bibliografía:

·         * Mircrocontrolador PIC16f84, desarrollo de proyectos 3ra edición, Enrique Palacios,Fernando Remiro y Lucas J.Lopez. 

·         *Mis primeros programas en Assambler

domingo, 24 de febrero de 2013

Practica 2. Interrupción por Desbordamiento del Timer 0

Esta practica consiste en que a través del desbordamiento del Timer 0, nos muestre en la salida de un pin (PORTB.1) nos muestre una señal cuadrada, que va a ser el numero de lista por 50Hz, esto recurriendo a la formula de: "Temporizacion = (Prescaler)(Tcm)(256 - Carga del TMR0)"

Esta practica la armamos en el lenguaje ensamblador (.asm) debido a que se nos hizo mas practica la realización en este lenguaje, a continuación se muestra el código realizado:


list p=16F628A ; list directive to define processor
#include <p16F628A.inc> ; processor specific variable definitions

errorlevel -302 ; suppress message 302 from list file

__CONFIG _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT

CBLOCK 0x20
Registro50ms
ENDC

CARGA_500ms EQU d'15'
TMR0_Carga50ms EQU d'256'-d'24'
#DEFINE LED PORTB,1

ORG 0
goto Inicio
ORG 4
goto Timer0_Interrupcion
Inicio
movlw .7
movwf CMCON
call LCD_Inicializa
bsf STATUS,RP0
bcf LED
movlw b'00000000'
movwf OPTION_REG ; Prescaler de 2 para el TMR0
bcf STATUS,RP0
movlw TMR0_Carga50ms ; Carga el Timer 0.
movwf TMR0
movlw CARGA_500ms
movwf Registro50ms ; Número de veces a repetir la interrupción.
movlw b'10100000' ; Activa interrupción del TMR0 (TOIE) y la
movwf INTCON ; general (GIE).
Principal
movlw MensajeLargo
call LCD_MensajeMovimiento
goto Principal

CBLOCK
Guarda_W
Guarda_STATUS
ENDC

Timer0_Interrupcion
movwf Guarda_W ; Guarda W y STATUS.
swapf STATUS,W
movwf Guarda_STATUS
bcf STATUS,RP0 ; Para asegurarse de que trabaja con el banco 0.
movlw TMR0_Carga50ms
movwf TMR0 ; Recarga el TMR0.
decfsz Registro50ms,F ; Decrementa el contador.
goto FinInterrupcion
movlw CARGA_500ms ; Repone el contador nuevamente.
movwf Registro50ms
btfsc LED ; Pasa a conmutar el estado del LED.
goto EstabaEncendido
EstabaApagado
bsf LED ; Lo enciende.
goto FinInterrupcion
EstabaEncendido
bcf LED ; Lo apaga.
FinInterrupcion
swapf Guarda_STATUS,W ; Restaura el STATUS.
movwf STATUS
swapf Guarda_W,F ; Restaura W como estaba antes de producirse
swapf Guarda_W,W ; la interrupción.
bcf INTCON,T0IF
retfie
Mensajes
addwf PCL,F
MensajeLargo
DT " "
DT "Garcia Fragoso Jordan Adrian."
DT " ", 0x00
;
INCLUDE <LCD_MENS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END

Despues de hacerlo en .asm lo realizamos en PicBasic, ya que de esto es la materia, y para esto este es nuestro codigo para PicBasic:


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 18/02/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE 3F10H
CMCON=7
DEFINE OSC 4
Z VAR BYTE
W VAR BYTE
Y VAR BYTE
Z = 0
TRISB = $00
TRISA = $00
ON INTERRUPT GOTO Int

SYMBOL TOIF=INTCON.2 : SYMBOL SALIDA=PORTA.1
SALIDA=0
H CON 010010
O CON %10000000
A CON 010000
L CON %10001110
OPTION_REG=000000
INTCON=%10100000
TMR0=233

Inicio:
portb=H
CALL time
portb=O
CALL time
portb=l
CALL time
portb=a
CALL time
goto IniciO

time:
for w=1 to 100
pause 5
next
return

DISABLE
Int:
TOGGLE SALIDA
 GOTO RESETEO

RETRASO:
FOR Z=1 TO 25
CALL RETARDO
NEXT
RETURN

RETARDO:
TMR0=233

Espera:
if toif=1 then RESETEO
GOTO ESPERA

RESETEO:
TOIF=0
TMR0=233
INTCON=%10100000
RETURN
RESUME
END


Para esto se llevo a cabo la simulación que nos permite ver el funcionamiento de nuestro programa antes de hacer el físico



Para comprobar el funcionamiento, revisa el siguiente enlace:
http://www.youtube.com/watch?v=0W7iTMtDxcA



lunes, 11 de febrero de 2013

Practica 1. Interrupción por RB0

El objetivo de esta practica es el uso de la interrupción por RB0, en la que el programa principal sera mostrar algún mensaje a través de un Display de 7 segmentos, y al momento de hacer la interrupción por RB0 en el pin RA0 se conectara una bocina donde saldrá una melodía usando la instrucción SOUND

A continuación se muestra el código de nuestro programa:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 11/02/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE 3F10H
  H CON %11101100
  O CON %01111110
  A CON %11101110
  L CON %01110000
  SYMBOL PIN = PORTA.0
  LOOP VAR BYTE
ON INTERRUPT GOTO ETIQUETA
    
    TRISB = 000001
    TRISA = $00
    CMCON = 7
    INTCON = %10010000
    OPTION_REG = %01000000

INICIO:
    PORTB=H
    PAUSE 500
    PORTB=O
    PAUSE 500
    PORTB=L
    PAUSE 500
    PORTB=A
    PAUSE 500
    GOTO  INICIO
   
    DISABLE            ;DESHABILITA LAS INTERRUPCIONES
ETIQUETA:

  SOUND PIN, [50,60,70,20,85,120,83,40,70,20,50,20,70,20,90,120,90,20,98,160]
  FOR LOOP = 128 TO 255
  SOUND PIN, [LOOP,2]
  NEXT
  SOUND PIN, [43,80,63,20,77,20,71,80,51,20,_
  90,20,85,140,77,20,80,20,85,20,_
  90,20,80,20,85,60,90,60,92,60,87,_
  60,96,70,0,10,96,10,0,10,96,10,0,_
  10,96,30,0,10,92,30,0,10,87,30,0,_
  10,96,40,0,20,63,10,0,10,63,10,0,_
  10,63,10,0,10,63,20]
    RESUME
    ENABLE

    END
Para comprobar el funcionamiento de nuestro programa vamos al simulador Proteus y armamos el siguiente circuito para simular:

A partir de esta simulacion probamos que nuestro circuito funciona

Diagrama de Flujo:





Para ver como queda el circuito fisico visita el siguiente enlace:

martes, 5 de febrero de 2013

Osciladores


Todo microcontrolador requiere de un circuito que le indique la velocidad de trabajo, es el llamado oscilador o reloj. Este genera una onda cuadrada de alta frecuencia que se utiliza como señal para sincronizar todas las operaciones del sistema. Este circuito es muy simple pero de vital importancia para el comportamiento del sistema, y se permiten cinco tipos de osciladores para definir la frecuencia de funcionamiento:
Ø  Oscilador XT (cristal de cuarzo)
Es el más utilizado y está basado en el oscilador de cristal de cuarzo o en un resonador cerámico. Es un oscilador estándar que permite una frecuencia de reloj muy estable comprendida entre 100KHz y 4 MHz.
Ø  Oscilador RC (oscilador con resistencia y condensador):
Su principal inconveniente es la baja precisión, pero es de bajo precio y eso lo hace muy útil para proyectos que no requieren de exactitud en el tiempo.
CEXT
REXT
FRECUENCIA

20pF
5k
10k
100k
4,61 MHz
2,66 MHz
311 MHZ

100pF
5k
10k
100k
1,34 MHz
756 MHz
82,8 KHz

300pF
5k
10k
100k
428 KHz
243 KHZ
26,2 KHZ

Ø  Osciladores HS y LP:
El oscilador de cristal o resonador de alta velocidad HS (High Speed Crystal Resonator) trabaja a una frecuencia de entre 4MHz y 20MHz.
El oscilador de cristal de cuarzo o resonador cerámico de baja potencia (Low Power Crystal) es un oscilador de bajo consumo. Su cristal o resonador está diseñado para trabajar con frecuencias comprendidas entre 32KHz y 200KHz.

Timer 0


Un timer se implementa por medio de un contador que determina un tiempo preciso entre el momento en que el valor es cargado y el instante en el que se produce su desbordamiento. Consiste en un contador ascendente (también podría ser descendente) que, una vez inicializado con un valor, su contenido se incrementa con  cada impulso de entrada hasta llegar a su valor máximo b’11….11’, desbordando y volviendo a comenzar desde cero.
Los impulsos aplicados al TIMER0 pueden provenir de los pulsos aplicados al pin TOCKI o de la señal de reloj interna (Fosc/4), lo que permite actuar de dos formas diferentes:
·         Como contador de los impulsos que le llegaran por el RA4/TOCKI.
·         Como temporizador de tiempos.
A veces es necesario controlar los tiempos largos y aumentar la duración de los impulsos que incrementan en el TMR0. Para cubrir esta necesidad se dispone de un circuito programable llamado Divisor de frecuencia o Prescaler que divide la frecuencia utilizada por diversos rangos para poder conseguir temporizaciones más largas.
El prescaler puede aplicarse a uno de los temporizadores, al TMR0 o al Watchog. Cuando se asigna al TMR0 los impulsos pasan primero por el divisor de frecuencia y una vez aumenta su duración se aplica el TMR0.
Para controlar el comportamiento del TMR0 se utilizan algunos bits de los registros OPTION e INTCON.
Del registro INTCON.
Este registro se localiza en la dirección 0Bh del Banco 0 y duplicado en la 8Bh del Banco 1. Contiene los 8 bits que se muestran en la siguiente tabla, de dichos bits, solo utilizaremos el TOIF.
GIE
EEIE
TOIE
INTE
RBIE
TOIF
INTF
RBIF
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0


·         TOIF (TMR0 Overflow Interrupt Flag Bit). Flag de interrupcion del TMR0. Indica que se ha producido un desbordamiento del Timer 0, que ha pasado de b’11111111’ a b’00000000’.
o   TOIF=0, el TMR0 no se ha desbordado.
o   TOIF=1, El TMR0 se ha desbordado. (Debe borrarse por software).
Del registro OPTION
Este registro gobierna el comportamiento del TMR0. Y los bits utilizados por los timers son:
/RBPU
INTDEG
TOCS
TOSE
PSA
PS1
PS2
PS0
BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0


PS2:PS0. (Prescaler Rate Selec Bits). Bits para seleccionar los valores del prescaler o rango con el que actúa el divisor de frecuencia.
·         PSA (Prescaler Assignment Bit). Asignación del divisor de frecuencia:
o   PSA=0, El divisor de frecuencia se asigna al TMR0.
o   PSA=1, El divisor de frecuencia se asigna al Watchdog.
PS2  PS1  PS2
Divisor del TMR0
Divisor del WDT
000
001
010
011
100
101
110
111
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128


·         TOSE (TMR0 Source Edge Selec Bit). Selecciona flanco de la señal de entrada del TMR0.
o   TOSE=0, TMR0 se incrementa en cada flanco ascendente de la señal aplicada.
o   TOSE=1, TMR0 se incrementa en cada flanco descendente de la señal aplicada.
·         TOCS (TMR0 Clock Source Select Bit). Selecciona la fuente de señal del TMR0.
o   TOCS=0, Pulsos de reloj interno Fosc/4 (TMR0 como temporizador).
o   TOCS=1, Pulsos introducidos a través del pin RA4/TOCKI (TMR0 como contador).