Estoy trabajando con un PIC16F1829. Tengo una interfaz UART que funciona principalmente correctamente. Mi problema es que cada vez que escribo un carácter en CoolTerm, recibo un eco de ese personaje o algún otro carácter. Se ve en la captura de pantalla cuando escribo "m", aparece una "m" que se repite con mis datos. Otras veces es una "l" o algún otro personaje y luego mis datos.
Mipreguntaes,¿quéestácausandoelecodenuevo?NoesdeCoolTerm.
Loheintentadohastaahora: -DesactivarcualquiertransmisiónenelladoPIC.Todaviaveoesteeco -AlusarPythonparatransmitiryrecibirdatos,todavíaveoestetipodeeco -IntentéreemplazarelPIC -Intentédiferentestasasdebaudios
EstecódigofuegeneradoporelgeneradordeMCC
voidEUSART_Initialize(void){//SettheEUSARTmoduletotheoptionsselectedintheuserinterface.//ABDOVFno_overflow;SCKPNon-Inverted;BRG1616bit_generator;WUEdisabled;ABDENdisabled;BAUDCON=0x08;//SPENenabled;RX98-bit;CRENenabled;ADDENdisabled;SRENdisabled;RCSTA=0x90;//TX98-bit;TX9D0;SENDBsync_break_complete;TXENenabled;SYNCasynchronous;BRGHhi_speed;CSRCslave;TXSTA=0x24;//BaudRate=115200;SPBRGL34;SPBRGL=0x22;//BaudRate=115200;SPBRGH0;SPBRGH=0x00;
}
uint8_tEUSART_Read(void){
while(!PIR1bits.RCIF){}if(1==RCSTAbits.FERR){chara=RCREG;//ReadabytetoclearFERR}if(1==RCSTAbits.OERR){//EUSARTerror-restartRCSTAbits.CREN=0;RCSTAbits.CREN=1;}returnRCREG;
}
anularEUSART_Write(uint8_ttxData){
while(0==PIR1bits.TXIF) { }
TXREG=txData;//WritethedatabytetotheUSART.
}/** Findeldocumento*/voidwrite_uart_str(char*str){ while(*str!='\0') { EUSART_Write(*str); (char*)str++; }}char*read_uart_str(){ #defineMAX_UART_SIZE32 inti=0; charch; charstr[MAX_UART_SIZE];
for(i=0;i<MAX_UART_SIZE;i++){str[i]='
voidEUSART_Initialize(void){//SettheEUSARTmoduletotheoptionsselectedintheuserinterface.//ABDOVFno_overflow;SCKPNon-Inverted;BRG1616bit_generator;WUEdisabled;ABDENdisabled;BAUDCON=0x08;//SPENenabled;RX98-bit;CRENenabled;ADDENdisabled;SRENdisabled;RCSTA=0x90;//TX98-bit;TX9D0;SENDBsync_break_complete;TXENenabled;SYNCasynchronous;BRGHhi_speed;CSRCslave;TXSTA=0x24;//BaudRate=115200;SPBRGL34;SPBRGL=0x22;//BaudRate=115200;SPBRGH0;SPBRGH=0x00;
';}do{ch=EUSART_Read();str[i]=ch;i++;}while(ch!='while(!PIR1bits.RCIF){}if(1==RCSTAbits.FERR){chara=RCREG;//ReadabytetoclearFERR}if(1==RCSTAbits.OERR){//EUSARTerror-restartRCSTAbits.CREN=0;RCSTAbits.CREN=1;}returnRCREG;
');return(char*)str;
}charread_uart_ch(){ devuelveEUSART_Read();}
vacíoprincipal{ //inicializareldispositivo SYSTEM_Initialize();
//Alusarinterrupciones,debeconfigurarlosbitsdehabilitacióndeinterrupciónglobalyperiférica//Usalassiguientesmacrospara://HabilitarlasinterrupcionesglobalesINTERRUPT_GlobalInterruptEnable();//HabilitarlasinterrupcionesperiféricasINTERRUPT_PeripheralInterruptEnable();//Desactivarlasinterrupcionesglobales//INTERRUPT_GlobalInterruptDisable();//Desactivarlasinterrupcionesperiféricas//INTERRUPT_PeripheralInterruptDisable();charch=0;write_uart_str((char*)("\ nRunning Version:"));
write_uart_str (VERSION);
write_uart_str ("\ n");
acelerómetro_init ();
write_uart_str ("\ nSeleccione la opción \ n");
write_uart_str (menu_options);
mientras (1) {
// Añade tu código de aplicación
ch = 0;
mientras (! ch)
ch = read_uart_ch ();
// write_uart_str ("Read:");
// write_uart_str (ch);
// write_uart_str ("\ n");
interruptor (ch) {
caso 'c':
{
accelerometer_calibrate ();
write_uart_str ("Acelerómetro calibrado \ n");
descanso;
}
caso 'i':
{
int id = accelerometer_get_deviceID (); // Debería ser 0xE5
char str_buf [16];
write_uart_str ("ID de dispositivo:");
write_uart_str (itoa (str_buf, id, 10));
write_uart_str ("\ n");
descanso;
}
caso 'x':
{
struct accel_xyz xyz = accelerometer_read ();
char str_buf [16];
write_uart_str ("\ nX:");
write_uart_str (itoa (str_buf, xyz.x, 10));
write_uart_str ("\ n");
descanso;
}
caso 'y':
{
struct accel_xyz xyz = accelerometer_read ();
char str_buf [16];
write_uart_str ("\ nY:");
write_uart_str (itoa (str_buf, xyz.y, 10));
write_uart_str ("\ n");
descanso;
}
caso 'z':
{
struct accel_xyz xyz = accelerometer_read ();
char str_buf [16];
write_uart_str ("\ nZ:");
write_uart_str (itoa (str_buf, xyz.z, 10));
write_uart_str ("\ n");
descanso;
}
caso 'm':
{
struct accel_xyz xyz = accelerometer_read ();
char str_buf [16];
xyz = acelerómetro_read ();
write_uart_str (itoa (str_buf, xyz.x, 10)); write_uart_str ("");
write_uart_str (itoa (str_buf, xyz.y, 10)); write_uart_str ("");
write_uart_str (itoa (str_buf, xyz.z, 10));
write_uart_str ("\ n");
descanso;
}
caso 'r':
{
struct accel_xyz xyz = accelerometer_read ();
char str_buf [16];
write_uart_str ("\ nPresione p para pausar \ n");
write_uart_str ("X Y Z \ n");
hacer {
xyz = acelerómetro_read ();
write_uart_str (itoa (str_buf, xyz.x, 10)); write_uart_str ("");
write_uart_str (itoa (str_buf, xyz.y, 10)); write_uart_str ("");
write_uart_str (itoa (str_buf, xyz.z, 10));
write_uart_str ("\ n");
} while (1); // read_uart_ch ()! = 'p'
descanso;
}
}
}
}
Estoy utilizando este módulo de traducción de nivel RS232 para el controlador: está conectado a los pines TX / RX en el PIC.
enlace