TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Correia en 07 de Julio de 2011, 20:42:55
-
buenas a todos me inicie en la programacion de los pic o microcontroladores y quize empezar por assembler, hice una programacion para prender un led con un interruptor y que cuando este encendido venga un retardo de un segundo se apague y vuelva a prender y asi indefinidamente hasta que se pulse de nuevo el interruptor, la cosa es cabelleros que no me arranca y me tiene frustado aqui dejo la programacion aver quien me ayuda
;practica usando el tmr0 como retardo de tiempo
;----------------------------------------------
;pic=16f84
;osc=XT
;WDT= off
;oscilador; 4MHz
;Correia "programas de practica"
; pulsador ingresando por porta,0 con salida de varios led por el portb con retardo
;**la programacion no tiene el retardo para los antirebotes**
;------ variables-------------
list p=16F84
radix hex
porta equ 0x05
portb equ 0x06
intcon equ 0x0B
tmr0 equ 0x01
regopt equ 0x01
trisa equ 0x05
trisb equ 0x06
contador equ 0x0d
status equ 0x03
;------configuracion de puertos----------
reset org 0x00
goto inicio
org 0x05
inicio bsf status,5
movlw b'11111' ;porta sera entrada
movwf trisa
clrf trisb
movlw b'11000111' ;asignado maximo valor del prescaler, y el temporizador se incrementara con el flanco ascendente
movwf regopt ;registro option de registros especificos
bcf status,5
clrf tmr0
clrf portb
;--------------bucle--------------------
bucle btfsc porta,0 ; el interruptor se pulso es ¿0?
goto apagar ;el interruptor no se pulso
prender movlw b'11111111' ;cargo los valores
movwf portb ;muevo w con el valor cargado a portb que esta como salida y algunos led prenderan y otros no
call retardo ;llamo a la subrutina de retardo
clrf portb ;al terminar la subrutina, apago todo los led
call retardo ;llamo al retardo de nuevo
goto bucle
;---------------retardo------------------
retardo movlw 16
movwf contador ;cargo contador con el 16 cargado en w por que quiero que se decremente despues 16 veces
retardo1 movlw b'00000000' ; la carga maxima para el timer0 es 255, lo cargo con .0 por que quiero que haga 255 ciclos ;de conteo.
movwf tmr0
bcf intcon,2 ;pongo 0 el bit toif que me notifica cuando el timer0 se desborda
repetir btfss intcon,2 ;compruebo si el flag toif esta en 1(significa que el tmr0 se desbordo) , si es asi salto a "goto ;repetir
goto repetir
decfsz contador,1 ;comienza a restar contador-1 y lo guarda en el mismo registro contador, cuando llegue a "0" saltara a "return"
goto retardo1 ; inicio todo el ciclo de nuevo hasta que contador llegue a 0
return ;el retardo calculado es de 1 segundo
;---------apagar-------------
apagar clrf portb ;apaga todos los led conectados a la salida del portb
goto bucle
;----------------------------
end
-
Que es realmente lo que sucede ? no te funciona la simulación ? o no hace lo que tu quieres ?
Porque viendo el archivo el parpadeo solo se produce una vez y hasta que no vuelvas a pulsar
el switch no comenzará otra vez y así sucesivamente.
Saludos
-
Hola Correia, siento no poder revisar mas a fondo el programa en este momento ya que estoy en el curro, pero por lo que veo muy por encima es que tienes una mal configuracion del micro.
Lo primero que veo es el regopt y el TMR0 la forma correcta seria quitar los dos y poner TMR0_OPT EQU 0x01.
Lo segundo es que tienes trisa equ 0x05 y deberia de ser 0x85 ya que esta en el banco 1 y lo mismo con trisb deberia de ser 0x86.
Otra cosa es que debes tener en cuenta que no es lo mismo temporizar un segundo con simulacion que en la vida real, deberias bajar el tiempo de la temporizacion para la simulacion para saber si te funciona y simular el segundo en la vida real.
-
Muy buenas, ya se que es una tontería pero en proteus has conectado el pin4 (MCRL) a vpp?
Por cierto que compilador usas?
Saludos