Autor Tema: 16F876: Problema serio con la interrupcion de recepcion de la USART  (Leído 3571 veces)

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

Desconectado bAIthrO

  • PIC10
  • *
  • Mensajes: 7
Hola, Picmaniacos!!!

Trabajo con el Pic 16F876, un LCD 2x16 y con la USART para recibir datos del PC por el  puerto serie.

Utilizo la interrupcion de recepcion de la USART para actualizar valores en el LCD.

El vector de INICIO funciona a la perfección. Configuro todos los registros, habilito la interrupcion de recepcion de la USART, visualizo valores en el LCD, etc, etc...

La secuencia del programa es la siguiente:

Inicio -> configuracion registros -> Visualizar LCD -> Bucle a la espera de interrupcion

El problema está en el Vector de interrupción.

1. Si escribo algo tan sencillo como:

Org 0x0004
    bsf PORTB,2
retfie

Funciona perfectamente. Se visualiza el LCD hasta que la USART recibe un dato. Cuando cargo valor desde PC, salta a la interrupcion y se enciende un LED.


2. Aquí viene el problema. En el momento que introduzco cualquier otro código en el vector de interrupción, se queda colgado. Ya sea una función, usar el TIMER0... cualquier cosa.

Y lo que es más extraño, no da tiempo ni siquiera a visualizar el LCD, contenido en el vector de Inicio.

¡¡Es como si entrara todo el rato a la rutina de interrupción!! Estoy seguro de que sólo entran datos a la USART cuando yo los mando.

Me estoy volviendo loco, señores. Agradezco cualquier ayuda.

Gracias.

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
RE: 16F876: Problema serio con la interrupcion de recepcion de la USART
« Respuesta #1 en: 26 de Octubre de 2005, 11:45:00 »
hola compi, no conozco la programacion en asemble de los pic, ya que trabajo mejor en C, pero con mis conocimientos en asemble de otros micros, lo que se suele hacer es lo siguiente:

vector de interrupcion

1.- desactivo interrupciones
2.- borro flag de la interrupcion en ejecucion
3.- hago as cosas que tengo que hacer en la interrupcion
4.- habilito interrupciones
5.- retorno de interrupcion

por lo que he visto tienes una carga en un registro o puerto y retornas de interrupcion si no me equivoco, no deberas borrar la bandera de interrupcion? para que se vuelva a ejecutar la interrupcion y el micro no se quede volviendo a la interrupcion cada vez que sales de ella?


Espero que te sirva de ayuda. Un saludo.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: 16F876: Problema serio con la interrupcion de recepcion de la USART
« Respuesta #2 en: 26 de Octubre de 2005, 13:03:00 »
bueno en ASM, la ejecucion de la rutina de interrupcion desactiva automaticamente el bit GIE (Global Interrupt Enable) que es el bit general de habilitacion de las interrupciones, sin embargo, el xIF que vendria a ser el dispositivo que genero la interrupcion no es desactivado (porq se supone que el programador la usara para identificar el origen de la interrupcion) esto debe hacerse manualmente mediante un bcf, veo q en tu codigo no lo haces y es por ello que se keda... al entrar en la rutina de interrupcion el flag sigue activo por lo que al usar retfie la interrupcion es detectada inmediatamente de nuevo (sin verificar la condicion que la genero) kedandose en un bucle infinito.


Nota xIF representa todo el bloque de flags de interrupcion (RBIF, TXIF,....)

Desconectado bAIthrO

  • PIC10
  • *
  • Mensajes: 7
RE: 16F876: Problema serio con la interrupcion de recepcion de la USART
« Respuesta #3 en: 26 de Octubre de 2005, 18:58:00 »
Muchísimas gracias a los dos por intentar ayudarme con el problema. Creo que no me explicado del todo bien.

- Sé que el vector de interrupción desactiva las interrupciones y globales y con el retfie las vuelve a activar (GIE)

- Sé que antes del retfie es necesario borrar el flag de la interrupción correspondiente para que no entre continuamente al vector de interrupción.

Si la rutina de interrupción es sencilla, la cosa funciona perfectamente. Ejemplo

org 0x0004
bsf PORTC,2
bcf PIR1,RCIF
retfie

El programa principal llega hasta al bucle final y permanece a la espera de que llegue a la interrupcion. Cuando llega la interrupción, la ejecuta y vuelve al bucle hasta que no se de otra interrupcion.

Hasta aquí, bien. Mi problema es el siguiente:

Si hago la rutina de interrupción un poco más compleja, el programa principal no llega hasta el bucle final a la espera de la interrupcion. No sé por qué razón, salta directamente a la interrupción y se queda colgada.

Sé que es dificil de entender, pero no sé que puede pasar.


Org 0x0000
goto Inicio


Inicio


;------CONFIGURACIÓN DE LOS PUERTOS-------------


      bcf STATUS,RP0    ; Banco 0
      clrf PORTA       ; Inicializa PUERTO A borrando latches de salida

      bsf STATUS,RP0    ; Pasa al Banco 1.
      
      movlw 0x06      ; Configura todos los pines del PUERTO A como digitales
      movwf ADCON1

      movlw 0x00       ; Puerto A como salidas
      movwf TRISA

      movlw 0x00   
      movwf TRISB     ; Puerto B como salidas
      
      movlw 0x80  ; Configuracion del PUERTO C (RX como entradas, TX,SD0,SCK,LED como salidas)
      movwf TRISC


;-------CONFIGURACIÓN DE LOS REGISTROS USART-------

      ; Seguimos en el Banco 1

      movlw 0x19 ; Valor decimal, segun tabla para trabajar SPBGR a 9.600 con 4 Mhz
      movwf SPBRG ; BRGH a 9.600 baud

      bsf TXSTA,BRGH ; Bit BRGH del registro TXSTA a 1 (modo alta velocidad)
      bcf TXSTA,SYNC ; Bit SYNC a 0 (Modo Asíncrono)

      bsf TXSTA,TXEN ; Habilitada transmision.

      bcf STATUS,RP0 ; Se accede al banco 0

      bsf RCSTA,SPEN ; Habilitado Puerto serie
      bsf RCSTA,CREN ; Habilitada recepción (Recepcion continua)



;------ CONFIGURACION INTERRUPCIONES------------------------


      bsf STATUS,RP0; Banco 1
      bsf PIE1,RCIE; Habilita interrupcion de recepcion de USART
      bcf STATUS,RP0; Banco 0      
      

      BSF INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
      BSF INTCON,PEIE


Acabar   NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      goto   Acabar      ;Bucle infinito
                 

                END

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: 16F876: Problema serio con la interrupcion de recepcion de la USART
« Respuesta #4 en: 26 de Octubre de 2005, 22:22:00 »
Escrito originalmente por bAIthrO
Muchísimas gracias a los dos por intentar ayudarme con el problema. Creo que no me explicado del todo bien.

- Sé que el vector de interrupción desactiva las interrupciones y globales y con el retfie las vuelve a activar (GIE)

- Sé que antes del retfie es necesario borrar el flag de la interrupción correspondiente para que no entre continuamente al vector de interrupción.

Si la rutina de interrupción es sencilla, la cosa funciona perfectamente. Ejemplo

org 0x0004
bsf PORTC,2
bcf PIR1,RCIF
retfie

El programa principal llega hasta al bucle final y permanece a la espera de que llegue a la interrupcion. Cuando llega la interrupción, la ejecuta y vuelve al bucle hasta que no se de otra interrupcion.

Hasta aquí, bien. Mi problema es el siguiente:

Si hago la rutina de interrupción un poco más compleja, el programa principal no llega hasta el bucle final a la espera de la interrupcion. No sé por qué razón, salta directamente a la interrupción y se queda colgada.

Sé que es dificil de entender, pero no sé que puede pasar.


Org 0x0000
goto Inicio


Inicio


;------CONFIGURACIÓN DE LOS PUERTOS-------------


      bcf STATUS,RP0    ; Banco 0
      clrf PORTA       ; Inicializa PUERTO A borrando latches de salida

      bsf STATUS,RP0    ; Pasa al Banco 1.
      
      movlw 0x06      ; Configura todos los pines del PUERTO A como digitales
      movwf ADCON1

      movlw 0x00       ; Puerto A como salidas
      movwf TRISA

      movlw 0x00   
      movwf TRISB     ; Puerto B como salidas
      
      movlw 0x80  ; Configuracion del PUERTO C (RX como entradas, TX,SD0,SCK,LED como salidas)
      movwf TRISC


;-------CONFIGURACIÓN DE LOS REGISTROS USART-------

      ; Seguimos en el Banco 1

      movlw 0x19 ; Valor decimal, segun tabla para trabajar SPBGR a 9.600 con 4 Mhz
      movwf SPBRG ; BRGH a 9.600 baud

      bsf TXSTA,BRGH ; Bit BRGH del registro TXSTA a 1 (modo alta velocidad)
      bcf TXSTA,SYNC ; Bit SYNC a 0 (Modo Asíncrono)

      bsf TXSTA,TXEN ; Habilitada transmision.

      bcf STATUS,RP0 ; Se accede al banco 0

      bsf RCSTA,SPEN ; Habilitado Puerto serie
      bsf RCSTA,CREN ; Habilitada recepción (Recepcion continua)



;------ CONFIGURACION INTERRUPCIONES------------------------


      bsf STATUS,RP0; Banco 1
      bsf PIE1,RCIE; Habilita interrupcion de recepcion de USART
      bcf STATUS,RP0; Banco 0      
      

      BSF INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
      BSF INTCON,PEIE


Acabar   NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      goto   Acabar      ;Bucle infinito
                 

                END


Lo tienes asi como lo escribiste?? con un org 0x04 Y LUEGO un org 0x00??? si es asi es alli dond esta el problema, lo ideal seria:

Codigo:

   org   0x00
   goto   inicio
   org   0x04
rutina_interrupcion
   ...
   ...
   retfie

inicio   ...
   ...
   ...
   end


Desconectado bAIthrO

  • PIC10
  • *
  • Mensajes: 7
RE: 16F876: Problema serio con la interrupcion de recepcion de la USART
« Respuesta #5 en: 27 de Octubre de 2005, 06:22:00 »
No, no. Lo tengo como tú dices. Lo normal.

A fuerza de ir borrando porciones de código he visto que el problema viene de la escritura de caracteres especiales CG RAM en el LCD.

Creo que esa era la fuente de mis problemas. Estoy con ello ahora mismo.

Gracias.


 

anything