Autor Tema: usartRx problema  (Leído 1886 veces)

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

Desconectado fcomb

  • PIC10
  • *
  • Mensajes: 2
usartRx problema
« en: 27 de Marzo de 2017, 13:37:31 »
Hola que tal

Soy nuevo en el mundo de los pics, mi problema es que estoy usando la USART2 pero la recepción de datos no me funciona, la transmisión envia correctamente, cuando envío un dato al pic y hago que lo retransmita solo me arroja basura, les dejo la muestra de mi codigo para ver si me puden ayudar a detectar una falla, espero me puedan aydar el pic que utilizo es el pic18f47j53 mi reloj de entrada es de 12mHZ

#include <xc.h>
#include<plib/usart.h>
#include "config.h"

//#define EUSART_V4

#define _XTAL_FREQ 24000000

unsigned char byte;
// Funciones para USART

void Blink_LED(){
    if(PORTEbits.RE0 == 1) {
           PORTEbits.RE0 = 0;
    } else{
           PORTEbits.RE0 = 1;
      }
}

void main(void) {
 
    TRISDbits.TRISD7=0; // TX2 PIN
    TRISDbits.TRISD3=1; // RX2 PIN

    //Desbloquear cambio de pines   
    INTCONbits.GIE  = 0;  // desctiva de interrupcion global
    EECON2  = 0x55;
    EECON2  = 0xAA;
    PPSCON  = 0x00;       //Apagar proteccion de pin para poder asignar
     
    RPINR16 = 0x14;       // asignacion de pin RP23
    RPOR24  = 0x06;       // asignacion TX en pin D7
   
    //Bloquear cambio de pines
   
    EECON2 = 0x55;
    EECON2 = 0xAA;
    PPSCON = 0x01;         // Apagar proteccion de pin para poder asignar
   
    INTCONbits.GIE  = 1; // Activación de interrupcion global
    INTCONbits.PEIE = 1; //Activar interrupcion de perifericos
    PIE3 = 0b00100000;
    PIR3bits.RC2IF = 0;
   
//    //Configuración de USART
    SPBRG2 = 12;           // Configuracion a 115200 baudios
    RCSTA2 = 0b10010000;   // Habilitar recepción de datos y recepción continua
    TXSTA2 = 0b00100000;   // Habilitar transmición de datos y modo high speed
    BAUDCON2 = 0b00001010;
    //Configuracion de puertos
   
    ANCON0 = 0XFF;    // Poner pines analógicos como digitales
    TRISE  = 0x00;    // configura todo el puerto E como salidas
    PORTE  = 0x00;    // Salidas puerto E apagadas
   
//    Open2USART(USART_TX_INT_OFF & USART_RX_INT_ON &  USART_ASYNCH_MODE &
//            USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH & USART_ADDEN_OFF,
//            12);
   
    __delay_ms(500);
    while(!TX2IF);
    puts2USART("\r\nHola\r\n");
//   
  //  __delay_ms(5000);
    while(1){

 
   
    }
   
    return;
}

void interrupt ISR(){
   
    byte = RCREG2;
    Blink_LED();
    if(byte == 'F')
        PORTEbits.RE1 = 1;
    while(!TX2IF);
    TXREG2 = byte;
   
    PIR3bits.RC2IF = 0;
}


Este es mi config.h

#pragma config WDTEN = OFF      // Watchdog Timer (Disabled - Controlled by SWDTEN bit)
#pragma config PLLDIV = 3       // PLL Prescaler Selection (Divide by 2 (8 MHz oscillator input))
#pragma config CFGPLLEN = ON    // PLL Enable Configuration Bit (PLL Enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset (Enabled)
#pragma config XINST = OFF      // Extended Instruction Set (Disabled)

// CONFIG1H
#pragma config CPUDIV = OSC2_PLL2// CPU System Clock Postscaler (CPU system clock divide by 3)
#pragma config CP0 = OFF        // Code Protect (Program memory is not code-protected)

// CONFIG2L
#pragma config OSC = HSPLL  // Oscillator (INTOSCPLL)
#pragma config SOSCSEL = DIG   // T1OSC/SOSC Power Selection Bits (High Power T1OSC/SOSC circuit selected)
#pragma config CLKOEC = OFF     // EC Clock Out Enable Bit  (CLKO output disabled on the RA6 pin)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor (Enabled)
#pragma config IESO = OFF        // Internal External Oscillator Switch Over Mode (Enabled)

// CONFIG2H
#pragma config WDTPS = 32768    // Watchdog Postscaler (1:32768)

// CONFIG3L
#pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC)
#pragma config RTCOSC = INTOSCREF// RTCC Clock Select (RTCC uses INTRC)
#pragma config DSBOREN = ON     // Deep Sleep BOR (Enabled)
#pragma config DSWDTEN = OFF    // Deep Sleep Watchdog Timer (Disabled)
#pragma config DSWDTPS = G2     // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days))

// CONFIG3H
#pragma config IOL1WAY = OFF    // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set and cleared as needed)
#pragma config ADCSEL = BIT10   // ADC 10 or 12 Bit Select (10 - Bit ADC Enabled)
#pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode)

// CONFIG4L
#pragma config WPFP = PAGE_127  // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 127)
#pragma config WPCFG = OFF      // Write/Erase Protect Configuration Region  (Configuration Words page not erase/write-protected)

// CONFIG4H
#pragma config WPDIS = OFF      // Write Protect Disable bit (WPFP<6:0>/WPEND region ignored)
#pragma config WPEND = PAGE_WPFP// Write/Erase Protect Region Select bit (valid when WPDIS = 0) (Pages WPFP<6:0> through Configuration Words erase/write protected)
#pragma config LS48MHZ = SYS48X8

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:usartRx problema
« Respuesta #1 en: 27 de Marzo de 2017, 15:14:49 »
Vamos por parte..

Código: C
  1. void Blink_LED(){
  2.     if(PORTEbits.RE0 == 1) {
  3.            PORTEbits.RE0 = 0;
  4.     } else{
  5.            PORTEbits.RE0 = 1;
  6.       }
  7. }

Eso posee 1 error y la funcion no posee sentido.
El error es que Para escribir en el puerto debo usar el registro LATx, para resumirtelo:

- PORTx para leer el estado del pin
- LATx para leer el buffer de salida o para escribir un dato al pin
- TRISx para cambiar a entrada/salida

Lo otro que digo que no posee sentido es porque deberias haber realizado una XOR del pin:

Código: C
  1. LATEbits.RE0 ^= 1;

Continuamos:
Código: C
  1. EECON2  = 0x55;
  2.     EECON2  = 0xAA;
  3.     PPSCON  = 0x00;       //Apagar proteccion de pin para poder asignar

Tampoco posee sentido porque el PPSCON tiene el valor 0x00 en el reset, incluso por ahora podrias omitirlo y no usarlo para nada.

Voy a suponer que los pines remapeables son los correctos, tambien la frecuencia.

Código: C
  1. SPBRG2 = 12;           // Configuracion a 115200 baudios
  2. RCSTA2 = 0b10010000;   // Habilitar recepción de datos y recepción continua
  3. TXSTA2 = 0b00100000;   // Habilitar transmición de datos y modo high speed
  4. BAUDCON2 = 0b00001010;

Segun esto es que tengo BGRH = 0 , y BGR16 = 1, por lo tanto la formula de los baudios me quedan en
Fosc/(16 (n+1))

Si pongo los valores me da aproximadamente 58700. No se si es un error tu comentario de 115k.

--------------------------------------------

Segun tu configuracion estas usando un cristal de 8Mhz, pasa por el PLL lo cual lo lleva a 96Mhz luego lo baja a 48Mhz y finalmente una division por 3 para entrar a la CPU, eso te deja con 16Mhz y no 12Mhz y para usar las funciones de las plib, deberias definir correctametne el _XTAL_FREC

Desconectado fcomb

  • PIC10
  • *
  • Mensajes: 2
Re:usartRx problema
« Respuesta #2 en: 27 de Marzo de 2017, 15:50:49 »
Hola muchas gracias por tu respeusta he corregido los detalles que me comntaste, en cuanto al reloj los comentarios del código que puse están mal te pongo los valores que puse

cristal externo = 12 MHz
#pragma config PLLDIV = 3
#pragma config CPUDIV = OSC2_PLL2

por eso puse el XTAL_FREQ a 24 MHz no se si es correcto lo que hice Saludos con esta configuración la recepcion me arroja pura basura

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:usartRx problema
« Respuesta #3 en: 27 de Marzo de 2017, 17:10:48 »
El _XTAL_FREQ es la frecuencia de entrada al nucleo del microcontrolador.

Si usas el PLL, deberias tener 4Mhz a la entrada del mismo, Asi que si posees un cristal externo de 12Mhz deberia dividirse por 3.

Verifica que sea correcta esta division!!, porque el valor 3 en PLLDIV es una division por 5 Y en los comentarios dice que es una division por 2!, TIENE que ser por 3 si usas un cristal de 12Mhz.
El PLL al entrar 4Mhz salen 96Mhz y luego pasa por un divisor por 2, quedando finalmente en 48Mhz, alli es cuando se usa el CPDIV, el cual tenes: Sin division, dividido 2, dividido 3 y divido 6.

Nuevamente por los comentarios que tienen tus FUSES, me encuentro que divide por 3 lo cual lo deja en 16Mhz entrando al nucleo, y tu _XTAL_FREQ quedaria:

#define _XTAL_FREQ 16000000

El que tengas una frecuencia distinta, implica que vas a tener mas los calculos de la UART.

-----------

Sino no uses el PLL y no dividas con CPDIV, que tome directamente del oscilador principal sin pasar por el PLL, y alli tendrias 12Mhz.