Autor Tema: no me funciona el getc luego de que inicia la interrupcion del serial  (Leído 1570 veces)

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

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
hola a todos buenas noches
necesito algo de ayuda.
continuo con el proyecto que mencione en este post
http://www.todopic.com.ar/foros/index.php?topic=47783.0

el codigo esta funcional, lo estaba trabajando en el 18f25k20 pero lo necesito pasar al 16f1829 y me pasa que el getc no me funciona, afirmo eso porque en proteus haciendo el paso a paso me di cuenta de ese problema solo con el 16f1829.
necesito porfavor me colaboren si hay algun error o algo que no he notado

Código: C
  1. #include <16f1829.h>
  2.  
  3.  #include <internal_eeprom.c>
  4.  #include <stdio.h>
  5.  #include <stdlib.h>
  6.  #fuses INTRC_IO,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
  7.  #use delay(clock=8M)
  8.  
  9. ///////////////////////////////////////////////////////////////////////////////////////////////////
  10. // Canal de Comunicación : usart
  11. ///////////////////////////////////////////////////////////////////////////////////////////////////
  12.  
  13. #define TTL_TX              PIN_B7
  14. #define TTL_RX              PIN_B5
  15.  
  16. #use rs232(baud=57600, xmit=TTL_TX, rcv=TTL_RX)
  17.  
  18. /*#define LCD_DB4   PIN_B4
  19. #define LCD_DB5   PIN_B5
  20. #define LCD_DB6   PIN_B6
  21. #define LCD_DB7   PIN_B7
  22. #define LCD_RS    PIN_B1
  23. #define LCD_RW    PIN_B2
  24. #define LCD_E     PIN_B3
  25. #include "flex_lcd_c2.c"                           /// libreria para el manejo de la lcd  */
  26.  
  27. //ENTRADAS
  28. #define TANQUE                  PIN_C4  // PIN_A7
  29. #define TANQUEEXTERIOR          PIN_C3  // PIN_A6
  30. #define CREDITO1                PIN_B4  // PIN_C1
  31.  
  32.  
  33. //Ultrasonido
  34. #define trig                    PIN_C1  // PIN_C5
  35. #define echo                    PIN_C0  // PIN_C4
  36.  
  37. //SALIDAS
  38. #define ELECTROBOMBA            PIN_C2  // PIN_A4
  39. #define APAGADO                 PIN_A5  // PIN_C0
  40. #define SENSORP                 PIN_A4  // PIN_B0  sensorpuerta
  41.  
  42.  
  43. //Variables
  44.  
  45.  
  46.  
  47.  
  48. ///////////////////////////////////////
  49. // Constantes
  50. ///////////////////////////////////////
  51.  
  52. int  const lenbuff=200;     // Longitud máxima del buffer
  53. char const delimiter = ','; // Delimitador de parametros
  54. int const lenparam  = 12;  // Máxima longitud por parámetro
  55.  
  56. ///////////////////////////////////////
  57. // RAM
  58. ///////////////////////////////////////
  59.  
  60. int  xbuff=0x00;     // Índice: siguiente char en cbuff
  61. unsigned char cbuff[lenbuff]; // Buffer de recepción
  62. int flagcommand=0;  // Flag para comando disponible
  63. //char banderasensor[2]={'0'};    //por si no hay agua
  64.  
  65.  
  66.  
  67. char tmp[lenparam];
  68.  
  69. unsigned char manual[lenparam];
  70. unsigned char encenderunidad[lenparam];
  71. unsigned char celular[lenparam];
  72. unsigned char hora[lenparam];
  73. unsigned char fecha[lenparam];
  74. unsigned char latitud[lenparam];
  75. unsigned char longitud[lenparam];
  76. unsigned char signolatitud[lenparam];
  77. unsigned char signolongitud[lenparam];
  78. unsigned char dia[lenparam];
  79. unsigned char mes[lenparam];
  80. unsigned char ano[lenparam];
  81. unsigned char degradianes1[lenparam];
  82. unsigned char minutos1[lenparam];
  83. unsigned char degradianes2[lenparam];
  84. unsigned char minutos2[lenparam];
  85. double horaf;
  86. double fechaf;
  87. double latitudf;
  88. double longitudf;
  89.  
  90. double degradianesf1;
  91. double minutosf1;
  92. double degradianesf2;
  93. double minutosf2;
  94.  
  95. int manualsms=0;
  96. int unidadsms=0;
  97. int diaf;
  98. int mesf;
  99. int anof;
  100. int sumadia;
  101. int mestabla;
  102. int multiplo;
  103. int sumaano;
  104. int dianumero;
  105. int unidadgps=0;
  106. int unidad=1;
  107.  
  108. int16 distancia, tiempo;
  109. int unidadsensor=0;
  110.  
  111. int estadopuerta=0;    //por si habren la puerta
  112. int banderaenvio=0;      //bandera para activar envio
  113.  
  114. unsigned int16  cont=0;
  115. unsigned int16  servicios=0;
  116.  
  117. ///////////////////////////////////////
  118. // Funcione de creditos
  119. ///////////////////////////////////////
  120. void creditos(){
  121.       if(input(CREDITO1)==1){  
  122.          cont++;
  123.          servicios=servicios+cont;
  124.          write_int16_eeprom(0x05, (int16)(servicios));
  125.          cont=0;
  126.          printf("creditos: %lu\r\n",(unsigned int16)(servicios));        
  127.          while(input(CREDITO1)==1)
  128.             {;}
  129.       }
  130.  
  131. }
  132. ///////////////////////////////////////
  133. // Funciones de Buffer
  134. ///////////////////////////////////////
  135.  
  136. // Cuenta los parametros en el buffer --
  137.  
  138. int8 count_param_number(void){
  139.  
  140.    int8 ret, i;
  141.    unsigned char c;
  142.  
  143.    ret=0;
  144.    // ¿Hay comando?
  145.    c = cbuff[0];
  146.    if(c != 0x00) ret=1;
  147.    // Cuenta parámetros
  148.    for(i=0;i<lenbuff,c!=0x00;i++){
  149.       c = cbuff[i];
  150.       if(c==delimiter) ++ret;
  151.    }
  152.  
  153.    return ret;
  154. }
  155.  
  156. // Extrae un Parámetro del buffer ------
  157.  
  158. int1 get_param_by_order(int8 pos){      //numero de orden del trozo, maxima longitud, array donde extraer
  159.  
  160.    int1 ret=0;
  161.    
  162.    int8 i,j;
  163.    int8 nDelimiter;
  164.  
  165.  
  166.    for(i=0,j=0,nDelimiter=0;i<lenbuff;i++){
  167.       tmp[j]=0x00;
  168.       if(nDelimiter==pos){
  169.             tmp[j++]=cbuff[i];
  170.       }
  171.       if((cbuff[i]==Delimiter) || (cbuff[i]==0x00)) ++nDelimiter;
  172.       if(nDelimiter>pos){
  173.          j -= 1;
  174.          break;
  175.       }
  176.    }
  177.    tmp[j]='\0';
  178.    if(j>lenparam){
  179.       ret=1;                          
  180.    }
  181.    return ret;                               //retorna 1 si todo bien
  182. }
  183.  
  184. // Inicia a \0 cbuff -------------------
  185.  
  186. void init_cbuff(void){
  187.    int x;
  188.  
  189.    for(x=0;x<lenbuff;x++){// Bucle que pone a 0 todos los
  190.       cbuff[x]=0x00;      // caracteres en el buffer
  191.    }
  192.    xbuff=0x00;            // Inicializo el indice de siguiente caracter
  193. }
  194.  
  195. void corrertiempo(void){  
  196.  
  197.                   init_cbuff();         // Borro buffer.
  198.  
  199.                   printf("AT+GPSRD=1\r\n");
  200.                   delay_ms(2000);
  201.                   flagcommand=0;  
  202.                   printf("AT+GPSRD=60\r\n");
  203.                   delay_ms(2000);
  204.                   flagcommand=0;  
  205.                   init_cbuff();         // Borro buffer.
  206. }
  207. // Añade a cbuff -----------------------
  208.  
  209. void add_2_cbuff(char c){
  210.  
  211.                  
  212.       switch(c){
  213.          case 'K':  // Enter -> Habilita Flag para procesar comando
  214.             flagcommand=1;
  215.             break;
  216.          default:    // Añade caracter recibido al Buffer
  217.             cbuff[xbuff++]=c;
  218.             if(xbuff>199){
  219.             flagcommand=2;}
  220.       }  
  221. }
  222.  
  223.  
  224. void recivosms(void){
  225.  
  226.             if(manual[0]=='M')                                 //pregunta si manual o autmatico
  227.                manualsms=1;
  228.             if(manual[0]=='A')
  229.                manualsms=0;
  230.             if(encenderunidad[0]=='1')                         //lee el valor recibido por sms de la solicitud de la unidad
  231.                unidadsms=1;
  232.             if(encenderunidad[0]=='0')
  233.                unidadsms=0;                      
  234. }
  235.  
  236.  
  237. void enviosms(void){
  238.              
  239.              if(manual[0]=='M' || manual[0]=='A' || banderaenvio==1){
  240.              
  241.               banderaenvio=0;            
  242.              
  243.               delay_ms(2000);
  244.               flagcommand=0;
  245.               if(manual[0]=='M' || manual[0]=='A'){
  246.                printf("AT+CMGS=+57%s\r\n",celular);
  247.                manual[0]=0;}
  248.               else{
  249.                printf("AT+CMGS=+573118017337\r\n");}
  250.               putc(0x0D);
  251.               delay_ms(2000);
  252.               flagcommand=0;
  253.               printf("creditos: %lu\r\n",(unsigned int16)(servicios));
  254.               delay_ms(1000);
  255.               flagcommand=0;
  256.               printf("latitud: %04.5f\r\n",latitudf);
  257.               delay_ms(1000);
  258.               flagcommand=0;
  259.               printf("longitud: %05.5f\r\n",longitudf);
  260.               delay_ms(1000);
  261.               flagcommand=0;
  262.               printf("Estado unidad: %u\r\n",unidad);                            
  263.               delay_ms(1000);
  264.               flagcommand=0;
  265.               printf("Estado puerta: %u\r\n",estadopuerta);              
  266.               delay_ms(1000);
  267.               flagcommand=0;                
  268.               printf("maps.google.com/?q=%04.5f,%05.5f\r\n",latitudf,longitudf);            
  269.               delay_ms(1000);
  270.               flagcommand=0;
  271.               putc(0x1A);
  272.  
  273.               init_cbuff();         // Borro buffer.
  274.             }
  275. }
  276.  
  277. void puerta(void){
  278.  
  279.    if(input(SENSORP)==1 && estadopuerta==0){
  280.          estadopuerta=1;
  281.          banderaenvio=1;
  282.    }
  283.    
  284.    if(input(SENSORP)==0 && estadopuerta==1){
  285.          estadopuerta=0;
  286.          banderaenvio=1;      
  287.    }  
  288.    
  289.    
  290.      enviosms();
  291.    
  292.    
  293. }  
  294.  
  295.  
  296. void seleccionar(void){
  297.  
  298.               if(manualsms==1){
  299.                   if(unidadsms==1 && unidadsensor==1){
  300.                      unidad=1;
  301.                      output_high(APAGADO);      }                  //envio un 1 para desactivar la salida (APAGADO)
  302.                   if(unidadsms==0 || unidadsensor==0){
  303.                      unidad=0;
  304.                      output_low(APAGADO);       }                    //envio un cero para activar la salida (APAGADO)
  305.              }
  306.              
  307.              if(manualsms==0){
  308.                   if(unidadgps==1 && unidadsensor==1){
  309.                      unidad=1;
  310.                      output_high(APAGADO);       }                  //envio un 1 para desactivar la salida (APAGADO)
  311.                   if(unidadgps==0 || unidadsensor==0){
  312.                      unidad=0;
  313.                      output_low(APAGADO);        }                   //envio un cero para activar la salida (APAGADO)
  314.              }
  315. }
  316.  
  317. ///////////////////////////////////////
  318. // SENSORES
  319. ///////////////////////////////////////
  320.  
  321. void sensores(void){
  322.  
  323. //---------------------------------------------------------------------------------
  324.    
  325.  /*   output_high (trig);
  326.     delay_us (20);
  327.     output_low (trig);
  328.     WHILE ( ! input (echo)){}
  329.     set_timer1 (0);
  330.     WHILE (input (echo) ){}
  331.    
  332.     tiempo = get_timer1 ();  */
  333.     distancia = 200;//(tiempo * 10) / (58.0);
  334.    
  335. //-----------------------------------------------------------------------------
  336.  if(input(TANQUEEXTERIOR)==1 && distancia >= 190)
  337.    {
  338.     output_low(ELECTROBOMBA);
  339.     unidadsensor=0;
  340.     /* if(banderasensor[0]=='0'){
  341.           banderasensor[0]='1';
  342.           banderaenvio=1;
  343.           } */
  344.    }
  345.    
  346.    else if(input(TANQUE)==1 && distancia >50){         //si el tanque interior no tiene agua  
  347.      output_high(ELECTROBOMBA);
  348.      unidadsensor=1;
  349.      }
  350.  
  351.    else if(input(TANQUE)==0 || distancia <= 45){       //si el tanque interior sobre pasa el agua
  352.      output_low(ELECTROBOMBA);
  353.      unidadsensor=1;
  354.      }
  355.    else {}
  356.      
  357. /*  if(input(TANQUEEXTERIOR)==0 && banderasensor[0]=='1'){                         //desactiva la bandera de nivel
  358.          unidadsensor=1;
  359.          banderasensor[0]='0';
  360.          banderaenvio=1;
  361.  
  362.   } */
  363.  
  364.         seleccionar();
  365.      
  366. }
  367.  
  368. ///////////////////////////////////////
  369. // Procesador de Comandos
  370. ///////////////////////////////////////
  371.  
  372. void commad_menu(void){
  373.  
  374.    delay_ms(2000);
  375.    printf("AT\r\n");
  376.    delay_ms(2000);
  377.    printf("AT+GPSRD=60\r\n");
  378.    delay_ms(2000);
  379.    printf("AT+GPS=1\r\n");
  380.    delay_ms(2000);
  381.    printf("AT+CMGF=1\r\n");
  382.    delay_ms(2000);
  383.    
  384.    init_cbuff();         // Borro buffer.
  385. }
  386.  
  387. ///////////////////////////////////////
  388. // Procesador de Comandos
  389. ///////////////////////////////////////
  390.  
  391. void commad_process(void){
  392.  
  393.    int  n,i,x;
  394.    degradianesf1=0;
  395.    minutosf1=0;
  396.    degradianesf2=0;
  397.    minutosf2=0;
  398.    latitudf=0;
  399.    longitudf=0;
  400.  
  401.  
  402.    // Primera Parte: Cuantos
  403.    n = count_param_number(); // Cuento el número de parámetros
  404.    
  405.    // Segunda Parte: Cuales
  406.    
  407.        if(n>0){
  408.           for(i=0;i<n;i++){
  409.             if(i==2 || i==3 || i==4 || i==15 || i==17 || i==19 || i==23 || i==18 || i==20){
  410.              get_param_by_order(i);
  411.   //         printf("Parámetro %u <%s>\r\n",i,tmp);
  412.              for(x=0;x<lenparam;x++){
  413.              if(i==2)
  414.                  manual[x]=tmp[x];
  415.              if(i==3)
  416.                  encenderunidad[x]=tmp[x];
  417.              if(i==4)
  418.                  celular[x]=tmp[x];
  419.              if(i==15)
  420.                  hora[x]=tmp[x];
  421.              if(i==17)
  422.                  latitud[x]=tmp[x];                
  423.              if(i==19)
  424.                  longitud[x]=tmp[x];
  425.              if(i==23)
  426.                  fecha[x]=tmp[x];
  427.              if(i==18)
  428.                  signolatitud[x]=tmp[x];
  429.              if(i==20)
  430.                  signolongitud[x]=tmp[x];
  431.              }
  432.              }
  433.           }                                        
  434.        }    
  435.  
  436.            init_cbuff();         // Borro buffer.
  437.  
  438.            
  439. // si recibe un mensaje
  440.  
  441.            recivosms();
  442.            
  443. //pasando variables de caracter a numero flotante              
  444.                horaf=atof(hora);  
  445.                fechaf=atof(fecha);
  446.  
  447. //conviersion latitud
  448.                degradianes1[0]=latitud[0];
  449.                degradianes1[1]=latitud[1];
  450.                degradianes1[2]='\0';
  451.                minutos1[0]=latitud[2];
  452.                minutos1[1]=latitud[3];
  453.                minutos1[2]=latitud[4];
  454.                minutos1[3]=latitud[5];
  455.                minutos1[4]=latitud[6];
  456.                minutos1[5]=latitud[7];
  457.                minutos1[6]=latitud[8];
  458.                minutos1[7]=latitud[9];
  459.                minutos1[8]=latitud[10];
  460.                
  461.               degradianesf1=atof(degradianes1);
  462.               minutosf1=atof(minutos1);
  463.              
  464.               latitudf=degradianesf1+minutosf1/60;
  465.               if(signolatitud[0]=='S')
  466.                  latitudf=latitudf*(-1);
  467.              
  468. //conviersion longitud
  469.  
  470.                degradianes2[0]=longitud[0];
  471.                degradianes2[1]=longitud[1];
  472.                degradianes2[2]=longitud[2];
  473.                degradianes2[3]='\0';
  474.                minutos2[0]=longitud[3];
  475.                minutos2[1]=longitud[4];
  476.                minutos2[2]=longitud[5];
  477.                minutos2[3]=longitud[6];
  478.                minutos2[4]=longitud[7];
  479.                minutos2[5]=longitud[8];
  480.                minutos2[6]=longitud[9];
  481.                minutos2[7]=longitud[10];
  482.                minutos2[8]=longitud[11];
  483.                
  484.               degradianesf2=atof(degradianes2);
  485.               minutosf2=atof(minutos2);
  486.              
  487.               longitudf=degradianesf2+minutosf2/60;
  488.                if(signolongitud[0]=='W')                  
  489.                  longitudf=longitudf-longitudf*(2);
  490.                        
  491.                              
  492. //------dia de la semana
  493.                dia[0]=fecha[0];
  494.                dia[1]=fecha[1];
  495.                mes[0]=fecha[2];
  496.                mes[1]=fecha[3];
  497.                ano[0]=fecha[4];
  498.                ano[1]=fecha[5];
  499.                
  500.                diaf=atoi(dia);
  501.                mesf=atoi(mes);
  502.                anof=atoi(ano);
  503.        
  504.  //tabla de meeses
  505.                if(mesf==1 || mesf==10)
  506.                   mestabla=0;
  507.                if(mesf==2 || mesf==3 || mesf==11)  
  508.                   mestabla=3;
  509.                if(mesf==4 || mesf==7)
  510.                   mestabla=6;
  511.                if(mesf==5)
  512.                   mestabla=1;
  513.                if(mesf==6)
  514.                   mestabla=4;                  
  515.                if(mesf==8)
  516.                   mestabla=2;
  517.                if(mesf==9 || mesf==12)
  518.                   mestabla=5;
  519.                  
  520.                sumadia=diaf+mestabla;                          //sumo dia y el valor del mes(segun la tabla de meses)  
  521.                if(sumadia>6){                                    //si es mayor a 6, restarle el mayor multiplo de 7
  522.                multiplo=sumadia/7;
  523.                sumadia=sumadia-7*multiplo;
  524.                }
  525.                
  526.               multiplo=anof/28;                            //restale al año (a sus ultimos dos digitos) el mayoy multiplo de 28 que en el
  527.               sumaano=anof-multiplo*28;
  528.               multiplo=sumaano/4;      //anof/4;
  529.               sumaano=sumaano+multiplo;                    //la tabla de siglos del año 2000=0 por lo tanto no lo sumo
  530.  
  531.  //--------- si es bisiesto resta uno
  532.               if((mesf==1 || mesf==2) && (anof==16 || anof==20 || anof==24 || anof==28 || anof==32 || anof==36 || anof==40 || anof==44 || anof==48 || anof==52 || anof==56 || anof==60 || anof==64 || anof==68 || anof==72 || anof==76 || anof==80 || anof==84 || anof==88 || anof==92 || anof==96))
  533.                sumaano=sumaano-1;
  534.                
  535.               dianumero=sumadia+sumaano;
  536.               if(dianumero>6){
  537.               multiplo=dianumero/7;
  538.               dianumero=dianumero-multiplo*7;
  539.               }          
  540. //--------------------------------------------------------------------------------------
  541. //encendido unidadgps
  542.              
  543.              
  544.               if(dianumero==2){                 //si es lunes
  545.               if(horaf>100000) unidadgps=1;                                       //si la hora es mayor de las 10 pm hora internacional    
  546.                else{unidadgps=0;}
  547.               }
  548.               if(dianumero==3 || dianumero==4 || dianumero==5|| dianumero==6) {    //si es martes, miercoles, jueves o viernes
  549.                if(!(horaf>10000 && horaf<100000)) unidadgps=1;                   //si la hora no esta entre la 1 am y 10 am hora internacional
  550.                else{unidadgps=0;}
  551.               }
  552.               if(dianumero==0){                                                    //si es sabado
  553.                if(horaf<10000 || (horaf>100000 && horaf<170000)) unidadgps=1;
  554.                else{unidadgps=0;}}
  555.              
  556.  // Manual / Automatica            
  557.                seleccionar();
  558.              
  559.  //se envia mensaje sms
  560.  
  561.                enviosms();
  562.              
  563.  //------------------------------------------------------------------------------------------  
  564.  
  565.               init_cbuff();
  566.  
  567.               flagcommand=0;            // Desactivo flag de comando pendiente.
  568.                      
  569.     /*          lcd_init();
  570.               lcd_gotoxy(1,1);
  571.               printf(lcd_putc,"%f %s",degradianesf2,degradianes2);
  572.               lcd_gotoxy(1,2);
  573.               printf(lcd_putc,"lontud %05.5f",longitudf);
  574.               delay_ms(2000);
  575.               init_cbuff();
  576.               lcd_init();
  577.               lcd_gotoxy(1,1);
  578.               printf(lcd_putc,"fecha %f",fechaf);
  579.               lcd_gotoxy(1,2);
  580.               printf(lcd_putc,"dia %u unidadON %u",dianumero,unidadgps);
  581.               delay_ms(2000);
  582.               lcd_init();
  583.               lcd_gotoxy(1,1);
  584.               printf(lcd_putc,"udadm%u manual%u",unidadsms,manualsms);
  585.               lcd_gotoxy(1,2);
  586.               printf(lcd_putc,"udag %u unidad %u",unidadgps,unidad);    */  
  587.              
  588.              
  589.               printf("AT+CMGF=1\r\n");  
  590.               delay_ms(2000);
  591.               flagcommand=0;            // Desactivo flag de comando pendiente.          
  592.               init_cbuff();          
  593. }
  594.  
  595. ///////////////////////////////////////
  596. // INTERRUPCIONES : RDA Recepción USART
  597. ///////////////////////////////////////
  598.  
  599. #int_rda
  600. void serial_isr() {          // Interrupción recepción serie USART
  601.  
  602.    char rcvchar=0x00;        // último caracter recibido
  603.  
  604.    if(kbhit()){              // Si hay algo pendiente de recibir ...
  605.       rcvchar=getc();        // lo descargo y ...
  606.       add_2_cbuff(rcvchar);  // lo añado al buffer y ...    
  607.    }
  608. }
  609.  
  610. ///////////////////////////////////////
  611. // MAIN
  612. ///////////////////////////////////////
  613.  
  614. void main() {
  615.  
  616.    enable_interrupts(int_rda); // Habilita Interrupción RDA <<<<estas dos lines deben ir primero que todo
  617.    enable_interrupts(global);  // Habilita interrupciones
  618.   // write_int16_eeprom(0x05, (int16)(servicios));  
  619.    servicios = (int16)read_int16_eeprom(0x05);
  620.  
  621.    delay_ms(100);
  622.    init_cbuff();               // Borra buffer al inicio
  623.    commad_menu();
  624.    do {
  625.       creditos();
  626.       sensores();
  627.       puerta();
  628.       if(flagcommand==1) commad_process(); // Hay algo pendiente de procesar y lo procesa.
  629.       if(flagcommand==2) corrertiempo();  
  630.      
  631.    } while (TRUE);
  632.  
  633.  }

si necesitan saber algo mas no duden en preguntarme, perdon por el codigo tan largo
muchas gracias, espero de su apoyo

en la siguiente imagen se puede apreciar que envio un caracter por serial "k" y el pic activa la interrupcion pero cuando pasa el getc no me guarda ese valor "k" en la variable rcvchar

muchas gracias espero un me ayuden

* Sin título.png
(75.22 kB, 1183x640 - visto 278 veces)
« Última modificación: 09 de Agosto de 2017, 20:11:29 por juandavidcy »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #1 en: 09 de Agosto de 2017, 22:14:26 »
Fijate si se activa algun bit de error de la UART.

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #2 en: 10 de Agosto de 2017, 12:27:05 »
gracias por responder killer,
me podrias indicar donde puedo verificar si me esta dando ese posible error de la UART

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #3 en: 10 de Agosto de 2017, 14:07:42 »
Si podes ver los registros del PIC en el proteus serian los bits 1 y 2 ( OERR y FERR ) del registro RCSTA.

Sino agrega codigo para que active alguna salida al encontrar este error. Como para indicar si es algo de eso.

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #4 en: 11 de Agosto de 2017, 17:45:27 »
no logro ver el registro RCSTA en proteus
pero no te comprendo lo de encontrar el error con codigo amigo.
Lo que hace luego de pasar por la variable en donde quiero que guarde lo que recibio(que no lo hace), es guardar ese valor en el buffer, pero como no recibio nada, pues guarda un espacio en blanco y me cuenta un caracater de la cadena.

Aun no se porque se presenta el problema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #5 en: 11 de Agosto de 2017, 18:40:45 »
Esos 2 bits indican errores en la recepcion del caracter, en el caso de OERR evita que recibas los siguientes caracteres, por lo cual estarias trabado siempre recibiendo el mismo caracter. No deberia ocurrir en una simulacion imagino.

Tambien si es posible ver si es siempre a un mismo valor de cbuff que ocurre u otro distinto.

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

Mirando un poco mas el manejo del array me encuentro con:

Código: C
  1. for(i=0;i<lenbuff,c!=0x00;i++){

Estoy mas que seguro que esa coma no es lo que querias poner. y tal ves buscas una AND

Otra cosa mas, Tambien vas a tener problemas por no reiniciar el indice xbuff cuando es debido.
Lo haces dentro de cuando flagcommand es igual a 2. Pero si te agarra la interrupcion al comienzo del do..while del main, ocurre que pasaria mucho tiempo hasta llegar a ese punto, si llegas a recibir otro caracter, estarias escribiendo en un indice que no es el correcto

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #6 en: 12 de Agosto de 2017, 16:23:06 »
intentare mirar ese registro OERR pero no tengo idea como jejeej

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

modifique esta linea en el codigo del pic que si me funciona en el 18f25k20, pero pues igual el codigo sigue funcionando
Código: C
  1. for(i=0;i<lenbuff&&c!=0x00;i++){


* Sin título.png
(32.65 kB, 718x435 - visto 278 veces)


y lo de borrar el array, lo hago casi en todas las funciones jejeje, no solo en la tarea corrertiempo(), precisamente para mantener el array vacio.
« Última modificación: 14 de Agosto de 2017, 13:50:19 por juandavidcy »

Desconectado juandavidcy

  • PIC10
  • *
  • Mensajes: 18
Re:no me funciona el getc luego de que inicia la interrupcion del serial
« Respuesta #7 en: 23 de Agosto de 2017, 13:29:57 »
me canse de buscar el problema y no le di

por ultimo decidí cambiar por el 18f14k50 que tiene los mismos periféricos que el 16f1829 y funciona muy bien


 

anything