Autor Tema: Ayuda con lectura UART PIC18F2525  (Leído 518 veces)

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

Desconectado Pindry

  • PIC10
  • *
  • Mensajes: 2
Ayuda con lectura UART PIC18F2525
« en: 04 de Agosto de 2023, 16:48:37 »
Hola,

Estoy realizando un proyecto en el que tengo que leer flancos de subida y bajada de una onda cuadrada que funciona entre 40kHz y 200kHz. Estoy utilizando un PIC18F2525 con un modulo USART PL-2303HX. El caso es que puedo comunicar a través de el, es decir, la configuración es correcta, sin embargo, cuando conecto mi onda cuadrada al PIC para que comience a leer dejo de recibir datos (si no lo tengo conectado veo un 0 por pantalla). Por lo que he podido analizar puede ser porque la interrupción no sea capaz de leer tan rapido esta señal ya que señales de 14/15 Hz si es capaz de leerlas y mostrarlas por pantalla.

Os dejo el codigo por si podeis ayudarme con el tema

Código: [Seleccionar]
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <p18f2525.h>
#include "main.h"

// Configuración de bits de configuración del microcontrolador
#pragma config OSC = HSPLL  //  Oscilador externo de cristal
#pragma config WDT = OFF    //  Watchdog Timer deshabilitado
#pragma config LVP = OFF    //  Low-Voltage Programming deshabilitado

#define _XTAL_FREQ 32000000 //  The speed of your internal(or)external oscillator
#define RXBUFFERSIZE 255
#define baud 19200          //  UART baud rate

unsigned long flagRB7;      //  Variable para contar las interrupciones de RB7
unsigned char flagPrint[5];
int count=0;
int cuentaRB7 = 0;


void main(void) {
   
    // Configurar Timer0
    T0CON = 0b10000011;
    TMR0H = 0x08;
    TMR0L = 0x70;
   
    //TRISBbits.TRISB3 = 0;
   
    TRISBbits.TRISB7 = 1;   //  Configura el pin RB0 como entrada.
    INTCONbits.RBIE = 1;    //  Habilita interrupcion Externa RB0.
    INTCONbits.RBIF = 0;    //  Borra el flag de RB7.
    INTCONbits.PEIE = 1;    //  Habilita interrupciones PERIFERICAS.
    INTCONbits.GIE = 1;     //  Habilita Interrupcion GLOBAL.

    //Config UART to 19200 baudios
    TRISCbits.RC6 = 0;      //  Pin RC6 digital outpit to TX.
    TXSTAbits.TX9 = 0;      //  Modo-8bits.
    TXSTAbits.TXEN = 1;     //  Transmission on.
    TXSTAbits.SYNC = 0;     //  Asinc mode.
    TXSTAbits.BRGH = 1;     //  Low rate bauds.
    BAUDCONbits.BRG16 = 0;  //  Bauds mode to 8bits.
    RCSTAbits.SPEN = 1;     //  Set modle SSP as UART.
   
    //  Calculate the SPBRG value
    //SPBRG = (unsigned char) (((_XTAL_FREQ / baud) / 16) - 1);
    SPBRG = 103;
   
    // Bucle infinito
    while (1) {
        if (INTCONbits.TMR0IF) {                //  Verificar si ha pasado el tiempo deseado (0.3 segundos)
            count++;
            if (count == 4){
                cuentaRB7 = (flagRB7/600);
                sprintf(flagPrint,"%d", cuentaRB7);  //  Convertir flagRB7 en una cadena de caracteres flagPrint
                SerialPrint(flagPrint,1);           //  Imprimir flagPrint por pantalla
                count = 0;
            }
            //LATBbits.LB3 = !LATBbits.LB3;      //  Apagar/Encender LED
           
            flagRB7 = 0;                        // Reiniciar el contador de flags en RB0
           
            TMR0H = 0x08;
            TMR0L = 0x70;
            INTCONbits.TMR0IF = 0;
        }
    }
}

// High priority interrupts
void interrupt ISR(void)
{
    if (INTCONbits.RBIF){
        flagRB7++;              //  Contar el cambio de nivel en RB7
        INTCONbits.RBIF = 0;    //  Limpiar la bandera de interrupción
    }
}

void SerialPrint(unsigned char string[], int addEndLine){
    //  Esperar a que el registro de transmisión este disponible o vacio.
    unsigned int position = 0;
    do{
        while (!TXSTAbits.TRMT) {
        }
        //  Escribir el dato que se enviará a través de TX.
        TXREG = string[position];
        position++;
    }
    while (string[position] != '\0' && string[position] != '\n' && position < RXBUFFERSIZE);
    if (string[position] != '\n'){
        TXREG = string[position];
    }
    if (addEndLine > 0) {
       while (!TXSTAbits.TRMT) {
       }
       TXREG = 10;
    }
    while (!TXSTAbits.TRMT) {
    }
    TXREG = 13;
}

Muuchas gracias

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Ayuda con lectura UART PIC18F2525
« Respuesta #1 en: 04 de Agosto de 2023, 18:43:41 »
Hola,

Estoy realizando un proyecto en el que tengo que leer flancos de subida y bajada de una onda cuadrada que funciona entre 40kHz y 200kHz. Estoy utilizando un PIC18F2525 con un modulo USART PL-2303HX. El caso es que puedo comunicar a través de el, es decir, la configuración es correcta, sin embargo, cuando conecto mi onda cuadrada al PIC para que comience a leer dejo de recibir datos (si no lo tengo conectado veo un 0 por pantalla). Por lo que he podido analizar puede ser porque la interrupción no sea capaz de leer tan rapido esta señal ya que señales de 14/15 Hz si es capaz de leerlas y mostrarlas por pantalla.

Os dejo el codigo por si podeis ayudarme con el tema

Código: [Seleccionar]
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <p18f2525.h>
#include "main.h"

// Configuración de bits de configuración del microcontrolador
#pragma config OSC = HSPLL  //  Oscilador externo de cristal
#pragma config WDT = OFF    //  Watchdog Timer deshabilitado
#pragma config LVP = OFF    //  Low-Voltage Programming deshabilitado

#define _XTAL_FREQ 32000000 //  The speed of your internal(or)external oscillator
#define RXBUFFERSIZE 255
#define baud 19200          //  UART baud rate

unsigned long flagRB7;      //  Variable para contar las interrupciones de RB7
unsigned char flagPrint[5];
int count=0;
int cuentaRB7 = 0;


void main(void) {
   
    // Configurar Timer0
    T0CON = 0b10000011;
    TMR0H = 0x08;
    TMR0L = 0x70;
   
    //TRISBbits.TRISB3 = 0;
   
    TRISBbits.TRISB7 = 1;   //  Configura el pin RB0 como entrada.
    INTCONbits.RBIE = 1;    //  Habilita interrupcion Externa RB0.
    INTCONbits.RBIF = 0;    //  Borra el flag de RB7.
    INTCONbits.PEIE = 1;    //  Habilita interrupciones PERIFERICAS.
    INTCONbits.GIE = 1;     //  Habilita Interrupcion GLOBAL.

    //Config UART to 19200 baudios
    TRISCbits.RC6 = 0;      //  Pin RC6 digital outpit to TX.
    TXSTAbits.TX9 = 0;      //  Modo-8bits.
    TXSTAbits.TXEN = 1;     //  Transmission on.
    TXSTAbits.SYNC = 0;     //  Asinc mode.
    TXSTAbits.BRGH = 1;     //  Low rate bauds.
    BAUDCONbits.BRG16 = 0;  //  Bauds mode to 8bits.
    RCSTAbits.SPEN = 1;     //  Set modle SSP as UART.
   
    //  Calculate the SPBRG value
    //SPBRG = (unsigned char) (((_XTAL_FREQ / baud) / 16) - 1);
    SPBRG = 103;
   
    // Bucle infinito
    while (1) {
        if (INTCONbits.TMR0IF) {                //  Verificar si ha pasado el tiempo deseado (0.3 segundos)
            count++;
            if (count == 4){
                cuentaRB7 = (flagRB7/600);
                sprintf(flagPrint,"%d", cuentaRB7);  //  Convertir flagRB7 en una cadena de caracteres flagPrint
                SerialPrint(flagPrint,1);           //  Imprimir flagPrint por pantalla
                count = 0;
            }
            //LATBbits.LB3 = !LATBbits.LB3;      //  Apagar/Encender LED
           
            flagRB7 = 0;                        // Reiniciar el contador de flags en RB0
           
            TMR0H = 0x08;
            TMR0L = 0x70;
            INTCONbits.TMR0IF = 0;
        }
    }
}

// High priority interrupts
void interrupt ISR(void)
{
    if (INTCONbits.RBIF){
        flagRB7++;              //  Contar el cambio de nivel en RB7
        INTCONbits.RBIF = 0;    //  Limpiar la bandera de interrupción
    }
}

void SerialPrint(unsigned char string[], int addEndLine){
    //  Esperar a que el registro de transmisión este disponible o vacio.
    unsigned int position = 0;
    do{
        while (!TXSTAbits.TRMT) {
        }
        //  Escribir el dato que se enviará a través de TX.
        TXREG = string[position];
        position++;
    }
    while (string[position] != '\0' && string[position] != '\n' && position < RXBUFFERSIZE);
    if (string[position] != '\n'){
        TXREG = string[position];
    }
    if (addEndLine > 0) {
       while (!TXSTAbits.TRMT) {
       }
       TXREG = 10;
    }
    while (!TXSTAbits.TRMT) {
    }
    TXREG = 13;
}

Muuchas gracias

Tal vez para contar los pulsos que mencionas, no deberías usar la interrupción externa, sino con otro temporizador.

Los temporizadores en realidad son contadores de pulsos.

Por lo general cuentan los pulsos de un reloj interno u oscilador, pero me parece que casi todos, tienen opción de contar pulsos externos en un terminal o pin del microcontrolador.

Podrías usar esa ventaja para que ese temporizador (Podría ser tal vez el TMR1) funcione con esa señal cuadrada que mencionas.

« Última modificación: 04 de Agosto de 2023, 18:49:33 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pindry

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda con lectura UART PIC18F2525
« Respuesta #2 en: 12 de Septiembre de 2023, 12:30:14 »
Muchas gracias DominusDRR, ha funcionado