#include <18f4520.h>
#use delay(clock=20000000) //Meto 20M por el cristal, a ver como va
#fuses XT, NOWDT, PUT, NOWRT, HS
//#use fast_io(B)
#use standard_io(C)
#byte CMCON = 0xFB4
#use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
//Variables globales de programa
int16 retPreTrig = 100; //100 us para el pretrigger
int16 retardo = 59;
int16 ventana = 7;
int Pulsador = 0;
char ch;
#INT_RDA
void serial_isr()
{
ch = getchar();
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
putc(ch);
}
#INT_COMP
void isr(void)
{
if(Pulsador == 1)
{
//delay_ms(retardo);
while(C1OUT != 1)
{
}
if(C1OUT == 1)
{
delay_us(retPreTrig);
output_high(PIN_C1);
delay_ms(retardo);
output_high(PIN_C0);
delay_ms(ventana);
output_low(PIN_C0);
output_low(PIN_C1);
Pulsador = 0;
}
}
}
void main()
{
//Configuración de puertos e interrupciones
CMCON = 0b00000110;
setup_comparator(A0_A3_A1_A2);
setup_vref(VREF_HIGH|15|VREF_F5);
set_tris_b(0x00);
set_tris_a(0x0F);
set_tris_c(0x80);
enable_interrupts(INT_RDA);
enable_interrupts(INT_COMP);
enable_interrupts(GLOBAL);
output_c(0);
output_b(0);
//hilo principal
while(TRUE)
{
delay_ms(100);
if(input(PIN_B7)==1)
{
//putc('1');
printf("HOLA");
putc(ch);
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
}
}
}
Estoy haciendo diversas pruebas y ya no se porque falla la verdad...Los modulos usart suelen tener un fifo de 3 bytes “creo”, en la recepción. Ese buffer hay que leerlo siempre antes de que se llene por que si se llena se activa el error de overflow y se para la recepcion de la usart hasta que la reinicies.
#include <18f4520.h>
#use delay(clock=20000000) //Meto 20M por el cristal, a ver como va
#fuses XT, NOWDT, PUT, NOWRT, HS
//#use fast_io(B)
#use standard_io(C)
#byte CMCON = 0xFB4
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N)
//Variables globales de programa
int16 retPreTrig = 100; //100 us para el pretrigger
int16 retardo = 59;
int16 ventana = 7;
int Pulsador = 0;
int bandera = 0;
char ch;
#INT_RDA
void serial_isr()
{
bandera = 1;
}
/*#INT_COMP
void isr(void)
{
if(Pulsador == 1)
{
//delay_ms(retardo);
while(C1OUT != 1)
{
}
if(C1OUT == 1)
{
delay_us(retPreTrig);
output_high(PIN_C1);
delay_ms(retardo);
output_high(PIN_C0);
delay_ms(ventana);
output_low(PIN_C0);
output_low(PIN_C1);
Pulsador = 0;
}
}
}*/
void main()
{
//Configuración de puertos e interrupciones
//CMCON = 0b00000110;
//setup_comparator(A0_A3_A1_A2);
//setup_vref(VREF_HIGH|15|VREF_F5);
set_tris_b(0x00);
set_tris_a(0x0F);
set_tris_c(0x80);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
//enable_interrupts(INT_COMP);
output_c(0);
output_b(0);
//hilo principal
while(TRUE)
{
delay_ms(100);
if(input(PIN_B7)==1)
{
//putc('1');
printf("HOLA");
//putc(ch);
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
}
if(bandera==1)
{
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
bandera = 0;
}
}
}
A alguien se le ocurre que puede fallar?Hola,
Muchas gracias por tu respuesta.
He probado el código que me has pasado, pero en ninguno de los dos casos consigo que avance más allá de la primera pregunta, parece que el getchar lo bloquea ahí...
No tengo ni idea de que pasa, he probado con otro micro por si se hubiese estropeado, pero pasa igual.
El circuito que tengo es sencillo, simplemente el micro (pic18f4520) conectado a un MAX232, con un cristal de 20 MHz y el MAX a un conector de 3 salidas y eso al PC.
Si el fallo estuviese en el hardware entiendo que no debería funcionar el envío de datos tampoco..., además en el conector del MAX cuando pongo el multímetro y envío datos desde el PC, varía la tensión, pero el micro no lo recibe...
A alguien se le ocurre algo (también probé a reinstalar el compilador de CCS por una versión más actual a ver que pasaba pero es igual...).
Gracias de antemano y un saludo.
#include <18f4520.h>
#USE delay(clock=20000000) //Meto 20M por el cristal, a ver como va
#fuses NOWDT, PUT, NOWRT, HS
#USE standard_io(C)
#byte CMCON = 0xFB4
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N, ERRORS)
//Variables globales de programa
int16 retPreTrig = 100; //100 us para el pretrigger
int16 retardo = 59;
int16 ventana = 7;
int Pulsador = 0;
int bandera = 0;
char ch;
#INT_RDA
void serial_isr(void)
{
ch=getchar();
bandera = 1;
}
void main()
{
//CREN = 0;
set_tris_b(0x80);
set_tris_a(0x0F);
//set_tris_c(0x80);
//output_c(0);
output_b(0);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(1)
{
/*if(kbhit())
{
output_toggle(PIN_B6);
delay_ms(500);
}*/
if(bandera==1)
{
output_toggle(PIN_B6);
putc(ch);
puts(ch);
bandera=0;
}
if(input(PIN_B7)==1)
{
//printf("HOLA");
putc('c');
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
}
}
}#include <18f4520.h>
#use delay(clock=20000000) //Meto 20M por el cristal, a ver como va
#fuses NOWDT, PUT, NOWRT, HS
#use fast_io(B)
#use standard_io(C)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N, ERRORS)
//Variables globales de programa
int bandera = 0;
char ch;
#INT_RDA
void serial_isr(void)
{
ch=getchar();
bandera = 1;
}
void main()
{
//Configuración de puertos e interrupciones
set_tris_b(0x80);
set_tris_a(0x0F);
set_tris_c(0x80);
//output_c(0);
output_low(PIN_C6);
output_b(0);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
//hilo principal
while(TRUE)
{
delay_ms(100);
if(input(PIN_B7)==1)
{
//putc('1');
printf("HOLA");
//putc(ch);
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
}
if(bandera==1)
{
output_toggle(PIN_B6);
printf("retardo = %c ",ch);
bandera=0;
}
/*if(kbhit()==1)
{
ch=getchar();
output_high(PIN_B6);
delay_ms(1000);
output_low(PIN_B6);
putc(ch);
}*/
}
}Pues resulta que, si dejo ese output_c(0) sin comentar (al principio del main) me funciona el micro sólo para recibir datos, pero no es capaz de enviar nada, sin embargo si lo dejo comentado (o con el PIN_C7 sin tocar) me funciona la transmisión solamente pero no la recepción. No tengo ni idea de lo que pasa pero acotando he visto que el fallo está ahí.