Carácter impar que se hizo eco desde UART - PIC16F

0

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

    
pregunta I Gr

1 respuesta

-1

Creo que he encontrado el problema.

Cuando se devuelven caracteres incorrectos, tiende a ser una falta de coincidencia en la tasa de bits:

  • Su código PIC utiliza // Velocidad de transmisión = 115200; SPBRGL 34;
  • CoolTerm también está usando 115200

Sin embargo, mirando la hoja de datos del controlador de nivel TTL, indica:

• Funciona hasta 250 kbit / s

Si regresa a su código para el PIC (y CoolTerm), cambie la tasa de bits del UART a 250 kbit / s, debería resolver el problema.

También le sugeriría que lo conecte a un osciloscopio para ver exactamente lo que está obteniendo con un solo disparo.

    
respondido por el Bilal

Lea otras preguntas en las etiquetas