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);
}
}
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);
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