TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: rasengan04 en 28 de Noviembre de 2019, 19:26:49
-
Hola:
estoy trabajando con un PIC 18F4580 y tengo que comunicarlo con un modulo que tiene ya establecido un baudaje de 115200
y manda cadenas de 10 bytes minimo cada 100ms.
yo con el PIC le mando cada 200ms una cadena para verificar la conexión y aparte los comandos para el intercambio de datos.
ya logre mantener la comunicación pero cuando el PIC tiene que recibir datos se queda colgado.
#include <18F4580.h>
#device ADC=16
#FUSES NOWDT
#FUSES WDT128
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOXINST
#use delay(crystal=20000000)
#use RS232(BAUD=115200,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
int contador;
#int_RDA
void RDA_isr()
{
contador++;
in=getc();
}
void main()
{
enable_interrupts(int_RDA);
enable_interrupts(GLOBAL);
while(1){
if(contador>=150){
contador=0;
output_toggle(pin_b7);
}
}
}
al quitar el comando getc() vi que el pic si detectaba los datos.
cual podría ser la causa??
-
Proba agregandole el ERRORS al USE RS232
#use RS232(BAUD=115200,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7, ERRORS)
Asi si detecta un error, lo limpia y lo guarda en la variable RS232_ERRORS
-
Proba agregandole el ERRORS al USE RS232
#use RS232(BAUD=115200,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7, ERRORS)
Asi si detecta un error, lo limpia y lo guarda en la variable RS232_ERRORS
Muchas gracias, ya pude recibir los datos.
-
Quiero enviar un dato a mi PC por el protocolo rs232 , al momento de querer enviar el valor de una variable flotante mi PC recive una serie de caracteres sin sentido cuando debería de recibir un número con dos decimales, para ver los datos que recibía la PC de mi pic fue el Hércules
Use un modulo rs232 a ttl y un cable db9 a USB para poder conectar los pines rx y tx a mi PC espero alguien me pueda asesorar.
Dejo mi código abajo por si alguien puede ayudar
# include <16f877a.h>
# device adc=16
# fuses xt, wdt, brownout,NOWDT
# use delay (clock = 4M)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
# use standard_io (a,b,c,d)
# include <lcd.c>
float bits_analog;
float xvalu;
void main (){
lcd_init();
LCD_PUTC("\f");
setup_adc_ports (AN0_AN1_AN3);
setup_adc(adc_clock_div_16);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255,1);
while (true){
set_adc_channel(0);
delay_ms (2);
bits_analog = read_adc();
delay_ms (300);
set_pwm1_duty (bits_analog);
delay_ms (2);
xvalu=(bits_analog*100/65528);
putc(xvalu);
LCD_PUTC("\f");
LCD_gotoxy(1,1);
printf(lcd_putc,"valor: %f ",xvalu);
lcd_gotoxy(12,1);
lcd_putc("%");
}
}
-
putc(xvalu);
El putc no tiene formato, por lo tanto te va a imprimir cualquier cosa, te va a enviar los primeros 8 bits seguramente del float...
Respecto al printf si te deberia funcionar
printf(lcd_putc,"valor: %f ",xvalu);
Pero el printf por lo que veo lo envias al LCD, y no a la UART.
Si queres enviar el float a la UART
te sugiero que:
- Crees un array de char para que contenga todo el float
- Uses sprintf, no se si tenes que agregar string.h
- Y ahora envies el texto por la UART