Professional Documents
Culture Documents
FIEC
Laboratorio de Microcontroladores
PRCTICA #5
Contadores
Alumnos:
Paralelo: 8
Grupo: 2
Fecha de Presentacin:
5/12/2014
Se desborda el TMR0
INTER
PORTB = PORTB + 1
Enceramos banderas
PROGRAMA 2
INICIO
Configuracin de puertos
PORTB y PORTC como salidas
digitales
Se carga en
OPTION_REG=00000111
INTER
Se incrementa las
unidades
No
Unidades = 9
Si
Si
Incrementa decenas
No
Decenas = 9
PROGRAMA 3
Inicio
PORTD=b00000001'
COUNTER = .20
TMR0 = 1
Si
PORTC = PORTC +1
TMR0 = 0
Externo
No
PROGRAMA 2
1. Usamos la directiva CBLOCK para variables a partir de 0x20H, las cuales son; contador,
unidades, uni_cod, dec_dod.
2. Se realiza el seteo de bancos y puertos.
3. Se configura PORTB, PORTC como salida.
4. Se encera las variables unidades y decenas.
5. Seteo del registro OPTION_REG.
6. Se selecciona el pre-escalador 256, con una frecuencia de 4MHz con lo que
obtendremos una interrupcin cada 10mS.
7. Se carga el TIMER0 con el valor .217 y el contador con 100.
8. Se habilitan las banderas de interrupciones en el registro INTCON.
9. Se ingresa el lazo mudo LOOP hasta que el TIMER0 se desborde y se ejecute la
subrutina.
PROGRAMA 3
1. Usamos la directiva CBLOCK para variables a partir de 0x20H, las cuales son; contador,
unidades, uni_cod, dec_dod, sel.
2. Se realiza el seteo de bancos y puertos.
3. Se configura PORTB, PORTC como salida.
4. Se encera las variables unidades y decenas.
5. Seteo del registro OPTION_REG.
6. Se selecciona el pre-escalador 256, con una frecuencia de 4MHz con lo que
obtendremos una interrupcin cada 10mS.
7. Se carga el TIMER0 con el valor .217 y el contador con 100.
8. Se habilitan las banderas de interrupciones en el registro INTCON.
9. Se ingresa el lazo mudo LOOP hasta que el TIMER0 se desborde y se ejecute la
subrutina.
p=16F887
P16F887.INC
;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887
-302
;Deshabilita mensajes de
;advertencia por cambio
bancos
0X020
;Cuenta 100 interrupciones
;registro de unidades
;Cdigo de 7 segmentos de unidades
;INICIO DE PROGRAMA
ORG
0x00
GOTO
MAIN
ORG
0x04
GOTO
INTERRUPCION
;Vector de RESET
;Vector de interrupcin
INTERRUPCION
decfsz
goto
movf
call
movwf
movf
movwf
INCF
movlw
subwf
btfss
goto
clrf
contador,f
Seguir
unidades,w
tabla
uni_cod
uni_cod,w
PORTB
unidades,f
.10
unidades,w
STATUS,2
cont
unidades
cont
movlw
movwf
.100
contador
Seguir
movlw
.217
movwf
bcf
RETFIE
TMR0
INTCON,T0IF
MAIN
;SETEO DE PUERTOS
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISB
CLRF
TRISB
;Selecciona el Bank1
;PORTB configurado como salida
PORTB
PORTB
unidades
.217
TMR0
.100
contador
;PROGRAMACION DE INTERUPCION
movlw b'10100000'
movwf INTCON
;Activa la interrupcin del TMR0
;MOSTRAR CERO INICIAL
clrw
call
tabla
movwf uni_cod
movf
uni_cod,w
movwf PORTB
INCF
unidades,f
Loop
nop
goto
Loop
; TABLA DE CONVERSION
tabla
ADDWF
RETLW
RETLW
0x06
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END
PCL,F
PARTE 2
;**********************************************************
;
CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOS
;
USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms(10x100)
;
PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 00-99
;**********************************************************
;
NOMBRE:
p5b_2d.asm
;
FECHA:
21/06/2010
;
VERSION:
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;**********************************************************
;
DESCRIPCION:
;Se trata de incrementar un contador cada segundo y mostrar
;su valor en dos displays. Uno para unidades y otro para
;decenas. El tmr0 se programa para que genere una
;interrupcin cada 0.01 seg. (10 mS) que se repetir 100
;veces con el objeto de activar el conteo cada 1000 mS.
;Use un reloj de 4MHz.
;**********************************************************
;DIRECTIVAS
LIST
INCLUDE
p=16F887
P16F887.INC
;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887
-302
;Deshabilita mensajes de
;advertencia por cambio
;bancos
CBLOCK
0X020
contador
;Cuenta 100 interrupciones
unidades
uni_cod
decenas
dec_cod
ENDC
;**********************************************************
;PROGRAMA
ORG
0x00
;Vector de RESET
GOTO
MAIN
ORG
0x04
;Vector de interrupcin
GOTO
Interrupcion ;Va a rutina de interrupcin
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.
Interrupcion
movf
unidades,w
call
tabla
movwf uni_cod
movf
uni_cod,w
movwf PORTB
movf
decenas,w
call
tabla
movwf dec_cod
movf
dec_cod,w
movwf PORTC
decfsz
contador,f
;Cuenta espacios de 10ms
goto
Seguir
;An, no son 100 interrupciones
INCF
unidades,f
;Ahora s 10x100=1000ms=1seg
movlw .10
subwf unidades,w
btfss STATUS,2
goto
cont
clrf
unidades
incf
decenas
movlw .10
subwf decenas,w
btfss STATUS,2
goto
cont
clrf
decenas
cont
movlw .100
movwf contador
Seguir
bcf
INTCON,T0IF
movlw .217
movwf TMR0
retfie
MAIN
;SETEO DE PUERTOS
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISB
CLRF
TRISB
CLRF
TRISC
;INICIALIZACION
BANKSEL
CLRF
CLRF
CLRF
CLRF
PORTB
PORTB
PORTC
unidades
decenas
;Selecciona el Bank1
;PORTB configurado como salida
;PORTC configurado como salida
;Selecciona el Bank0
;Borra latch de salida de PORTB
;Borra latch de salida de PORTC
;PROGRAMACION DE INTERRUPCION
movlw
b'10100000'
movwf
INTCON
;Activa la interrupcin del TMR0
movlw .100
;Cantidad de interrupciones a contar
movwf contador
;N de veces a repetir la interrupcin
Loop
nop
goto
Loop
; TABLA DE CONVERSION
tabla
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END
PCL,F
Parte 3
;**********************************************************
;
CONTADOR DE DOS DIGITOS MULTIPLEXADO CON DISPLAY DE
;
SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO
;
DE 10ms (10x100) PARA INCREMENTAR SU VALOR CADA
;
SEGUNDO DE 00-99
;**********************************************************
;
NOMBRE:
p5c_2dm.asm
;
FECHA:
21/06/2010
;
VERSION:
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;**********************************************************
;
DESCRIPCION:
;Se trata de incrementar un contador cada segundo y mostrar
;su valor en dos displays colocados en el puerto B usando la
;tcnica de multiplexacin. Uno para unidades y otro para
p=16F887
P16F887.INC
;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887
-302
;Deshabilita mensajes de
;advertencia por cambio bancos
CBLOCK 0X020
contador
;Cuenta 100 interrupciones
unidades
uni_cod
decenas
dec_cod
sel
ENDC
;**********************************************************
;PROGRAMA
ORG
0x00
;Vector de RESET
GOTO
MAIN
ORG
0x04
;Vector de interrupcin
GOTO
Interrupcion ;Va a rutina de interrupcin
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.
Interrupcion
movf
sel,w
;Se mueve a si mismo para afectar
bandera
btfss STATUS,2
;sel=0 refresca dig1; sel=1 refresca
dig2
goto
dig2
dig1
movf
unidades,w
call
tabla
movwf uni_cod
movf
uni_cod,w
bsf
PORTA,0
bsf
PORTA,1
movwf PORTB
bcf
PORTA,0
comf
sel,f
goto
dec
dig2
movf
decenas,w
call
tabla
movwf dec_cod
movf
dec_cod,w
bsf
PORTA,0
bsf
PORTA,1
movwf PORTB
bcf
PORTA,1
comf
sel,f
dec
decfsz
contador,f
goto
Seguir
interrupciones
INCF
unidades,f
movlw
subwf
btfss
goto
clrf
incf
movlw
subwf
btfss
goto
clrf
.10
unidades,w
STATUS,2
cont
unidades
decenas
.10
decenas,w
STATUS,2
cont
decenas
cont
movlw .100
movwf contador
Seguir
bcf
INTCON,T0IF
movlw ~.39
movwf TMR0
retfie
MAIN
;SETEO DE PUERTOS
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISA
CLRF
TRISA
CLRF
TRISB
;INICIALIZACION
BANKSEL
PORTA
CLRF
PORTB
CLRF
PORTC
clrf
clrf
clrf
;Selecciona el Bank3
;Selecciona el Bank1
;PORTA configurado como salida
;PORTB configurado como salida
;Selecciona el Bank0
PORTA
PORTB
unidades
decenas
sel
Loop
; TABLA DE CONVERSION
--------------------------------------------------------tabla
ADDWF
PCL,F
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END
PROGRAMA 2
PROGRAMA 3
7.- Conclusiones
8.- Recomendaciones
LIST
INCLUDE
p=16F887
P16F887.INC
;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887
-302
;Deshabilita mensajes de
;advertencia por cambio
;bancos
CBLOCK
0X020
contador
;Cuenta 100 interrupciones
unidades
uni_cod
decenas
dec_cod
disp
ENDC
;*********************************************************************
;PROGRAMA
ORG
0x00
;Vector de RESET
movlw .0
movfw disp
GOTO
MAIN
ORG
0x04
;Vector de interrupcin
GOTO
Interrupt
;Va a rutina de interrupcin
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.
Interrupt
movf
unidades,w
incf
disp,f
movwf uni_cod
movf
uni_cod,w
movwf
movf
incf
movwf
movf
movwf
decfsz
goto
INCF
movlw
subwf
btfss
goto
clrf
incf
movlw
subwf
btfss
goto
clrf
PORTB
decenas,w
disp,f
dec_cod
dec_cod,w
PORTC
contador,f
Seguir
unidades,f
.60
unidades,w
STATUS,2
cont
unidades
decenas
.60
decenas,w
STATUS,2
cont
decenas
cont
movlw .100
movwf contador
Seguir
bcf
INTCON,T0IF
movlw .217
movwf
TMR0
retfie
MAIN
;SETEO DE PUERTOS
BANKSEL
CLRF
CLRF
BANKSEL
CLRF
CLRF
ANSEL
ANSEL
ANSELH
TRISB
TRISB
TRISC
;INICIALIZACION
BANKSEL
CLRF
CLRF
CLRF
CLRF
PORTB
PORTB
PORTC
unidades
decenas
;Selecciona el Bank1
;PORTB configurado como salida
;PORTC configurado como salida
;Selecciona el Bank0
;Borra latch de salida de PORTB
;Borra latch de salida de PORTC
Loop
; TABLA DE CONVERSION
tabla
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END
PCL,F
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
;
;
;
;
;
;
;
;
;
;
; PCL + W -> W
; El PCL se incrementa con el
; valor de W proporcionando un
; salto
Retorna con el cdigo del 0
Retorna con el cdigo del 1
Retorna con el cdigo del 2
Retorna con el cdigo del 3
Retorna con el cdigo del 4
Retorna con el cdigo del 5
Retorna con el cdigo del 6
Retorna con el cdigo del 7
Retorna con el cdigo del 8
Retorna con el cdigo del 9
; Fin del programa fuente