Programa en assembler correcto?

Mi segundo programa para PIC, y ya no funciona... :cry:

Intenté meter una delay para crear un tiempo y que el LED vaya encendiendo y parando, pero no me funciona. Alguna idea de que puede estar mal?


(lo siento, los comentarios estan en catalán, supongo que son fáciles de entender, tampoco dicen nada de otro mundo)

p=16F84A



;assignacions

STATUS EQU 03h
TRISA EQU 05h
TRISB EQU 06h
PORTA EQU 05h
PORTB EQU 06h
dcount EQU 60h


bsf STATUS,5 ;entro al bloc 1
movwf B'00000' ;tot sortides
movlw TRISA
movwf B'00000000' ;tot sortides
movlw TRISB
bcf STATUS,5 ;torno al bloc 0



org 0x07

INICI bsf PORTA,0 ;encenc el LED
call DELAY ;passa el temps
bcf PORTA,0 ;paro el LED
goto INICI ;torno a comencar

DELAY movlw 0x56 ;Nombre qualsevol per restar
movwf dcount ;carrego dcount
dloop decfsz dcount,dcount ;resto 1 de dcount i el resultat el poso a dcount
goto dloop ; si el resultat no és zero torno a restar 1
return ; torno al programa principal


end ;final
 
Lo primero que veo mal es que cuando enciende el led llama a la demora luego apaga y rapidamente (3 uS por ejemplo)vuelve a encender, es decir necesita meter otra llamada de demora luego de apagar el led y antes del goto.

Segundo, no se que frecuencia de reloj usas pero me parece que es muy poca demora, por ejemplo con 4MHz de reloj con esos valores es una demora de menos de 1 mS, el led prende y apaga a una frecuencia que no se ve, generalmente se usa una demora en cascada con 2 o 3 registros que descontar.
 
RBX374

He estado viendo tu subrutina y el led se te queda prendido.
El problema radica en que tienes una demora de (N*3T+1T) después que lo prendes y solo de 3T apagado.
La solución es volver a llamar al retardo justo después que lo apagas, quedaría así:

org 0x07

INICI bsf PORTA,0 ;encenc el LED
call DELAY ;passa el temps
bcf PORTA,0 ;paro el LED
call DELAY
goto INICI ;torno a comencar


Pruébalo y comenta.
 
Atrás
Arriba