TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Medusa en 18 de Enero de 2008, 15:14:36
-
Hola amigos,
Estoy tratando de hacer un programa que se encuentra en un lazo infinito pero que cuando ingrese un caracter por el hipertterminal el pic sea interrumpido por el puerto serie, lea el puerto y lo vuelva a retransmitir para que lo pueda ver en el hipertermional.
este es mi codigo, quisiera saber cual es el error por que no logro visualizar nada.
#include <18f4550.h>
//#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define USE_INTERRUPTS 1
char dato;
// INTERRUPCION por RECEPCION SERIE -------------------------------------------
#int_rda
void serial_isr() {
if(kbhit()){
dato=getc();
printf("Dato Recibido %S\r\n",dato);
}
}
void main() {
disable_interrupts(global);
disable_interrupts(int_timer1);
disable_interrupts(int_rda);
disable_interrupts(int_ext);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_c(0b10000000);
while (TRUE);
{
//lazo infinito
}
}
-
¿Cuando configuras el Hyperterminal te fijas en poner --> Control de Flujo Ninguno, envez de Hardware?
-
También deberías habilitar la interrupción:
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
-
Hola modulay,
He habilitado las interrupciones y sigue con el mismo problema, el codigo lo hestoy probando con el Proteus7.2
-
Yo estoy teniendo un problema similar con un 18F2550.
Resulta que estos micros,además del 2455 y el 4455 tienen un defecto de fabricación en la usart,por lo que hay posibilidad de que sea el motivo de que no funcione el asunto,el menos en mi caso que lo estoy probando físicamente sobre el pic.
Puedes probar con otro micro como el 16F877 por ejemplo y ver si te ocurre lo mismo.
Yo estoy esperando que me lleguen unos que pedí para poder descartar que el problema venga de un bug de fabricación.
-
Yo lo estoy haciendo fisicamente en un 16f877a y no sale nada por pantalla con el programa que ha colgado.
Lo retoque un poco elimine algunas cosas que no necesitaba y las cabeceras las cambie.
Yo tambien tengo un problema y es que cada vez que salta la interrupcion y hace el getc() el valor que toma es un 0 y todo el rato me manda 0 al puerto serie.
El código de mi programa esta en: http://www.todopic.com.ar/foros/index.php?topic=20027.0 (http://www.todopic.com.ar/foros/index.php?topic=20027.0)
En el hilo hay varios codigos el "mas" correcto es el ultimo.
-
Tienes que habilitar las interrupciones como te ha dicho Modulay.
En el printf("Dato Recibido %S\r\n",dato); ... esa S debe ser una c.
Yo lo he probado en PROTEUS con un 877 (la versión de este ordenador no tiene el 4550) y sí que va ... faltaría probarlo físicamente.
-
En el printf("Dato Recibido %S\r\n",dato); ... esa S debe ser una c.
Hola Poncher,
Tenias razon cambie el formato y funciona perfecto, gracias