Hola a todos.
Tengo un problema con la comunicación serie de mi PIC 16F84A (que no tiene USART) usando un MAX232 conectado al ordenador.
El caso es que el pin 12 del MAX232 (TX del puerto 1) lo tengo conectado al pin 6 del PIC (RB0). Lo que quiero es que cuando la señal pase a 0 se genere una interrupción y empieze a leer los bits que he enviado desde el hyperterminal (9600 bps 8N1).
Sin embargo en la rutina de la interrupción, cuando salta y procedo a leer los bits siempre recibo 0xFF y no sé que puede ser. He estado buscando en el foro y el único mensaje que he encontrado ha sido este, sin embargo no he encontrado a primera vista ninguna diferencia de pasos a seguir respecto a mi código:
http://www.todopic.com.ar/foros/index.php?topic=6106.0Este es el código que uso:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
#DEFINE RX PORTB,0
#DEFINE TX PORTB,1
CBLOCK 0x0C
gW
gSTATUS
gREGA
gREGB
ENDC
ORG 0
goto inicio
ORG 4
; Salvamos registros
movwf gW
swapf STATUS,W
movwf gSTATUS
movf PORTA,W
movwf gREGA
movf PORTB,W
movwf gREGB
bcf STATUS, RP0
;--------------------
btfss INTCON,INTF
goto finINT
btfsc RX
goto finINT
call recibeByte
call imprimeCaracter ; en W ya tenemos el caracter devuelto por recibeByte
finINT
; Restauramos registros
movf gREGB,W
movwf PORTB
movf gREGA,W
movwf PORTA
swapf gSTATUS,W
movwf STATUS
swapf gW,F
swapf gW,W
bcf INTCON,INTF
;--------------------
retfie
inicio
bsf STATUS, RP0
bsf RX
bcf TX
bcf OPTION_REG,INTEDG
bcf STATUS, RP0
call inicializaLCD4bits
movlw b'10010000' ; GIE e INTE
movwf INTCON
bucle
sleep
;btfsc RX
;goto bucle
;call Retardo_20micros ;(para simular el tiempo que tarda el ISR hasta llegar a recibeByte)
;call recibeByte
;call imprimeCaracter
goto bucle
CBLOCK
byte
contador
ENDC
recibeByte
movlw d'8'
movwf contador
call Retardo_50micros
otro
call Retardo_100micros
bcf STATUS,C
btfsc RX
bsf STATUS,C
rrf byte,F
decfsz contador,F
goto otro
movf byte,W
return
INCLUDE "NUMEROS.INC"
INCLUDE "LCDLIB.INC"
INCLUDE "RETARDOS.INC"
END
EL código que recibe los bits funciona bién, puesto que si comento
movlw b'10010000' ; GIE e INTE
movwf INTCON
y cambio
sleep
;btfsc RX
;goto bucle
;call Retardo_20micros ;(para simular el tiempo que tarda el ISR hasta llegar a recibeByte)
;call recibeByte
;call imprimeCaracter
goto bucle
por
;sleep
btfsc RX
goto bucle
call Retardo_20micros ;(para simular el tiempo que tarda el ISR hasta llegar a recibeByte, no es necesario)
call recibeByte
call imprimeCaracter
goto bucle
entónces no usa la interrupción y recibe correctamente los bits.
Las funciones que uso externas son:
inicializaLCD4bits: inicializa el LCD a modo de 4 bits
imprimeCaracter: imprime el caracter que esta en W al LCD
Retardo_20micros: espera 20 microsegundos
Retardo_50micros: espera 50 microsegundos
Retardo_100micros: espera 100 microsegundos
Gracias a todos por adelantado. Un saludo.