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
#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