Autor Tema: Interrupciones en ccs  (Leído 2120 veces)

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

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
Interrupciones en ccs
« en: 27 de Junio de 2005, 11:44:00 »
Buenas a tos:

Tengo un problemilla con las interrupciones. Utilizo el pic18f452, el cual me permite 3interrupciones externas, de las que utilizo 2. El problema que tengo es que utilizo un lector para leer el codigo de una tarjeta, una de las interrupciones me detecta el strobe, el cual me va a permitir saber que el lector esta leyendo datos, y la otra la quiero utilizar para detectar un flanco de reloj, es decir, en el momento de flanco de subida el lector lea el dato.

Lo que me ocurre es que al habilitar las 2 creo que la que uso para detectar el flanco de reloj no me esta funcionando. Yo creo que es porque al mismo tiempo se esta ejecutando la que me permite saber que el lector esta leyendo datos. Alguien me puede aconsejar una solucion para esto y que pueda usar las interrupciones con las misiones que os he comentado?

Muxas Gracias. 1saludillo

Desconectado gONzAO

  • PIC10
  • *
  • Mensajes: 38
Re: Interrupciones en ccs
« Respuesta #1 en: 30 de Abril de 2007, 08:32:32 »
Hola a todos:
Tengo problemas en el envío por el puerto serie con CCS.
El objetivo es manejar tanto el envio como la recepción por interrupción. He simplificado el programa para poder encontrar el fallo. Por sondeo/polling todo guay pero eso, quiero que al enviar me genere la interrupción.
Veo que el problema está ahí, porque si tengo TXIE a '1' y transmite , él pone a '1' TXIF y debería lanzar la interrupción.
El código es el siguiente:
Código: [Seleccionar]
#DEVICE PIC16F876A
#include <PIC16F876A>
/*------- g0n -------*/
#fuses HS,NOWDT

int transmitido=1;
int recibido=0;

char dato=0;

#int_RDA   // interrupción caracter_recibido
RDA_isr(){
   //RCIF=0;   // se borra automáticamente al leer
   dato=RCREG;
   recibido=1;   // activa flag
}
#int_TBE
TBE_isr()
{
   TXIE=0;
   //TXIF=0;   // se borra automaticamente al cargar un nuevo dato para enviar
   transmitido=1;
}   
 
void main()
{
   // configuro comunicaciones serie
   SPBRG = 0x81;  //-- 9600 baudios (con cristal de 20MHz)
   TXSTA = 0x24;  //-- Configurar transmisor
   RCSTA = 0x90;  //-- Configurar receptor
   // habilito int recepcion/transmision uart
   //PIE1 |= 0x30;   // habilito Int rx y tx
   RCIE = 1;
   TXIE = 0;
   GIE = 1;
   PEIE = 1;
   
   while(1)
   {
   if(recibido)
   {
      recibido=0;
      if(transmitido)
      {
         TXREG=dato;
         TXIE=1;
         transmitido=0;
      }
   }
 
     
   }//while(1)     
     
}
Ahora básicamente es un ECO. Me da que falla en #int_TBE  porque la primera vez repite la letra pero luego ya no. Eso es que no me marca transmitido a 1. Puede que esté equivocado, lo de #int_TBE  es lo más parecido a lo que necesito no?, una interrupción cuando se ha enviado el dato, al igual que #int_RDA que es cuando se recibe.

A ver qué me podéis contar.
En resumen es: ¿cómo se maneja la interrupción de recepción del puerto serie de la usart con CCS?

Gracias, gONzAO