Autor Tema: PIC 16F84, RS232 e interrupcion de RB0  (Leído 2935 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sistemasorp

  • PIC10
  • *
  • Mensajes: 28
PIC 16F84, RS232 e interrupcion de RB0
« en: 06 de Diciembre de 2006, 16:46:31 »
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.0

Este es el código que uso:

Código: [Seleccionar]
__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
Código: [Seleccionar]

movlw b'10010000' ; GIE e INTE
movwf INTCON
y cambio
Código: [Seleccionar]
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
Código: [Seleccionar]
;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.
« Última modificación: 06 de Diciembre de 2006, 16:54:21 por sistemasorp »

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: PIC 16F84, RS232 e interrupcion de RB0
« Respuesta #1 en: 07 de Diciembre de 2006, 00:08:55 »
Hola sistemasorp , de nuevo yo... me parece que el problema está por el lado de como tratás la interrupción, cuando llega un flanco descendente y activa la interrupción, (en el primer bit de start de la transmisión), deberías apagar las interrupciones, poniendo un 0 en el GIE, y luego de tratar la int., deberías volverlo a 1, sin olvidar de reponer a 0 el flag del INT.
Espero haberte ayudado. Exitos. :-/

Desconectado sistemasorp

  • PIC10
  • *
  • Mensajes: 28
Re: PIC 16F84, RS232 e interrupcion de RB0
« Respuesta #2 en: 07 de Diciembre de 2006, 04:27:37 »
Hola sistemasorp , de nuevo yo... me parece que el problema está por el lado de como tratás la interrupción, cuando llega un flanco descendente y activa la interrupción, (en el primer bit de start de la transmisión), deberías apagar las interrupciones, poniendo un 0 en el GIE, y luego de tratar la int., deberías volverlo a 1, sin olvidar de reponer a 0 el flag del INT.
Espero haberte ayudado. Exitos. :-/

Hola delirio

Puedo estar equivocado, pero me suena que cuando se genera una interrupción se desactiva el bit del GIE, y cuando se usa retfie se vuelve a activar solo.

http://usuarios.lycos.es/sfriswolker/pic/ocho/ochocuatro.htm

Un saludo.

Deimos

  • Visitante
Re: PIC 16F84, RS232 e interrupcion de RB0
« Respuesta #3 en: 11 de Diciembre de 2006, 07:21:13 »
GIE pasa a cero automáticamente cuando hay una interrupción, pero hay que ponerlo a 1 por software.

La interrupcion la tratas, y posteriormente pones GIE a uno para desenmascarar el resto de interrupciones. Lo ke te puede estar dando problemas es que no salvas ni el PCL, ni el STATUS, ni el W cuando salta la interrupcion. Hay que guardar el ultimo estado de maquina en el momento que salta la interrupcion, y restablecer la maquina una vez acabas de servir la interrupcion.

Espero haberte sido de ayuda

Dews

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: PIC 16F84, RS232 e interrupcion de RB0
« Respuesta #4 en: 11 de Diciembre de 2006, 07:28:02 »
Hola.

Por lo que veo salva W y el STATUS.
¿Para que guardas el PORTA y el PORTB al ingresar a la interrupcion y los restauras antes de salir de la misma?
¿Acaso necesitas que el estado de los puertos vuelvan al estado que tenian antes de la interrupcion?

Efectivamente el retfie es "Return From Interrupt" y es un return + activacion del bit INTCON,GIE.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Deimos

  • Visitante
Re: PIC 16F84, RS232 e interrupcion de RB0
« Respuesta #5 en: 11 de Diciembre de 2006, 09:58:32 »
El estado de los puertos no lo has de guardar, ya que los puertos se componen de básculas D, con lo que si no cambias la entrada de la báscula, no cambiará la salida. Solo guarda el estado de los puertos en el caso que en el servicio de rutina de interrupcion hayas tocado los puertos, y al volver de la intrr necesitas que estén como antes de la intrr. Si no es tu caso, no hace falta que guardes los puertos, por los biestables que te dije antes.

Por lo que veo, reestableces INTF cuando sales de la intrr. Tu problema entonces, lo de recibir solo 0xFFh no te viene de las intrr. Puede que sea problema de velocidad, de bit de paridad, startbit, .... parece más de protocolo que de intrr.

Suerte