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 bitsLas 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.
 
   
				 
						 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		