Problemas al LEER los datos por comunicación serial con CCS

Iniciado por CIBERIK, 26 Febrero 2016, 01:41 AM

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

CIBERIK

hola amigos tengo una duda referente a un programa de lectura de datos que proviene del computador , este ocupando el protocolo serial, usando el PIC16f628a

quiero recibir 5 datos y mostrarlos en 4 display de 7 segmentos, hastaahora tengo un programa que lee los datos, pero cunado hago la segunda lectura el programa se bloquea...estoy buscando el error para correguir el problema

dejo el codigo, para que puedan orientar con el programa,a porfavor


    #include <16f628A.H>
    #fuses NOMCLR
    #fuses INTRC_IO
    #FUSES NOWDT                    //No Watch Dog Timer
    //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
    #FUSES NOPUT                    //No Power Up Timer
    #FUSES NOPROTECT                //Code not protected from reading
    #FUSES NOBROWNOUT               //No brownout reset
    #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD                    //No EE protection
    #FUSES RESERVED                 //Used to set the reserved FUSE bits
    #use delay (clock=4000000)
    #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
    #define display_1     PIN_B4
    #define display_2     PIN_B5
    #define display_3     PIN_B6
    #define display_4     PIN_B7
    #use     fast_io(b)        // Para usar el puerto b como I/O Estándar (Con TRISB)
     
// NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};

int8 Unidad_1=0;
int8 Decena_1=0;
int8 Unidad_2=0;
int8 Decena_2=0;
int tiempo=1;
/////////////////////////////////////////////////////////////////////////
/// DECLARACIONES QUE NO ESTOY SEGURO/////////////////////
char trama_serial[5];
int1 flag_rx = 0; 
volatile int indice=0;
#INT_RDA
void RECEPCION_RS232(void)
{
   trama_serial[indice]= getc();
   indice++;
   flag_rx = 1; 
}

void main(void)

{

set_tris_b(0b00001011);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while (true){

        //// SEPARO LA TRAMA 12&34
         Decena_1 = ((trama_serial[0])-48); Unidad_1 = ((trama_serial[1])-48);
         Decena_2 = ((trama_serial[3])-48); Unidad_2 = ((trama_serial[4])-48);
           
       
         // Muestro el display 1 - DIGITO [1] 2 & 3 4
         output_b(0x10);
         output_a(Numeros[Decena_1]);
         delay_ms(tiempo);
         
         // Muestro el display 2 - DIGITO 1 [2] & 3 4
         output_b(0x20);
         output_a(Numeros[Unidad_1]);
         delay_ms(tiempo);
         
         // Muestro el display 3 - DIGITO 1 2 & [3] 4
         output_b(0x40);
         output_a(Numeros[Decena_2]);
         delay_ms(tiempo);
         
         // Muestro el display 4 - DIGITO 1 2 & 3 [4]
         output_b(0x80);
         output_a(Numeros[Unidad_2]);
         delay_ms(tiempo);
         
   }
}


MAFUS

Veo que usas indice volátil pero nadie mas que el propio programa te lo va a cambiar así que debería ser una variable normal.

indice de RECEPCION_RS232, en teoría va de 0 a 4 pero cuándo superas el límite superior no hay nada que lo haga volver a 0 con lo que continuará con 5, 6,... y sobreescribiendo a zonas posteriores de memoria de forma descontrolada.

Tal como usas el programa deberías cambiar los #define display_1     PIN_B4 por #define display_1     0x01 y sucesivamente con los demás defines para usar output_b(display_1);

CIBERIK

gracias amigo por responder

pero lo que me indicas no lo estoy ocupando en el programa, se me quedo escrito...esas instrucciones la cambie por :




// Muestro el display 1 - DIGITO [1] 2 & 3 4
         output_b(0x10);
         output_a(Numeros[Decena_1]);
         delay_ms(tiempo);

         // Muestro el display 2 - DIGITO 1 [2] & 3 4
         output_b(0x20);
         output_a(Numeros[Unidad_1]);
         delay_ms(tiempo);

         // Muestro el display 3 - DIGITO 1 2 & [3] 4
         output_b(0x40);
         output_a(Numeros[Decena_2]);
         delay_ms(tiempo);

         // Muestro el display 4 - DIGITO 1 2 & 3 [4]
         output_b(0x80);
         output_a(Numeros[Unidad_2]);
         delay_ms(tiempo);



aun trato estoy de de sacar la fala