Autor Tema: Duda usart  (Leído 2078 veces)

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

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Duda usart
« en: 01 de Noviembre de 2015, 10:16:10 »
Hola amigos les presento una duda que nunca pude aclarar.

Qué pasa cuando entra un dato por la USART y justo en ese momento no puedo atender la interrupción e inmediatamente entra otro dato más...?

El pic tiene algún  buffer donde retiene el primer byte recibido? O es un dato perdido?

Saludos para todos!

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Duda usart
« Respuesta #1 en: 01 de Noviembre de 2015, 10:20:36 »
todo depende del micro, puedes hacer uso del DMA si tiene.

pero cuando hay comunicaciones de por medio, una interrupción solo puede ser interrumpida por otra de mayor preferencia, por lo tanto ten cuidado al establecer las prioridades y sin problemas.

¿que solo tienes un vector de interrupción? hay ya tendrías que jugar un poco mas, es por cosas como esta por lo que no deben existir delays ni while en los programas, para evitar que se dejen de atender cosas como las comunicaciones.

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda usart
« Respuesta #2 en: 01 de Noviembre de 2015, 10:58:40 »
Bueno creo que juaperser respondio bien

Algunos micros solo tienen 1 lugar en el buffer de recepcion, por lo cual si llega otro dato y sobreescribe el anterior se activa un bit de Overrun, y si, es perdido. Ejemplo el 16F628 tiene este bit:
OERR: Overrun Error bit

Otros micros poseen en cambio 2 o mas posiciones de buffer, los PIC18 que vi algunos llegan a 3 lugares.

Hay otros errores mas sobre la UART pero que no tienen nada que ver con el tema.

Si usas interrupciones no deberias tener problemas, como una interrupcion no debe durar demasiado (deberia ser lo mas rapido posible), si tenes otra actuando entonces se terminaria y volveria a entrar antes que llegue otro dato, ya que la comunicacion es algo lento.

Soluciones ya las nombro juaperser:
Algunos micros poseen DMA y lo podes activar para que apenas llegue un dato lo mueva a una posicion de memoria. Sin necesidad de ejecutar instrucciones para eso.
Otros micros poseen prioridades de interrupcion, el mas simple es el PIC18 con 2 lugares, 0x08 para el alta prioridad, y 0x18 para baja prioridad.
O directamente hacer las interrupciones como se deben, cortas, sin nada que las mantenga ahi en el tiempo.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re:Duda usart
« Respuesta #3 en: 01 de Noviembre de 2015, 11:09:19 »
Muchachos Muchísimas gracias por su pronta respuesta

El pic que estoy por usar es el PIC18F26K22 y lo uso ya que tiene 2 USART. Por lo que veo en el datasheet no posee DMA.

Todavía no me he puesto de lleno con el código pero tengo bien en claro que durante las instrucciones no debe haber delays.

El problema es que nunca he trabajado con 2 USART.

Por la USART1 hay mucho trafico de datos. leo datos constantemente y por ende una interrupción tras otra. Guardo en memoria lo que necesito y...

Y por la USART2 mediante poleos de un coordinador adquiero todo lo que me interesa de lo recibido por la USART1.

- En que parte del datasheet puedo ver cuantos bytes guarda mi micro? No lo he podido encontrar.
- Como asignar prioridades a las interrupciones ?
- En caso de que el micro tenga un buffer de datos que ingresan...  cómo los recupero los que fué guardando? Saludos...

Saludos cordiales desde Santa Fe - Argentina!!!
« Última modificación: 01 de Noviembre de 2015, 11:20:26 por elfrancho »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda usart
« Respuesta #4 en: 01 de Noviembre de 2015, 11:50:19 »
Citar
- En que parte del datasheet puedo ver cuantos bytes guarda mi micro? No lo he podido encontrar.
Seccion UART al comienzo:

Citar
The EUSART module includes the following capabilities:
Two-character input buffer
• One-character output buffer
Esto es por cada modulo UART

Sino podes ver el diagrama en la siguiente pagina y notaras que hay 2 cuadritos sobre el RCREGx

Citar
- Como asignar prioridades a las interrupciones ?
Depende del lenguaje que estes usando

XC8:
http://microchip.wikidot.com/faq:31

Activaras las interrupciones como sean debido en los registros,

CCS:
No se

ASM:
Simple, ya dije las posiciones de memoria de los vectores de interrupcion, solo habilitar los registros correspondientes.

Citar
- En caso de que el micro tenga un buffer de datos que ingresan...  cómo los recupero los que fué guardando? Saludos...

Es una FIFO, la primera ves que lees, lees el primer caracter, si lees de nuevo vas a leer el segundo.
Sabes si hay mas datos por que el flag no se desactiva, asi que si tu poll es rapido no vas a necesitar leer 2 y solo te contenes a ver si esta activo el flag y leer
Si tu poll es lento y existe la posibilidad que queden 2 datos ahi, entonces vas a tener que seguir leyendo hasta que el flag de interrupcion se borre.
Si por alguna casualidad ocurre un overrrun por que esta lleno, la UART deja de recibir hasta que se limpie el error

Y aca me disculpo con mi error. Antes habia dicho que se sobreescribia, pero no. No es asi, lo recibido queda y todo lo demas que llega termina siendo descartado.
Si ocurre esto, para quitar el error el datasheet dice que debes hacer.

--------------------

Con respecto a las prioridades de las interrupciones, es de hacerte notar que si o si un timer es mas importante que una de la UART, como dije las comunicaciones son lentas. Y si tus rutinas son realmente rapidas, de hacer unas cuantas instrucciones y salir, no tenes problema incluso en quitar las prioridades y que ambas UART disparen las interrupciones. No creo que estes a 1.25Mbaudios es una seleccion rara de ver :P
Va a depender tambien de tu clock
« Última modificación: 01 de Noviembre de 2015, 12:02:04 por KILLERJC »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:Duda usart
« Respuesta #5 en: 01 de Noviembre de 2015, 11:59:03 »
Agrego algo mas, si estas trabajando a 9600 y estas usando N,8,1 el tiempo que demora en recibir un byte es de aproximadamente 104 us ( 1/9600 * 10 ). Tiempo por demás suficiente para atender ese byte. Lee un poco sobre buffers circulares para ver como se resuelven este tipo de periféricos.

Saludos !

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re:Duda usart
« Respuesta #6 en: 01 de Noviembre de 2015, 16:22:19 »

Citar
No creo que estes a 1.25Mbaudios es una seleccion rara de ver :P
Va a depender tambien de tu clock

Jjajajaja  antes que nada muchas gracias por tu respuesta.

Trabajo a un poco menos de 1.25 Mbaudios.....  19200 baudios, y recibo tramas de hasta 80 bytes cada 400 ms aprox... con un CRC16 al final.

Y el micro lo uso con el oscilador interno de 20 MHz.

Calculando...
Una trama de 80 bytes la recibo en aprox: (1/19200*10*80) = 42 ms. Es decir que me quedan 400-42= 358 ms. para organizar los datos recibidos en memoria. (me sobra tiempo)

A lo único que le tengo miedo es que pasa cuando van llegando datos por la usart1 y en ese momento se estén transmitiendo datos al coordinador (tramas aprox de 60 bytes, tambien a 19200 baud cada 1 seg)... Quizá me estoy liando en vano....

NOTA: el dispositivo que está conectado a la USART1 no lo puedo controlar, envía datos a lo "pavote"  y yo "pincho" esa comunicación.



Saludos...

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re:Duda usart
« Respuesta #7 en: 01 de Noviembre de 2015, 16:24:47 »
Agrego algo mas, si estas trabajando a 9600 y estas usando N,8,1 el tiempo que demora en recibir un byte es de aproximadamente 104 us ( 1/9600 * 10 ). Tiempo por demás suficiente para atender ese byte. Lee un poco sobre buffers circulares para ver como se resuelven este tipo de periféricos.

Saludos !

Gracias RICHI777 voy a buscar material sobre buffers circulares. Te juro que en mi cabeza cuando intentaba dormir y pensaba en como desarrollar esta comunicación se me pasaban cosas semejantes a buffers circulares, que por cierto aún no se que son pero me parece q me lo imagino..

Saludos !

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Duda usart
« Respuesta #8 en: 01 de Noviembre de 2015, 16:34:47 »
Citar
A lo único que le tengo miedo es que pasa cuando van llegando datos por la usart1 y en ese momento se estén transmitiendo datos al coordinador (tramas aprox de 60 bytes, tambien a 19200 baud cada 1 seg)... Quizá me estoy liando en vano....

Nada.. son buffers distintos. el de transmision y recepcion, si usas la interrupcion tambien no vas a sufrir para nada. Ademas el micro ese es capaz de ir hasta 64Mhz con oscilador interno, asi que menos me preocuparia, si llegas a necesitar un poco mas de velocidad, supongamos que estas a 16Mhz, usas el PLL y listo.

Citar
Y el micro lo uso con el oscilador interno de 20 MHz.
No tenes oscilador interno de 20Mhz, tenes para seleccionar 16Mhz

Supongamos que tenes un oscilador de 16Mhz, eso implica 250ns por instruccion o que en los 358ms que tenes se podrian ejecutar 1.432.000 instrucciones de 1 ciclo. Para acomodar datos parece que sobra xD.
Si estas utilizando el PLL, y llevando al micro a 64Mhz, cada 62.5ns hiciste una instruccion de un ciclo. Resumen estas sobrado en velocidad.

Si no te da la velocidad a 64Mhz algun problema en el programa debe haber.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re:Duda usart
« Respuesta #9 en: 01 de Noviembre de 2015, 19:26:40 »
Citar
No tenes oscilador interno de 20Mhz, tenes para seleccionar 16Mhz

Supongamos que tenes un oscilador de 16Mhz, eso implica 250ns por instruccion o que en los 358ms que tenes se podrian ejecutar 1.432.000 instrucciones de 1 ciclo. Para acomodar datos parece que sobra xD.
Si estas utilizando el PLL, y llevando al micro a 64Mhz, cada 62.5ns hiciste una instruccion de un ciclo. Resumen estas sobrado en velocidad.

Si no te da la velocidad a 64Mhz algun problema en el programa debe haber.

Es verdad es de 16 no se  por que puse  20..  voy a probar y les comento resultado.

Me gusta mucho la idea del buffer circular.

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re:Duda usart
« Respuesta #10 en: 02 de Noviembre de 2015, 12:37:17 »
Citar
Calculando...
Una trama de 80 bytes la recibo en aprox: (1/19200*10*80) = 42 ms. Es decir que me quedan 400-42= 358 ms. para organizar los datos recibidos en memoria. (me sobra tiempo)

A lo único que le tengo miedo es que pasa cuando van llegando datos por la usart1 y en ese momento se estén transmitiendo datos al coordinador (tramas aprox de 60 bytes, tambien a 19200 baud cada 1 seg)... Quizá me estoy liando en vano....

Me parece que estas mezclando los conceptos. En realidad no te tiene que interesar tanto cuando tiempo lleva en recibir toda la trama sino lo realmente importante es el tiempo suficiente para recibir un byte, procesarlo y que no se te produzca un overrun.

Por eso es necesario trabajar con interrupciones, cuando se dispara la interrupción de la UART lees el registro correspondiente y lo almacenas en un buffer, sea circular o no. Una cosa imporante es dimensionar el buffer de manera tal que sea de suficiente tamaño como para poder albergar una trama completa.

Te dejo dos links donde detallan la implementacion

http://picfernalia.blogspot.com.ar/2012/06/comunicaciones-uart-con-interrupciones.html

http://picfernalia.blogspot.com.ar/2012/06/comunicaciones-puerto-serie-uart.html

Saludos !










Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re:Duda usart
« Respuesta #11 en: 08 de Noviembre de 2015, 08:46:56 »
Bueno amigos, como prometí, le voy a mostrar los avances, al código hay que pegarle una pulida, tiene muchos FPRINTF porque los voy utilizando para ir haciendo un debug de mi código... Luego cuando todo funcione a la perfección los tengo que sacar.

El codigo funciona muy bien, pero tengo algunas dudas...

1- No se si utilizar la interrupcion #INT_TBE, para que me puede servir?
2- De que manera puedo chequear si hubo errores en la usart ? la idea es ir contando los errores y sumarlos a un contador de memoria para luego va a hacer falta pulir el código
3- en varias partes del codigo pegue este pedacito de codigo para checkear si hay muchos datos NO PROCESADOS en el buffer circular...

Código: C
  1. if (inew >= iold){
  2.                                                 if (inew-iold >5) fprintf(COM1,"Datos en Buffer: %u\n\r",inew-iold);
  3.                                         }
  4.                                         else {
  5.                                                 if (127-iold+inew >5) fprintf(COM1,"Datos en Buffer: %u\n\r",127-iold+inew);
  6.                                         }

la mayoria de las veces es 0 y no imprime nada. pero a veces me llevo la sorpresa que sube mucho..  y en el terminal veo lo siguiente..

Datos en Buffer: 8
Datos en Buffer: 32
Datos en Buffer: 59
Datos en Buffer: 80
Datos en Buffer: 30
Datos en Buffer: 10
Datos en Buffer: 7

y no pude detectar que se de en un caso particular... es como que el pic estaba "ocupado en algo y le llego una chorrera de datos"  lo bueno que aun siendo asi, con esto del buffer circular de 128 bytes no he perdido ningún dato, igual me parece uan exageración un que haya picos 80 bytes sin procesar...

Bueno amigos seguramente volveré con mas dudas, aquí debajo les pego mi código. Les vuelvo a repetir que hay que pulir bastante, pero funciona muy bien.

Saludos!


Código: C
  1. #include
  2.  <18F26K22.h>
  3. #device ADC=16
  4.  
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  7. #FUSES NOBROWNOUT               //No brownout reset
  8. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  9. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  10.  
  11. #use delay(internal=16MHz)
  12.  
  13. #define PIN_RTS PIN_B4
  14. #define PIN_SCL PIN_C3
  15. #define PIN_SDA PIN_C4
  16.  
  17. #DEFINE desocupado 0
  18. #DEFINE esperando_address 1
  19. #DEFINE esperando_evento 2
  20. #DEFINE esprando_comando 3
  21. #DEFINE esperando_fecha_hora 4
  22. #DEFINE esperando_contadores 5
  23. #DEFINE esperando_comando 6
  24. #DEFINE esperando_respuesta_comando 7
  25.  
  26. #DEFINE buffer_leght 64
  27.  
  28. #use rs232(baud=19200, parity=N, xmit=PIN_B6, rcv=PIN_B7, bits=8, stream=COM1, UART1)
  29. #use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stream=XBEE, enable=PIN_RTS, UART2)
  30.  
  31. #use i2c(Master,Fast,sda=PIN_SDA,scl=PIN_SCL,force_hw)
  32.  
  33.  
  34. int1 MDC=0;
  35. int8 dato;
  36. int1 haydato=0;
  37. int8 buffer[buffer_leght];                                                              //buffer secundario, lo uso para trabajar las tramas                           
  38. int8 i_buffer=0;
  39. int16 temp;
  40. int8 CRC_MSB;
  41. int8 CRC_LSB;
  42. int8 meters[32];
  43. int8 date[7];
  44. int8 current[4];
  45. int8 bill2[4];
  46. int8 bill5[4];
  47. int8 bill10[4];
  48. int8 bill20[4];
  49. int8 bill50[4];
  50. int8 bill100[4];
  51. int8 billtotal[4];
  52.  
  53.  
  54. int8 com1_comando;
  55. int8 com1_status;
  56. int8 com1_address;
  57. int8 com1_address_desconocido;
  58. int8 buffer_com1[128];                                                                  //buffer circular (donde recibo todo lo de la USART 1)
  59. int8 inew=0;                                                                                    //vectores de dato nuevo y dato viejo
  60. int8 iold=0;
  61.  
  62. void recibe_com1(unsigned int8 d){                                              //agrega dato al buffer circular y chequea si se desbordo
  63.         buffer_com1[inew] = d;
  64.         ++inew;
  65.         if(inew>=128)inew=0;
  66.         if (inew==iold){
  67.                 fputs("DEBUG: buffer_com1 overflow",COM1);
  68.         }
  69. }
  70.  
  71. unsigned int1 dato_buffer_com1(void){                                   //funcion para consultar si hay bytes para procesaren el buffer
  72.         if(inew!=iold){
  73.                 return(true);
  74.         }
  75.         else return(false);
  76. }
  77.  
  78. unsigned int8 siguiente_dato_com1(void){                                // funcion que devuelve el byte mas viejo para ser preocesado
  79.         unsigned int8 temp;
  80.         temp=buffer_com1[iold];
  81.         ++iold;
  82.         if(iold>=128)iold=0;
  83.         return (temp);
  84.  
  85. }
  86.  
  87.  
  88.  
  89. void reinicia_buffer(void){                                                             //llena un buffer con 0xFF y pone a 0 el indice
  90.         unsigned int8 i;                                                                        //no se si tiene sentido llenarlo con 0xff no he utilizado
  91.         i_buffer=0;                                                                                     //en ninguna parte de mi codigo aun
  92.         for(i=0;i<buffer_leght;i++){
  93.                 buffer[i]=0xff;
  94.         }
  95. }
  96.  
  97. int1 check_crc(unsigned char *p, int8 len){                             //funcion para chequeo de CRC
  98.         unsigned int16 crcval=0x00;
  99.     register unsigned int16 c,q;
  100.         unsigned int8 x=len-1;
  101.  
  102.     for (;x;x--){
  103.         c=*p++;
  104.         q=(crcval ^ c) & 017;
  105.         crcval = (crcval>>4) ^ (q*010201);
  106.         q=(crcval ^ (c>>4)) & 017;
  107.         crcval = (crcval>>4) ^ (q*010201);
  108.     }
  109.         CRC_MSB=(crcval>>8) & 0xff;
  110.         CRC_LSB=crcval & 0xff;
  111.         if(CRC_MSB == buffer[len] && CRC_LSB == buffer[len-1]){
  112.         return (true);
  113.         }
  114.         else {
  115.                 return(false);
  116.         }
  117. }
  118. void guarda_datos(unsigned char *p, unsigned int8 from, unsigned int8 to){
  119.  
  120.         for(;from<=to;from++){                                                          //funcion que utilizo cada vez que leo una trama completa y el CRC esta bien,
  121.                 *p++=buffer[from];                                                              //para guardar los datos en su correspondiente variables
  122.  
  123.                 }
  124.         }
  125.  
  126.  
  127.  
  128. void recibe_trama(void) {                                                               //funcion que llamo cuando detecto que los datos son un POSIBLE TRAMA.
  129.                                                                                                                 //chequeo que trama es y si corresponde a una trama conocida ejecuto acciones correspondientes
  130.         buffer[i_buffer] = dato;
  131.         ++i_buffer;
  132.         if (buffer[0]==0x00 && com1_status==esperando_fecha_hora){
  133.                 if(i_buffer>1){
  134.                         if (buffer[1]==0x7f){
  135.                                 if(i_buffer==11){
  136.                                         com1_status=desocupado;                                                                
  137.                                         if (check_crc(&buffer[0],10)){
  138.                                                 guarda_datos(&date,2,8);
  139.                                                 fprintf(COM1,"Date: ");
  140.                                                 for(int8 x=0;x<7;x++){
  141.                                                         fprintf(COM1,"%X ",date[x]);
  142.                                                 }
  143.                                                 fprintf(COM1," - CRC OK\n\r");
  144.                                         if (inew >= iold){
  145.                                                 if (inew-iold >5) fprintf(COM1,"Datos en Buffer: %u\n\r",inew-iold);
  146.                                         }
  147.                                         else {
  148.                                                 if (127-iold+inew >5) fprintf(COM1,"Datos en Buffer: %u\n\r",127-iold+inew);
  149.                                         }
  150.                                         }
  151.                                         else {
  152.                                                 fprintf(COM1,"Error CRC Date. \n\r");
  153.                                         }
  154.                                 }
  155.                                 return;
  156.                         }
  157.                         else {com1_status=desocupado;}
  158.                 }
  159.                 return;
  160.  
  161.         }
  162.  
  163.         else if (buffer[0]==0x01){
  164.                 if(i_buffer>1){
  165.                         switch(buffer[1]){
  166.                                 case 0x1c:
  167.                                                         if(i_buffer==36){
  168.                                                                 com1_status=desocupado;
  169.                                                                 if (check_crc(&buffer[0],35)){
  170.                                                                         guarda_datos(&meters,2,33);
  171.                                                                         fprintf(COM1,"Meters: ");
  172.                                                                         for(int8 x=0;x<32;x++){
  173.                                                                                 fprintf(COM1,"%X ",meters[x]);
  174.                                                                         }
  175.                                                                         fprintf(COM1," - CRC OK\n\r");
  176.                                                                 }
  177.                                                                 else {
  178.                                                                         fprintf(COM1,"Error CRC Meters. \n\r");
  179.                                                                 }
  180.                                                         }
  181.                                                         break;
  182.                                
  183.                                 case 0x1a:
  184.                                                         if(i_buffer==8){
  185.                                                                 com1_status=desocupado;                                                                        
  186.                                                                 if (check_crc(&buffer[0],7)){
  187.                                                                         guarda_datos(&current,2,5);
  188.                                                                         fprintf(COM1,"Current: ");
  189.                                                                         for(int8 x=0;x<4;x++){
  190.                                                                                 fprintf(COM1,"%X ",current[x]);
  191.                                                                         }
  192.                                                                         fprintf(COM1," - CRC OK\n\r");
  193.                                         if (inew >= iold){
  194.                                                 if (inew-iold >5) fprintf(COM1,"Datos en Buffer: %u\n\r",inew-iold);
  195.                                         }
  196.                                         else {
  197.                                                 if (127-iold+inew >10) fprintf(COM1,"Datos en Buffer: %u\n\r",127-iold+inew);
  198.                                         }
  199.                                                                 }
  200.                                                                 else {
  201.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  202.                                                                 }
  203.                                                         }
  204.                                                         break; 
  205.                        
  206.                                 case 0x32:
  207.                                                         if(i_buffer==8){
  208.                                                                 com1_status=desocupado;                                                                        
  209.                                                                 if (check_crc(&buffer[0],7)){
  210.                                                                         guarda_datos(&bill2,2,5);
  211.  
  212.                                                                         fprintf(COM1," - CRC OK\n\r");
  213.                                         if (inew >= iold){
  214.                                                 if (inew-iold >5) fprintf(COM1,"Datos en Buffer: %u\n\r",inew-iold);
  215.                                         }
  216.                                         else {
  217.                                                 if (127-iold+inew >10) fprintf(COM1,"Datos en Buffer: %u\n\r",127-iold+inew);
  218.                                         }
  219.                                                                 }
  220.                                                                 else {
  221.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  222.                                                                 }
  223.                                                         }
  224.                                                         break;                 
  225.                                 case 0x33:
  226.                                                         if(i_buffer==8){
  227.                                                                 com1_status=desocupado;                                                                        
  228.                                                                 if (check_crc(&buffer[0],7)){
  229.                                                                         guarda_datos(&bill5,2,5);
  230.  
  231.                                                                         fprintf(COM1," - CRC OK\n\r");
  232.                                                                         }
  233.                                                                 else {
  234.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  235.                                                                 }
  236.                                                         }
  237.                                                         break;
  238.                                 case 0x34:
  239.                                                         if(i_buffer==8){
  240.                                                                 com1_status=desocupado;                                                                        
  241.                                                                         guarda_datos(&bill10,2,5);
  242.  
  243.                                                                         fprintf(COM1," - CRC OK\n\r");
  244.                                                                         }
  245.                                                                 else {
  246.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  247.                                                                 }
  248.                                                         }
  249.                                                         break;
  250.                                 case 0x35:
  251.                                                         if(i_buffer==8){
  252.                                                                 com1_status=desocupado;                                                                        
  253.                                                                 if (check_crc(&buffer[0],7)){
  254.                                                                         guarda_datos(&bill20,2,5);
  255.                                                                         fprintf(COM1," - CRC OK\n\r");
  256.                                                                         }
  257.                                                                 else {
  258.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  259.                                                                 }
  260.                                                         }
  261.                                                         break;
  262.                                 case 0x36:
  263.                                                         if(i_buffer==8){
  264.                                                                 com1_status=desocupado;                                                                        
  265.                                                                 if (check_crc(&buffer[0],7)){
  266.                                                                         guarda_datos(&bill50,2,5);
  267.                                                                         fprintf(COM1," - CRC OK\n\r");
  268.                                                                         }
  269.                                                                 else {
  270.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  271.                                                                 }
  272.                                                         }
  273.                                                         break;
  274.                                 case 0x37:
  275.                                                         if(i_buffer==8){
  276.                                                                 com1_status=desocupado;                                                                        
  277.                                                                 if (check_crc(&buffer[0],7)){
  278.                                                                         guarda_datos(&bill100,2,5);
  279.                                                                         fprintf(COM1," - CRC OK\n\r");
  280.                                                                         }
  281.                                                                 else {
  282.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  283.                                                                 }
  284.                                                         }
  285.                                                         break;
  286.                                 case 0x46:
  287.                                                         if(i_buffer==8){
  288.                                                                 com1_status=desocupado;                                                                        
  289.                                                                 if (check_crc(&buffer[0],7)){
  290.                                                                         guarda_datos(&billtotal,2,5);
  291.                                                                         fprintf(COM1," - CRC OK\n\r");
  292.                                                                         }
  293.                                                                 else {
  294.                                                                         fprintf(COM1,"Error CRC Current. \n\r");
  295.                                                                 }
  296.                                                         }
  297.                                                         break;
  298.  
  299.  
  300.  
  301.  
  302.                                 default:
  303.                                                         fprintf(COM1,"80 01 %X\n\r",buffer[1]);
  304.                                                         com1_status=desocupado;
  305.                                                         break;
  306.                         }
  307.                 }
  308.         }
  309.         else {com1_status=desocupado;}
  310. }
  311.  
  312.  
  313. #INT_EXT
  314. void  EXT_isr(void)
  315. {
  316.         MDC=1;
  317.         disable_interrupts(INT_EXT);
  318. }
  319.  
  320.  
  321. #INT_RDA                                                                //aun no laimplemente, pero por esta usart me comunico por 485 con otrodispositivo que recolecta datos
  322. void  RDA_isr(void)                                     //recibire poleos consultado si hay nuevos datos y le enviare los mismos si es que hay.
  323. {
  324.  
  325.        
  326. }
  327.  
  328. #INT_TBE
  329. void  TBE_isr(void)                                     // no se si la voy a utilizar..  sera factible ?
  330. {
  331.  
  332. }
  333.  
  334. #INT_TBE2
  335. void  TBE2_isr(void)
  336. {
  337.  
  338. }
  339.  
  340. #INT_RDA2
  341. void  RDA2_isr(void)
  342. {
  343.         recibe_com1(fgetc(XBEE));
  344.  
  345. //      fputc(fgetc(XBEE),COM1);
  346. }
  347.  
  348. void main(){
  349.  
  350.         disable_interrupts(INT_TIMER0);
  351.         disable_interrupts(INT_TIMER1);
  352.         disable_interrupts(INT_TIMER2);
  353.         disable_interrupts(INT_TIMER3);
  354.  
  355.         disable_interrupts(INT_RDA);
  356.         disable_interrupts(INT_TBE);
  357.  
  358.         disable_interrupts(INT_TBE2);
  359.         disable_interrupts(INT_RDA2);
  360.  
  361.         disable_interrupts(INT_EXT);
  362.         ext_int_edge( H_TO_L );   // Sets up EXT
  363.  
  364.         enable_interrupts(GLOBAL);
  365.  
  366.         reinicia_buffer();
  367.         com1_status=desocupado;
  368.  
  369.         fprintf(COM1,"BIENVENIDO \n\r");
  370.         enable_interrupts(INT_RDA2);
  371.  
  372.  
  373.         while(TRUE)     {
  374.  
  375.                 if (dato_buffer_com1()){                                                                                        // SI HAY DATOS PARA PROCESAR
  376.                         dato = siguiente_dato_com1();
  377.  
  378.                         if(com1_status==desocupado && dato==0x80){                                      // SI ES PRIMER DATO Y ES 0X80, ESPERAMOS EL ADDRESS
  379.                                 com1_status = esperando_address;
  380.                         }
  381.  
  382.                         else if(com1_status==esperando_address){                                                // SI ESPERABAMOS EL ADDRESS, COMPROBAMOS...                           
  383.                                 com1_address = dato;
  384.                                 if(com1_address==0x81){                                                                                 // SI EL ADDRESS ES 0X81 (ADDRESS ORED), ESPERAMOS UN EVENTO
  385.                                         com1_status = esperando_evento;
  386.                                 }
  387.                                 else if(com1_address==0x01){                                                                    // SI EL ADDRESS ES 0X01 (ADDRESS), ESPERAMOS UN COMANDO
  388.                                         com1_status = esperando_comando;
  389.                                 }
  390.                                 else if(com1_address==0x00){                                                                    // SI EL ADDRESS ES 0X00 (BROADCAST), ESPERAMOS FECHA Y HORA
  391.                                         com1_status = esperando_fecha_hora;
  392.                                         reinicia_buffer();
  393.                                         buffer[0] = 0x00;
  394.                                         i_buffer=1;
  395. //                                      fprintf(COM1,"\n\r01 80 00 \n\r");
  396. //                              fprintf(COM1,"80 00 - fecha/hora\n\r");
  397.                                 }
  398.                                 else {
  399.                                         com1_status=desocupado;
  400.                                         com1_address_desconocido++;                                                                     // SI RECIBIMOS OTRO ADDRESS ES DESCONOCIDO !!!! QUE HACER ?
  401.  
  402.                                 }
  403.                         }
  404.  
  405.                         else if (com1_status==esperando_comando){                                               // SI ESPERABAMOS UN COMANDO, LO GUARDAMOS Y ESPERAMOS LA RESPUESTA
  406.                                 com1_comando = dato;
  407.                                 com1_status = esperando_respuesta_comando;
  408.  
  409.                                 reinicia_buffer();
  410.                         }
  411.  
  412.                         else if (com1_status==esperando_respuesta_comando){
  413.                                 recibe_trama();
  414.                                
  415.                         }
  416.                         else if (com1_status==esperando_fecha_hora){
  417.  
  418.                                 recibe_trama();
  419.                                
  420.                         }
  421.        
  422.                         else if (com1_status==esperando_evento){
  423.                                         if (dato != 0x00) {
  424.                                                 fprintf(COM1,"Evento: %X\n\r",dato);                                                                    //RECIBIENDO EVENTO
  425.                                         }
  426.  
  427.                                         if (inew >= iold){
  428.                                                 if (inew-iold >5) fprintf(COM1,"Datos en Buffer: %u\n\r",inew-iold);   
  429.                                         }
  430.                                         else {
  431.                                                 if (127-iold+inew >10) fprintf(COM1,"Datos en Buffer: %u\n\r",127-iold+inew);
  432.                                         }
  433.                                         com1_status=desocupado;
  434.        
  435.                         }
  436.                         MDC=0;
  437.  
  438.  
  439.                 }
  440.  
  441.         }
  442. }


 

anything