Autor Tema: Problema lectura PIC18F2480  (Leído 1745 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Problema lectura PIC18F2480
« en: 28 de Agosto de 2017, 14:50:55 »
Buenas. Trato de escribir y enviar por el puerto RS232 del PIC18F2480 desde hace algún tiempo. Conseguí que escribiese y leyese aunque lo hacía desplazado: le enviaba 123 y guardaba "espacio12" y si luego enviaba 456, guardaba "345". Pues bien, tratando de arreglar este problemame comenzó a dar problemas en la escritura (función que he hecho yo, que diferencia entre caracter y cadena para enviar mediante TXREG como veréis en el cóigo que pongo más adelante).

Pues bien, me pasó una cosa extrañísima: un día toqué algo que solo me imprimía los caracteres sueltos pero no las cadenas y continuaba con el problema de lectura. Al día siguiente, el mismo código, enviaba basura, pero solo corriendo normal, es decir, en debug sí escribe bien y recibe correctamente en ambos tipos de funcionamiento. No lo entiendo.

Además, cuando le hago debug, me aparece un aviso de que la memoria está protegida pero en la configuracion lo tengo todo OFF. Tampoco sé que pasa aquí, aunque no me supone un problema (a menos que esté relacionado con lo anterior).

Uso un portatil con puerto serie, MPLAB y C18. Tengo una placa perforada que he soldado yo mismo pero no  creo que sea problema del hardware y he cambiado ya el PIC y el MAX232 que uso para comunicarme con el PC para descartar, pero nada. Os paso el código:

Archivo V7_define:
Código: [Seleccionar]
#define COLGADO 10000  //Se establece a 5s el tiempo para admitir que el programa está colgado
#define CR 13           //Retorno de carro
#pragma config OSC = IRCIO67   // Oscillator Selection bits (Internal oscillator block, CLKO function on RA6, port function on RA7)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
#pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config WDT = OFF, LVP = OFF     //0 = Single-Supply ICSP disabled
#pragma config MCLRE=ON, LPT1OSC = OFF, XINST = OFF, DEBUG=OFF
#pragma config CPB = OFF, CPD = OFF, CP0 = OFF, CP1 = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF, WRTD = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF, BBSIZ = 1024 // 1K words (2K bytes) Boot Block

Archivo V7_Declaracion_Funciones
Código: [Seleccionar]
void ConfigOSC (void);
void InicializacionPuertos(void);
void ConfigRS232(void);
void Escribe(char*, char, int);
void EsperaTSR (void);
void Lee(void);

Main principal:
Código: [Seleccionar]
#include <xc.h> // include processor files - each processor file is guarded.
#include <stdio.h>
#include <stdlib.h>
#include "V7_Define.h"
#include "V7_Declaracion_Funciones.c"

void main() {
    for (esperainicio=0;esperainicio<100000;esperainicio++);
    ConfigOSC();
    InicializacionPuertos();
    ConfigRS232();
   
    while(1){
        Escribe("HOLA", NULL, 4);
        Lee();
}
void ConfigOSC (void){
    OSCCONbits.SCS=0b11;    //Seleccion del reloj interno
    OSCCONbits.IRCF0=1;     //Reloj seleccionado a 8MHz
    OSCCONbits.IRCF1=1;
    OSCCONbits.IRCF2=1;
}
void InicializacionPuertos(void) {
    ADCON1=0x0F; //Todos entrada/salida digitales.//DESHABILITA CONEERTIDORES A/D
    TRISA=0xFF;     //Puerto completo como entrada
    TRISB=0xF0; //S1~3 como salida y E15~7 como entrada
    TRISCbits.TRISC0=1;
    TRISCbits.TRISC1=1;
    TRISCbits.TRISC2=1;
    TRISCbits.TRISC3=1;
    TRISCbits.TRISC4=1;
    TRISCbits.TRISC5=1;
    TRISCbits.TRISC6=0; //TRISC <6> (TX) puesto a cero (salida). Los demas a uno (entradas).
    TRISCbits.TRISC7=1; //TRISC <7>(RX) a 1 (entrada).
    //Nota: El control EUSART reconfigurará automáticamente el pin de entrada a salida según sea necesario.
    PORTA = 0;      //Initialize PORTA by clearing output data latches
    PORTB = 0;      //Tambien se puede hacer limpiando el LAT
    PORTC = 0;
}
void ConfigRS232(void) {
    //Configuración de los pines RC6 y RC7 del Puerto C como USART
   
    SPBRG = 103;         //Con las variables anteriores a 0, 1 y 0, velocidad = 2400
    BRG16 = 0;  //Establece la comunicación en 8 bits. Está a 0 de forma predeterminada
                //así que no es necesario especificarlo. Para 16 bits, ponerlo a 1.
    BRGH = 0;   //Comunicación a alta velocidad. "0" para baja
    SYNC = 0;   //Hace que sea asíncrono. Para síncrono hacerlo igual a uno.
    SPEN = 1;   //Serial Port Enable bit
    CREN = 1;   //Habilita la recepcion
    TXEN = 1;   //Habilita la transmision
}
void Escribe(char *c1, char c2, int tam){
    int cont3=0;

    if (c1==NULL && TXEN==1){
        TXREG=c2;
        EsperaTSR();
    }
    else if (c2==NULL && TXEN==1){
        for(cont3=0;cont3<tam;cont3++){     //Recorre las direcciones de memoria de comando
            TXREG=c1[cont3];
            EsperaTSR();
        }
    }
}
void EsperaTSR (void){
    unsigned long int watchdogEscribe=0;
    while(TRMT==0){     //Mientras haya datos esperando en TSR, esperar.
        if(watchdogEscribe==COLGADO){       //Si no se puede poner en cola...
            TXEN=0;                             //Deshabilita la escritura
            watchdogEscribe=0;                  //Resetea el contador
        }
        watchdogEscribe++;
    }
    watchdogEscribe=0;          //El ultimo fuera del if, para que siempre sea reseteado.
}
void Lee(void){
    if (RCIF==1){
        mensajeR[cont7]=RCREG;
        cont7++;
        if(OERR==1){
            CREN = 0;
            CREN = 1;
        }
    }
}
« Última modificación: 31 de Agosto de 2017, 08:24:57 por Ramon90 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema escritura PIC18F2450
« Respuesta #1 en: 28 de Agosto de 2017, 16:31:03 »
Si vas a leer por la UART, deberias hacerlo por interrupcion, y ademas deberias tener en consideracion un limite del indice, el cual no tenes

Y el envio no se porque te lo complicas tanto usando otro parametro como c2.  Implementar un timeout como tenes pero que nunca sale .... es otro tema mas a considerar.
« Última modificación: 28 de Agosto de 2017, 16:33:22 por KILLERJC »

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Re:Problema escritura PIC18F2450
« Respuesta #2 en: 31 de Agosto de 2017, 05:30:14 »
Gracias por contestar!

En cuanto a la funcion EsperaTSR, entiendo que TRMT deja de ser cero cuando deshabalito TXEN, por tanto debería salir de la función en caso de que watchdogEscribe sea igual a el número COLGADO.

Por otra parte, ya he conseguido que lea pero llevas razon en cuanto a leer por interrupciones, se me satura el buffer dando error OERR y supongo que es porque entre lectura y lectura debe ejecutar mucho código. Esto ya lo intenté pero no lo consigo. También tienes razon con el límite de capacidad del buffer de lectura: tengo que para la lectura cuando el buffer esté lleno.

La escritura está dividida en dos porque una cosa es escribir un solo caracter, y otra es pasarle un puntero de cadena (nombre del vector o cadena entre comillas). También podría pasarle siempre la direccion de memoria pero no creo que resulte más simple.

Espero tu respuesta KILLERJC!

Igualmente será bienvenida la aportación de cualquier interesado.

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Re:Problema escritura PIC18F2450
« Respuesta #3 en: 31 de Agosto de 2017, 08:18:34 »
Buenas! Estoy probando la lectura mediante interrupciones pero me sigue dando error OERR. Os paso el código a ver si hay me podéis ayudar:

Código: [Seleccionar]
void interrupt Lee(void){
    if (RCIF==1 && cont7<250){
        mensajeR[cont7]=RCREG;
        cont7++;
        if(OERR==1){
            CREN = 0;
            flag1=1;
            CREN = 1;
        }
        if(FERR==1){
            unsigned int cont6=0;
            while (FERR==1 && cont6<3){             //Tres intentos para volver a leer el byte
                mensajeR[cont7]=RCREG;
                cont6++;
            }
            cont6=0;
            if(FERR==1)
                flag1=2;
        }
    }
}

Los bits de configuracion que he usado son:

SPBRG = 51;         //Con las variables anteriores a 0, 1 y 0, velocidad = 9600
    BRG16 = 0;  //Establece la comunicación en 8 bits. Está a 0 de forma predeterminada
                //así que no es necesario especificarlo. Para 16 bits, ponerlo a 1.
    BRGH = 1;   //Comunicación a alta velocidad. "0" para baja
    SYNC = 0;   //Hace que sea asíncrono. Para síncrono hacerlo igual a uno.
    SPEN = 1;   //Serial Port Enable bit
    CREN = 1;   //Habilita la recepcion
    TXEN = 1;   //Habilita la transmision
    RCIE=1;
    GIE=1;
    PEIE=1;

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema lectura PIC18F2480
« Respuesta #4 en: 05 de Octubre de 2017, 15:17:23 »
Probalo. Vamos a sacar un par de cosas:

Código: C
  1. #include <xc.h>       // include processor files - each processor file is guarded.
  2. #include <stdint.h>
  3.  
  4. void ConfigOSC(void);
  5. void InicializacionPuertos(void);
  6. void ConfigRS232(void);
  7. void Lee(void);
  8. void EsperaTSR(void);
  9.  
  10. #define NULL 0
  11. #define COLGADO 500
  12.  
  13. uint8_t mensajeR[64];
  14. uint8_t cont;
  15.  
  16. const char mensajeHola[] = "HoLa";
  17.  
  18.  
  19. void main(void){
  20.  
  21.     ConfigOSC();
  22.     InicializacionPuertos();
  23.     ConfigRS232();
  24.    
  25.     RCONbits.IPEN = 0;      //Desabilitamos prioridad de interrupciones
  26.     INTCONbits.PEIE = 1;    // Habilitamos int de perifericos
  27.     INTCONbits.GIE = 1;     // Hablitamos int globales
  28.    
  29.     while(1){
  30.         Escribe(mensajeHola);
  31.     }
  32. }
  33.    
  34. void ConfigOSC (void){
  35.     OSCCONbits.SCS=0b11;    //Seleccion del reloj interno
  36.     OSCCONbits.IRCF = 0x7;     //Reloj seleccionado a 8MHz
  37. }
  38.  
  39. void InicializacionPuertos(void) {
  40.     ADCON1 = 0x0F;      //Todos entrada/salida digitales.//DESHABILITA CONEERTIDORES A/D
  41.     TRISA = 0xFF;       //Puerto completo como entrada
  42.     TRISB = 0xF0;               //S1~3 como salida y E15~7 como entrada
  43.     TRISC = 0xFF        //TRISC <7>(RX) a 1 (entrada).
  44.     TRISCbits.TRISC6=0; //TRISC <6> (TX) puesto a cero (salida). Los demas a uno (entradas).
  45.    
  46.     //Nota: El control EUSART reconfigurará automáticamente el pin de entrada a salida según sea necesario.
  47.     LATA = 0;      //Initialize PORTA by clearing output data latches
  48.     LATB = 0;      //Tambien se puede hacer limpiando el LAT
  49.     LATC = 0;
  50. }
  51.  
  52. void ConfigRS232(void) {
  53.  
  54.     //Configuración de los pines RC6 y RC7 del Puerto C como USART
  55.    
  56.     SPBRG = 51;            // Para 9600 baudios, en 8Mhz, con BRGH en 1,
  57.     BAUDCONbits.BRG16 = 0;  //Establece la comunicación en 8 bits. Está a 0 de forma predeterminada
  58.     TXSTA = 0;              //Limpio el TXSTA por las dudas
  59.     TXSTAbits.BRGH = 1;     //Comunicación a alta velocidad. "0" para baja
  60.     TXSTAbits.SYNC = 0;     //Hace que sea asíncrono. Para síncrono hacerlo igual a uno.
  61.     TXSTAbits.TXEN = 1;     //Habilita la transmision
  62.     RCSTAbits.SPEN = 1;     //Serial Port Enable bit
  63.     RCSTAbits.CREN = 1;     //Habilita la recepcion
  64.    
  65.     PIE1bits.RCIE = 1;      // Habilitamos interrupcion
  66.     PIR1bits.RCIF = 0;      // Borramos flag
  67.    
  68. }
  69. uint8_t Escribe(char *c1){
  70.  
  71.     /*
  72.      * Protection:
  73.      * - NULL Pointer
  74.      * - TX not enable
  75.      */
  76.    
  77.     if(c1 == NULL)  return -1;
  78.     if (!TXSTAbits.TXEN)    return 0;
  79.  
  80.     while(*c1)
  81.     {
  82.         TXREG=*c1++;
  83.         while(!TXSTAbits.TRMT);
  84.     }
  85. }
  86.  
  87. void interrupt ISRVector(void){
  88.    
  89.     // UART RX interrupt
  90.     if (PIR1bits.RCIF){
  91.         mensajeR[cont] = RCREG;
  92.         cont++;
  93.         // Index protection
  94.         if(cont >= sizeof mensajeR) cont = 0;
  95.        
  96.     }
  97. }

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Re:Problema lectura PIC18F2480
« Respuesta #5 en: 20 de Octubre de 2017, 04:38:59 »
Buenas de nuevo! Muchisimas gracias por tu tiempo KILLERJC. Estuve trabajando con las librerías antes de probar tu codigo y he conseguido que funcione la USART tanto en escritura como en lectura! Era evidente que la primera vez resultaría más fácil usar las consignas establecidas de las librerias que escribirlo todo yo solo.

Pero solo hay un problemita, la primera vez que lee un mensaje (haya escrito anteriormente o no), no lee correctamente, lee caracteres "al azar" como si fuese a otra velocidad pero, a partir del segundo mensaje que recibe, ya lee perfectamente. A veces, independientemente de lo largo que sea el primer mensaje, consigue leer el final del mismo (lo que es muy importante para que pille el CR y no se quede enclavado en lectura). Esto imagino que es debido a algun tipo de ajuste en la velocidad que se haga de forma automatica con el primer mensaje. Pero me gustaria que me lo aclaráseis por si es alguna tonteria poder arreglarlo.

Paso el ejemplito:
Código: [Seleccionar]
#include <p18cxxx.h>
#include "usart.h"
#define lon 150
unsigned char Rxdata[151];
unsigned char Txdata[] = "MICROCHIP_USART";
void main(void)
{
    unsigned char config=0,spbrg=0,baudconfig=0;
    //---Cierra la USART---//
    RCSTA&=0b01001111;
    TXEN=0;
    PIE1&=0b11001111;
        //-----configure OSCILATOR -----
    OSCCONbits.SCS=0b11;  //Selección del reloj interno
    OSCCONbits.IRCF0=1;     //Reloj seleccionado a 8MHz
    OSCCONbits.IRCF1=1;
    OSCCONbits.IRCF2=1;
    //---CONFIGURA EL LED---
    TRISC=0b10100000;
    PORTC = 0b00010000;
    //-----configure USART -----
    config = USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH;
    GIE = 1;
    PEIE = 1;
    //-----SPBRG needs to be changed depending upon oscillator frequency-------
    spbrg = 25; //At 8Mhz of oscillator frequency & baud rate of 19200.
    OpenUSART(config, spbrg); //API configures USART for desired parameters
    baudconfig = BAUD_8_BIT_RATE & BAUD_AUTO_OFF;
    baudUSART (baudconfig);
   
    while(1);
}
void interrupt Lectura (void){
    if (RCIF==1){
        //ENCENDIDO DEL LED CUANDO ENTRA EL PRIMER DATO Y APAGADO UNA VEZ TERMINA
        PORTCbits.RC2=1;
        char i;    // Length counter
        unsigned char data;

        for(i=0;i<lon;i++)  // Only retrieve len characters
        {
          while(!RCIF);// Wait for data to be received

          data = getcUSART();    // Get a character from the USART
                                 // and save in the string
          Rxdata [i] = data;
          if (Rxdata[i]==0x0D)
              i=lon;
        }
        RCIF=0;
        Delay10KTCYx(330);
        PORTCbits.RC2=0;
    }
}

Un ejemplo de respuesta para el mensaje "<CONF><FIN>"+CR enviado dos veces es el siguiente:

\06{s3óÆfKsóÖ<CONF><FIN>

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema lectura PIC18F2480
« Respuesta #6 en: 20 de Octubre de 2017, 14:10:39 »
Seguis teniendo problema para entender como es que funciona la interrupcion y como deberia comportarse.

La interrupcion de la UART ocurre cuando recibe 1 solo caracter.

Cualquier codigo de interrupcion deberia tomar ese caracter, guardarlo y salir. NUNCA deberia quedarse esperando que llegue otro caracter o todo un mensaje como vos estas haciendo.

Entonces vamos a hacer foco en la funcion de interrupcion:

Código: C
  1. void interrupt Lectura (void){
  2.     if (RCIF==1){
  3.         //ENCENDIDO DEL LED CUANDO ENTRA EL PRIMER DATO Y APAGADO UNA VEZ TERMINA
  4.         PORTCbits.RC2=1;
  5.         char i;    // Length counter
  6.         unsigned char data;
  7.  
  8.         for(i=0;i<lon;i++)  // Only retrieve len characters
  9.         {
  10.           while(!RCIF);// Wait for data to be received
  11.  
  12.           data = getcUSART();    // Get a character from the USART
  13.                                  // and save in the string
  14.           Rxdata [i] = data;
  15.           if (Rxdata[i]==0x0D)
  16.               i=lon;
  17.         }
  18.         RCIF=0;
  19.         Delay10KTCYx(330);
  20.         PORTCbits.RC2=0;
  21.     }
  22. }

Entonces lo primero que vamos a hacer es recibir de a caracteres, seguido una proteccion del indice del array. Y por ultimo detectamos cuando termina
Si detecta el CR, entonces deja un caracter nulo '\0' alli y comeinza nuevamente desde el indice 0.

Código: C
  1. #include <p18cxxx.h>
  2.  
  3. #include "usart.h"
  4. #define MAX_RX_BUFFER 150
  5.  
  6.  
  7. unsigned char Rxdata[MAX_RX_BUFFER];
  8. unsigned char Txdata[] = "MICROCHIP_USART";
  9. unsigned int indice = 0;
  10.  
  11. void main(void)
  12. {
  13.     unsigned char config=0,spbrg=0,baudconfig=0;
  14.     //---Cierra la USART---//
  15.     RCSTA&=0b01001111;
  16.     TXEN=0;
  17.     PIE1&=0b11001111;
  18.         //-----configure OSCILATOR -----
  19.     OSCCONbits.SCS=0b11;  //Selección del reloj interno
  20.     OSCCONbits.IRCF0=1;     //Reloj seleccionado a 8MHz
  21.     OSCCONbits.IRCF1=1;
  22.     OSCCONbits.IRCF2=1;
  23.     //---CONFIGURA EL LED---
  24.     TRISC=0b10100000;
  25.     PORTC = 0b00010000;
  26.     //-----configure USART -----
  27.     config = USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH;
  28.     GIE = 1;
  29.     PEIE = 1;
  30.     //-----SPBRG needs to be changed depending upon oscillator frequency-------
  31.     spbrg = 25; //At 8Mhz of oscillator frequency & baud rate of 19200.
  32.     OpenUSART(config, spbrg); //API configures USART for desired parameters
  33.     baudconfig = BAUD_8_BIT_RATE & BAUD_AUTO_OFF;
  34.     baudUSART (baudconfig);
  35.    
  36.     while(1);
  37. }
  38.  
  39.  
  40. void interrupt Lectura (void){
  41.     if (RCIF==1){
  42.         //ENCENDIDO DEL LED CUANDO ENTRA EL PRIMER DATO Y APAGADO UNA VEZ TERMINA
  43.         PORTCbits.RC2=1;
  44.  
  45.         Rxdata[i] = getcUSART();            // Get a character from the USART
  46.         indice ++;
  47.         if(indice >= MAX_RX_BUFFER) i = 0;       //Proteccion de indice
  48.         if (Rxdata[indice]==0x0D)
  49.         {
  50.               Rxdata[indice] = '\0';             // En caso que el dato recibido sea 0x0D, terminamos el string
  51.               i=0;                          // Reiniciamos el indice a 0
  52.         }
  53.         PORTCbits.RC2=0;
  54.     }
  55. }

Esto permite que cuando termines de enviar el dato te quede en el buffer el string correcto.

PD: Al leer el buffer de la UART ( desde registro o con getcUSART ) se limpia solo el flag de recepcion.

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Re:Problema lectura PIC18F2480
« Respuesta #7 en: 23 de Octubre de 2017, 08:57:53 »
Tienes toooooda la razon. Fallo gordo. Lo he probado y hay algunas aclaraciones que me gustaría que me hicieras:

1. La variable "i" no la has definido, entiendo que i=indice.
2. ¿Indice, si el bufer no es mayor de 156 podria ser un char no?
3. IMPORTANTE. El primer mensaje sigue leyendose mal, independientemente de su longitud. Del segundo mensaje en adelante funciona a la perfección. No me lo explicooooo.

Gracias una vez más por tu ayuda Killerjc!

Adjunto como quedó la interrupcion:

void interrupt Lectura (void){
    if (RCIF==1){
       
        Rxdata[indice] = getcUSART();            // Get a character from the USART
        indice ++;
        if(indice >= MAX_RX_BUFFER) indice = 0;       //Proteccion de indice
        if (Rxdata[indice]==0x0D)
        {
              Rxdata[indice] = '\0';             // En caso que el dato recibido sea 0x0D, terminamos el string
              indice=0;                          // Reiniciamos el indice a 0
        }
    }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema lectura PIC18F2480
« Respuesta #8 en: 23 de Octubre de 2017, 14:54:06 »
Citar
1. La variable "i" no la has definido, entiendo que i=indice.

Si un error mio, primero lo habia realizado con i, pero como i se usa mucho en loops, mejor darle un nombre que tenga sentido a lo que hace, por eso lo llame indice despues y me olvide cambiar esa i.

Citar
2. ¿Indice, si el bufer no es mayor de 156 podria ser un char no?

Si, normalmente yo utilizo stdint.h donde los nombres quedan como uint8_t , uint16_t , int8_t, etc. El tema del int, es que en XC8 es de 16bits y en CCS es de 8bits, puse int sin pensarlo, solo para indicar que era un entero. Pero como no supera los 255 entonces tranquilamente puede ser una variable de 8 bits.

Citar
3. IMPORTANTE. El primer mensaje sigue leyendose mal, independientemente de su longitud. Del segundo mensaje en adelante funciona a la perfección. No me lo explicooooo.

El código es muy sencillo, me parece que ya no es un problema de código, sino de donde lo estas probando, si lo estas probando en una simulación, entonces seguramente sea eso.
Si estuviera mal el baudrate, entonces no deberia recibir nada bien nunca.

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Re:Problema lectura PIC18F2480
« Respuesta #9 en: 24 de Octubre de 2017, 03:49:44 »
Gracias de nuevo! Tengo una placa impresa y la estoy comunicando con el PC y ya he usado Mobaxterm, Terminal y PComm Terminal Emulator y con todos pasa los mismo. ¿Puede ser que al usar el reloj interno se ajuste este o el periferico USART a la velocidad de comunicacion y por eso en el primer mensaje parace como un "mal buadrate"? No estoy usando reloj externo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema lectura PIC18F2480
« Respuesta #10 en: 24 de Octubre de 2017, 08:29:21 »
Al usar el reloj interno puede que tengas error ya que no es tan exacto, pero no se si es tan pronunciado como de esa forma.

Tampoco se esta usando el auto baud-rate sino que se lo esta definiendo de comienzo, por eso dudo y me parece imposible que luego se "acomode" ya que la frecuencia es fija y esta dada por los registros. Sinceramente es la primera ves que veo ese problema.

Si me decis que estas en una placa, ahora la que queda es asegurarse que el problema no sea el oscilador interno, podrias probar con un oscilador a cristal si es que tenes.

Desconectado Ramon90

  • PIC10
  • *
  • Mensajes: 29
Re:Problema lectura PIC18F2480
« Respuesta #11 en: 25 de Octubre de 2017, 05:24:45 »
Muchisimas gracias por tu atencion KILLERJC.  ((:-))  Te debo al menos un almuerzo  :mrgreen: Estaré durante al menos quince dias con otro proyecto así que más adelante seguiré haciéndole mejoras pero por ahora se queda parado. De todas formas si alguien conoce la causa sería de gran ayuda.

Saludos


 

anything