Hola. ¿Cómo están? Llevo dos días buscando alternativas y soluciones en la web para un problema que me tiene muy mal.
Tal vez puedan ayudarme a encontrar qué estoy haciendo tan mal.
Necesito transmitir 8 bits por los pines de un PIC16F628A y para ello tengo la siguiente rutina:
Llamo a la rutina de la siguiente manera:
Uso esta parte para darme cuenta de que no decrementa correctamente contando los destellos del led que suman 256 antes de salir (encender el relé)
Debería contar 8 parpadeos del led y luego salir, pero cuenta hasta 256 y recién sale.
Las rutina de demora funcionan bien porque hice un test con un led y no fallan (la de 50 y la de 250 funcionan bien).
Pero el descuento de TOTALBIT no funciona.
También probé haciendo DECF TOTALBIT,1 y luego BTFSS STATUS,Z pero no funciona.
En la simulación con MPLAB no falla pero cuando lo paso al PIC ¡No funciona!
Cambié dos PIC pensando que podrían tener una falla interna.
Cambié de lugar la rutina para que el compilador la asigne a distintas porciones de memoria.
Ya no sé qué más probar. Me estoy volviendo loco.
¿Alguna idea?
Muchas gracias.
Disculpen, no sé subir el código para que se pueda leer, la verdad que así como está no te dan ni ganas de leer.
Tal vez puedan ayudarme a encontrar qué estoy haciendo tan mal.
Necesito transmitir 8 bits por los pines de un PIC16F628A y para ello tengo la siguiente rutina:
Código:
#INCLUDE <P16F628A.INC> ; Lista de etiquetas de microchip
__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_ON & _XT_OSC &_LVP_OFF
INT_VAR UDATA_SHR
TOTALBIT RES 1; EQU 0x16
Transmitir ;Rutina de Transmisión
movwf DatoTX ; Cargo el valor que viene en W para transmitir
clrwdt
bsf PORTB,2 ; Habilitar transmisión RS485 DE=1 RE=1
bcf PORTB,1 ; Bajo el nivel para indicar inicio de transmisión
movlw d'8' ; Para leer los 8 bits
movwf TOTALBIT
IniTX
Call DEMORA50 ; Espero 2 ciclos para
Call DEMORA50 ; indicar bit de inicio
CicloTX
bsf PORTB,3 ; transmitir un UNO(LED)
Call DEMORA250 ; Llamar al retardo entre bits
bcf PORTB,3 ; transmitir un CERO(LED)
Call DEMORA250 ; Llamar al retardo entre bits
rrf DatoTX ; Rotar a la derecha el byte (en CARRY esta el primer bit)
btfsc STATUS,C ; Carry es cero?
goto EsUNO ; No,es un uno
EsCERO
bcf PORTB,1 ; transmitir un CERO(DATO)
clrwdt
Goto SigBit
EsUNO
bsf PORTB,1 ; transmitir un UNO(DATO)
clrwdt
Goto SigBit
SigBit
decfsz TOTALBIT,1
goto CicloTX ; Faltan bits de transmitir
bsf PORTB,1 ; transmitir un UNO: linea en espera
bcf PORTB,2 ; Deshabilitar transmisión RS485, poner "en escucha"
clrwdt
bcf PORTB,3 ; Apagar led testigo de Tx
bsf PORTA,1 ; Encender relé
RETURN
Código:
movlw 0xAA ;Dato a transmitir es AA
Call Trasnsmitir
Código:
bsf PORTB,3 ; transmitir un UNO(LED)
Call DEMORA250 ; Llamar al retardo entre bits
bcf PORTB,3 ; transmitir un CERO(LED)
Call DEMORA250 ; Llamar al retardo entre bits
Las rutina de demora funcionan bien porque hice un test con un led y no fallan (la de 50 y la de 250 funcionan bien).
Pero el descuento de TOTALBIT no funciona.
También probé haciendo DECF TOTALBIT,1 y luego BTFSS STATUS,Z pero no funciona.
En la simulación con MPLAB no falla pero cuando lo paso al PIC ¡No funciona!
Cambié dos PIC pensando que podrían tener una falla interna.
Cambié de lugar la rutina para que el compilador la asigne a distintas porciones de memoria.
Ya no sé qué más probar. Me estoy volviendo loco.
¿Alguna idea?
Muchas gracias.
Disculpen, no sé subir el código para que se pueda leer, la verdad que así como está no te dan ni ganas de leer.