Secuenciador de 8 LED's usando el TMR0 y el conversor análogo a digital.
Por medio de un potenciometro conectado a uno de los canales del conversor análogo a digital, podemos variar la velocidad de los LED's conectados al PORTB, el valor en el potenciometro es leído por el AD y después almacenado en el TMR0.
Circuito
Código fuente
LIST P=16F886
INCLUDE P16F886.INC
ERRORLEVEL -302
__CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF
CBLOCK 0X20
CUENTA, PDel0, VALORAD
ENDC
ORG 0X00
GOTO CONFIGURA
ORG 0X04
GOTO INTERRUPCION
ORG 0X05
INTERRUPCION DECFSZ CUENTA,F
GOTO SALE
RLF PORTB
MOVLW .5
MOVWF CUENTA
SALE MOVF VALORAD,W
MOVWF TMR0
BCF INTCON,T0IF
RETFIE
RETAD movlw .123 ; 1 set number of repetitions
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) is the time over?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
CONFIGURA CLRF PORTB
BANKSEL OSCCON
MOVLW B'01101100'
MOVWF OSCCON
BANKSEL ADCON1
MOVLW B'00000000' ; 7 justifica a la izq, 5 Vss ref, 4 Vdd ref
MOVWF ADCON1
BANKSEL ANSEL
MOVLW B'00000001'
MOVWF ANSEL
CLRF ANSELH
BANKSEL TRISB
MOVLW .1
MOVWF TRISA
CLRF TRISB
CLRF TRISC
BANKSEL OPTION_REG
MOVLW B'00000111'
MOVWF OPTION_REG
MOVLW B'10100000'
MOVWF INTCON
BANKSEL ADCON0
MOVLW B'11000001' ;7:6 FCR clock, 5:2 canal, 1 go, 0 AD ON
MOVWF ADCON0
BANKSEL PORTB
CLRF PORTA
CLRF PORTC
CLRF TMR0
MOVLW .1
MOVWF PORTB
MOVLW .20
MOVWF CUENTA
CICLO BSF ADCON0,GO
CALL RETAD
END_AD BTFSC ADCON0,GO
GOTO END_AD
MOVF ADRESH,W
MOVWF VALORAD
GOTO CICLO
END
Copyright 2012 edwtron
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior.
Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
Free Documentation License".
Translate, Traductor
Mostrando entradas con la etiqueta temporizador. Mostrar todas las entradas
Mostrando entradas con la etiqueta temporizador. Mostrar todas las entradas
viernes, 6 de julio de 2012
Secuenciador Variable usando el TMR0 y el AD
Etiquetas:
16f886,
analogo,
assembler,
conversor,
ensamblador,
fusibles,
interrupcion,
interrupciones,
LED,
microchip,
microcontrolador,
PIC,
secuenciador,
temporizador,
timer,
TMR0
jueves, 5 de julio de 2012
El timer TMR0 en los PIC con ejemplo
El timer TMR0 en los PIC
Es un modulo que sirve como contador o como temporizador de 8 bit's.
Funcionando como temporizador el TMR0 es un registro donde yo puedo almacenar un valor y este se va incrementando de 1 en 1 con los ciclos de instruccion, es decir, con cada ciclo se incrementa en 1 el TMR0, cuando la cuenta llega a 255 y pasa a 0 (cero) se porduce una interrupcion por desborde del TMR0, recordemos que en un registro de 8 Bit's el valor mas alto que se puede almacenar es 255 y que si lo incrementamos estando en 255 pasa a cero, y es a esto a lo que se le denomina desborde.
Cual seria la ventaja entonces de usar el timer TMR0?
Cuando necesitemos temporizar, o lo que normalmente llamamos un retardo, no necesitaremos las acostumbradas rutinas para retardos, esto lo vamos a ver con un ejemplo.
El TMR0 tiene las siguientes caracteristicas:
-se puede leer y escribir
-puede trabajar con relog externo o interno
-detecta el flanco de subida o bajada del relog externo
-tiene un prescaler de 8 bit´s
-tiene una interrupcion por desborde de la cuenta de 255 a 0
los registros asociados a el son el TMR0, INTCON y el OPTION_REG
El bit T0CS (OPTION 2) a 1 trabaja como temporizador, 0 trabaja como contador
El bit T0SE (OPTION 4) en modo contador a 1 flanco descendente, 0 flanco ascendente
El bit PSA (OPTION 3) 0 prescaler al temporizador, 1 prescaler al perro guardian WDT
Cuando se desborda el TMR0, se activa el bit 2 de INTCON (T0IF) y si el T0IE esta activado el T0IF generara interrupcion y se debe borrar por software cuando se atienda la interrupcion
Para calcular el tiempo de temporizacion
Tiempo = 4 * Tosc * (256 - valor cargado en TMR0)*(Rango presaler)
donde
Tocs = 1 / Fosc (frecuencia del oscilador)
Entonces si necesitamos un determinado tiempo podemos despejar TMR0 y hallar su valor:
Tiempo
TMR0 = ---------------------------- - 256
4 * Tosc * Prescaler
Formula que nos dara un valor muy aproximado del Tiempo
Empecemos la configuración
Configuramos el OPTION_REG
BANKSEL OPTION_REG
MOVLW B'00000000'
ANALICEMOS
BIT 7 Pull up PORTB Disable
BTI 6 interrupcion por flaco de subida en el INT Pin
BIT 5 fuente del clock para el TMR0, internal 1 ciclo ed intruccion (1/Fosc)
BIT 4 Flanco de bajada para el incremento del TMR0
BIT 3 Prescaler asignado al TMR0
BIT 2-0 Division del prescaler
Configuramos el INTCON
Registro donde activamos las interrupciones globales y la del TMR0
MOVLW B'10100000'
MOVWF OPTION_REG
BIT 7 Activamos las interrupciones Globales
BIT 6 interrupciones de otros perifericos desactivadas
BIT 5 Habilitamos la interrupcion por desborde en el TMR0
BIT 4 desabilitamos interrupcion externa INT
BIT 3 desabilitamos interrupcion por cambio en el PORTB
BIT 2 bandera interrupcion en TMR0
BIT 1 bandera interrupcion en INT
BIT 0 bandera interrupcion por cambio en PORTB
Ejemplo
Vamos a crear una señal de 1 KHz usando el TMR0.
Código fuente
LIST P=16F886
INCLUDE P16F886.INC
ERRORLEVEL -302
__CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF
CBLOCK 0X20
ENDC
ORG 0X00
GOTO CONFIGURA
ORG 0X04
GOTO INTERRUPCION
ORG 0X05
INTERRUPCION COMF PORTB,F
MOVLW .7
MOVWF TMR0
BCF INTCON,T0IF
RETFIE
CONFIGURA CLRF PORTB
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISB
CLRF TRISB
BANKSEL OPTION_REG
MOVLW B'00000000'
MOVWF OPTION_REG
MOVLW B'10100000'
MOVWF INTCON
BANKSEL PORTB
CLRF TMR0
CLRF PORTB
INICIO GOTO INICIO
END
Copyright 2012 edwtron
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior.
Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
Free Documentation License".
Etiquetas:
16f886,
assembler,
compilar,
desborde,
ejemplo,
ensamblador,
frecuencia,
interrupcion,
microchip,
microcontrolador,
oscilador,
periodo,
PIC,
temporizador,
timer,
TMR0
Suscribirse a:
Entradas (Atom)