Autor Tema: Interrupciones con PICC  (Leído 6701 veces)

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

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Interrupciones con PICC
« en: 30 de Mayo de 2007, 07:21:40 »
 Hola compañeros. Alguien me podria decir como crear una interrupcion en PICC? Estoy trabajando con un codigo para transmitir y recibir por el periferico USART con el PIC16F871, pero no consigo que el programa salte a la interrupción, en primer lugar porque no se si el codigo de la subrrutina de interrupción es el correcto, ademas no consigo cambiar el valor de los flags RCIF y TXIF del registro de flags PIR1, por lo que es imposible que se produzca la interrupción. He leido en otro hilo que estos valores de flags no se pueden cambiar mediante simulación software? En ese caso, como puedo simular la transmisión y recepción? Gracias!!  :-)
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Interrupciones con PICC
« Respuesta #1 en: 30 de Mayo de 2007, 09:49:31 »
Para activar las interrupciones:

Código: C
  1. RCIE = 1;   //Recepcion
  2.     TXIE = 1;   //Transmision
  3.     PEIE = 1;   //Interrupcion de perifericos
  4.     GIE = 1;    //Interrupciones generales

Para el manejo de las interrupciones:

Código: C
  1. void interrupt Interrupciones(void)
  2.     {
  3.         if((RCIF)&(RCIE)){
  4.             RCIF = 1
  5.             //Codigo
  6.         }
  7.         if((TXIF)&(TXIE)){
  8.             TXIF = 1
  9.             //Codigo
  10.         }
  11.     }

Para simular supongo que usas el MPLAB, si es asi busca en la ayuda.  En el MPLAB 7.5: Help -> Topics -> MPLAB Sim
En el índice de la ayuda busca la palabra "UART" y mira la sección UART1 IO tab

Saludos.
Pereira - Colombia

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Interrupciones con PICC
« Respuesta #2 en: 30 de Mayo de 2007, 10:10:15 »
Traído desde PicManía

Template para el uso de la Interrupción RDA de la USART
 
   La interrupción RDA se produce cada vez que en la USART hay disponible un carácter para ser leído.
 
   El buffer de recepción de la USART del PIC 16F628 dispone de solo 2 bytes por lo que es importantísimo el descargarlo tal como se van recibiendo los caracteres, de esta forma evitamos el que se vean tristemente perdidos en el limbo serie.
 
   Este Template demuestra cómo recibir cada carácter que llega haciéndole eco desde la misma rutina de interrupción. Si necesitamos recoger muchos caracteres y nuestra rutina principal es larga y farragosa es interesante recibir mediante RDA los caracteres e irlos almacenando en un BUFFER más amplio para ser posteriormente tratados.
 
 
 

  Template para el uso de la Interrupción RDA de la USART   
 
Código: CSS
  1. #include <16f628.h> // Selecciona el PIC
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Opciones de configuración
  3. #use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
  4. #use standard_io(b)
  5. #use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) // Definición del RS232
  6.  
  7. char Keypress=' ';
  8.  
  9. #int_rda
  10. void serial_isr() {
  11.  
  12.   if(kbhit()){
  13.     Keypress=getc();
  14.     if(Keypress!=0x00){
  15.       putchar(keypress);
  16.       keypress=0x00;
  17.     }
  18.   }
  19. }
  20.  
  21. void main() {
  22.  
  23.   enable_interrupts(global);
  24.   enable_interrupts(int_rda);
  25.   printf("\r\n\Listen on RS232 (Int)\r\n");
  26.   do {
  27.   } while (TRUE);
  28. }



Mas complicado para recibir sobre un buffer con un 16F876 lo tienes en Procesador de comandos vía RS232 (con Buffer de recepción) tambien en PicMania.

Espero que te sirva.  :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Interrupciones con PICC
« Respuesta #3 en: 31 de Mayo de 2007, 07:57:55 »
 Gracias apañeros. La subrutina de interrupcion que yo tenia era con dos if al igual que el código de dhmejia pero solo con RCIF y TXIF como condiciones en los if, lo he modificado tal y como me expones dhmejia pero sigo sin conseguir que el programa principal salte a la interrupción, los bits de habilitación de interrupciones estan todos, pero nada, en el registro PIR1 los flags TXIF y RCIF siguen sin activarse..  :shock: Redpic tu código no usa el flag RCIF para detectar la recepción de un nuevo dato por la Usart?

Saludos. :-)
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Interrupciones con PICC
« Respuesta #4 en: 31 de Mayo de 2007, 08:17:29 »
... Redpic tu código no usa el flag RCIF para detectar la recepción de un nuevo dato por la Usart?

No, es el CSS el que se encarga de todo. Y va de lujo.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Interrupciones con PICC
« Respuesta #5 en: 31 de Mayo de 2007, 09:25:15 »
Asumo que estas trabajando en el picc de Hi-tech, te recomiendo que subas tu codigo para poder ver donde esta el problema.

El código de RedPic funciona solo con el picc de CCS, por eso es que no usa el flag RCIF en la interrupción.

saludos
Pereira - Colombia

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Interrupciones con PICC
« Respuesta #6 en: 31 de Mayo de 2007, 10:14:16 »
Opps  :oops: no me había dado cuenta: cierto, mi código solo es para el CCS  :cry:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Interrupciones con PICC
« Respuesta #7 en: 01 de Junio de 2007, 07:44:14 »
 Si, perdon, estoy usando el picc en el entorno mplab. Aqui os expongo el código, no se exactamente si la rutina de interrupción haría lo que se pretende.. pero lo mas importante es que no salta a ella, es decir que no se produce la interrupción. Disculpad que los comentarions no esten en castellano, pero dada la sencillez del código no creo que sean necesarios, no obstante preguntadme si no veis claro por que hago algo en concreto. Saludos!!


//Rebre y transmetre per interrupció
#include <stdio.h>
#include <pic16F87.h>


//Prototips de funció
void Init (void); //Inicialitza PSERIE i T1
void interrupt UART_ISR(void);

//Principal: superbucle-------------------------------------------
void main(void)
{
   Init();
   TRISB=0;
   PORTB = 1;
   TXREG = PORTB;
   //TRMT=0;
   RCIF=1; //Provoquem la primera transmissió
    while(1);
}

//Funcions:-------------------------------------------------------
void Init(void)
{
   //PIR1=0x00;
   EEIE=1;
   PEIE = 1;
    GIE = 1;
   RCIE=1;
   TXIE=1; //Activem interrupcions
   TXEN=1; //Activem el transmissor
   CREN = 1; //Activem el recetor
    TMR1L = 0x00; //Baudios
    TMR1H = 0xFF;
    TMR1ON = 1; //Activem el Timer 1
    TMR1CS = 0; //Timer 1 mode temporitzador Fosc/4, rellotge intern
    SYNC = 0; //Seleccionem mode de transmisió asíncron
}


//ISR USART-------------------------------------------------------

void interrupt UART_ISR(void)
{
   if((RCIF)&(RCIE)){
      TRISB=1; //Port B configurat com a port d'entrada
      PORTB=RCREG; //El que hem rebut ho pasem al PORTB
       RCIF = 1;
   }

   if((TXIF)&(TXIE)){
      TRISB=0; //Port B configurat com a port d'eixida
      TXREG=PORTB; //El que tenim al PORTB ho enviem
        TXIF = 1;
   }
}
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Interrupciones con PICC
« Respuesta #8 en: 01 de Junio de 2007, 10:16:49 »
No estas definiendo la velocidad a la que te estas comunicando y no estas inicializando los puertos de la USART, en el main estas seteando el bit RCIF y la verdad no se para que lo quieres hacer, creo que este bit solo se puede poner en cero.  Revisa en la carpeta Samples en donde se instaló el PICC que estan los archivos para manejar la USART de una manera muy sencilla. Tambien te recomiendo que nos expliques exactamente que quieres hacer porque no veo mucha lógica en tu código, en pocas palabras:

*A que velocidad quieres comunicarte
*Que es lo que el PIC debe recibir y que debe hacer con el dato recibido
*Que es lo que quieres transmitir

En el momento no tengo tiempo, pero apenas pueda pienso adaptar el código del maestro RedPic para mostrar el funcionamiento de la USART usando el compilador PICC de Hi-tech, apenas lo tenga lo subo al foro.

Saludos,
Pereira - Colombia

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Interrupciones con PICC
« Respuesta #9 en: 01 de Junio de 2007, 13:35:20 »
 El programa que me planteo en un principio es bien sencillo y de momento solo pretendo simular la transmisión/recepción de un solo caracter o valor. A partir de aqui ya ire avanzando hacia algo más practico, real y funcional. El programa como digo pretende de momento simular que se ha recibido un valor por el interfaz Usart, por ejemplo el valor 0x10, que entrará a través del registro RSR,de aqui internamente el PIC se lo pasa al registro RCREG y con mi codigo paso el dato al PUERTO B para su posterior manejo. El seteo de RCIF es para simular que el registro RCREG a recibido un dato y proceder a su lectura.  Respecto a la inicialización de la usart, en su momento si que puse #include "usart.h" pero me daba un error, ahora probando de nuevo no ha habido problema. Y por lo que respecta a la tasa de baudios, creo que esta se define en el usart.h aunque no estoy seguro de ello.
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Interrupciones con PICC
« Respuesta #10 en: 07 de Junio de 2007, 14:29:28 »
 Estoy intentando usar el ejemplo de usart que aparece en la carpeta samples, pero al compilar me da los siguientes dos errores:
                  undefined identifier: TRISC7
                  undefined identifier: TRISC6

que me salen al incluir en el codigo #include"usart.h". En el usart.h veo que define TRISC7 y TRISC8 para RX_PIN y TX_PIN, pero desconozco si tiene algo que ver. Alguno habeis probado este ejemplo o similar?

 :-)Saludos!!
En esta vida hay 10 clases de personas, las que saben binario y las que no.

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Interrupciones con PICC
« Respuesta #11 en: 07 de Junio de 2007, 14:52:05 »
Me imagino que el problema lo tienes en estas línes de código del archivo usart.h

Código: C
  1. #if defined(_16F87) || defined(_16F88)
  2.         #define RX_PIN TRISB2
  3.         #define TX_PIN TRISB5
  4. #else
  5.         #define RX_PIN TRISC7   //Aca te debe salir el error
  6.         #define TX_PIN TRISC6
  7. #endif

Si estas usando el mplab verifica que tienes definido correctamente el pic que estas usando (por configure -> select device) y cambia (aunque no creo que tanga nada que ver) la línea:
Código: C
  1. #include <pic16F87.h>
por
Código: C
  1. #include <pic.h>
Este archivo es general para todos los pics y funciona sin problemas siempre y cuando tengas seleccionado correctamente el pic que estas usando.

Si no solucionas el problema entonces borra las líneas que te estan generando el problema y deja solo lo que interesa para este pic en particular, te recomiendo que guardes el archivo usart.h original, la definición de los pines debería quedar asi:

Código: C
  1. #define RX_PIN TRISB2
  2. #define TX_PIN TRISB5

Te recuerdo que esto es solo para este pic en particular, debes verificar siempre en el datasheet del pic que usas cuales con los pines de la usart para que no tengas problemas en el futuro.

saludos
Pereira - Colombia

Desconectado carafaelet

  • PIC12
  • **
  • Mensajes: 61
Re: Interrupciones con PICC
« Respuesta #12 en: 08 de Junio de 2007, 22:02:14 »
 Gracias dhmejia, no ha hecho falta hacer un nuevo usart.h con la eliminación de las lineas que me dan problemas sino que ha sido suficiente cambiando #include <pic16F87.h> por #include <pic.h>. Eso si en select device si que tengop seleccionado pic 16F871 en concreto. Me imagino que el problema quizá venga porque el usart.h esta definido de forma general para todos los pics..

Saludos
En esta vida hay 10 clases de personas, las que saben binario y las que no.


 

anything