Hola a todos, tanto tiempo.
Estos días he vuelto a retomar la programación de los pic. especialmente con el PIC16LF18324 y CCS.
Estoy experimentando con este micro con las Uart por software, en este caso implemento dos uart pero estoy teniendo problemas con la transmisión y recepción de datos. ya que he intentado hacer un simple eco de lo que entra por una uart, sacarlo de forma inmediata por la otra uart, pero en esto pierdo caracteres:
Envio por otro micro esta trama: 123456789
while(TRUE)
if(kbhit(UART_SOFT))
{
byte a = getc(UART_SOFT);
putc(a,RS485);
}
if(kbhit(RS485))
{
byte b = getc(RS485);
putc(b,UART_SOFT);
}
y me retorna esto: 13579
ahora al ver este problema genere otro codigo. Lo que hace es, recepcionar una trama X y pasado un timeout reenviarla por la otra uart. pero en esto, de ves en cuando me quita caracteres. Envio: 123456789 y retorna 7 en otra oportunidad 1234567, etc.
El codigo de esta segunda prueba que me da error es:
#include <main.h>
int1 UART_Read_OK = FALSE;
int1 RS485_Read_OK = FALSE;
#int_timer0
void timer0_isr()
{
UART_Read_OK = TRUE;
}
#int_timer2
void timer2_isr()
{
RS485_Read_OK = TRUE;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_BIT); //4,0 ms overflow
//setup_timer_2(T2_DIV_BY_16,15,16); //256 us overflow, 4,0 ms interrupt
////setup_timer_2(T2_DIV_BY_16,255,1); //4,0 ms overflow, 4,0 ms interrupt
setup_timer_2(T2_DIV_BY_16,249,5); //~4ms interrupts
enable_interrupts(GLOBAL);
output_low(RS485_RX_ENABLE_PIN);
//fprintf(UART_SOFT, "RS-232: Transmision por Uart\n\r");
//fprintf(RS485,"RS485: Transmision por RS-485\n\r");
byte BufferRS485[NbytesBufferRS485];
int RS485_Flag = 0x00;
byte BufferUart[NbytesBufferUart];
int Uart_Flag = 0x00;
while (TRUE)
{
///////////////////////////////////////////////////////////////////
if(kbhit(UART_SOFT))
{
BufferUart[Uart_Flag++] = getc(UART_SOFT);
clear_interrupt(int_timer0);
set_timer0(0);
enable_interrupts(int_timer0);
output_high(LED_GREEN);
}
if(UART_Read_OK)
{
UART_Read_OK = FALSE;
disable_interrupts(int_timer0);
for(int a=0; a<Uart_Flag;a++)
putc(BufferUart[a],RS485);
//fprintf(RS485,"%s",BufferUart);
memset(BufferUart, '\0', Uart_Flag);
Uart_Flag = 0x00;
output_low(LED_GREEN);
}
////////////////////////////////////////////////////////////
if(kbhit(RS485))
{
BufferRS485[RS485_Flag++] = getc(RS485);
clear_interrupt(int_timer2);
set_timer2(0);
enable_interrupts(int_timer2);
output_high(LED_RED);
}
if(RS485_Read_OK)
{
RS485_Read_OK = FALSE;
disable_interrupts(int_timer2);
for(int a=0; a<RS485_Flag;a++)
putc(BufferRS485[a],UART_SOFT);
//fprintf(UART_SOFT,"%s",BufferRS485);
memset(BufferRS485, '\0', RS485_Flag);
RS485_Flag = 0x00;
output_low(LED_RED);
}//*/
}
}
tendran alguna respuesta para mi problema en ambos codigos?
Saludos