Hola,
Estoy probando a enviar un byte usando la EUSART con un PIC18F2550. Os doy algunos datos:
- Uso MPLAB X con C18
- Usaré un cristal de 12MHz y posteriormente deberé configurar el PIC internamente para conseguir los 48MHz para el USB.
- El baudrate que necesito es de 250k pero no tengo claro si debo calcularlo a partir de los 12Mhz o de los 48Mhz (250000 = FOSC/(16 ([SPBRGH:SPBRG] + 1)))
He ojeado el datasheet y he deducido que debo usar la siguiente configuración para usar la EUSART, aunque seguro que algo falla o está mal. Por lo que si alguien me echa una mano..:
El código compila sin errores y al simularlo con proteus y un oscilador virtual veo la gráfica de la imagen adjunta.
La pregunta es, si estoy enviando continuamente 8+1 bytes en valor alto ¿por qué aparece ese pico en el osciloscopio? ¿no debería aparecer una línea siempre en valor alto?
¿podéis echarme una mano con el cálculo del baud rate que comentaba al principio?
Ni que decir tiene que soy un novato en estos temas
Gracias!
Estoy probando a enviar un byte usando la EUSART con un PIC18F2550. Os doy algunos datos:
- Uso MPLAB X con C18
- Usaré un cristal de 12MHz y posteriormente deberé configurar el PIC internamente para conseguir los 48MHz para el USB.
- El baudrate que necesito es de 250k pero no tengo claro si debo calcularlo a partir de los 12Mhz o de los 48Mhz (250000 = FOSC/(16 ([SPBRGH:SPBRG] + 1)))
He ojeado el datasheet y he deducido que debo usar la siguiente configuración para usar la EUSART, aunque seguro que algo falla o está mal. Por lo que si alguien me echa una mano..:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <usart.h>
//Declaracion de funciones
void init();
void send_byte();
void main(void)
{
init();
send_byte();
}
void init()
{
// Puerto C
PORTC = 0x00; // Inicializar puerto C
TRISCbits.RC6 = 0; // Configurar puerto como salida
// ::: USART :::
BAUDCONbits.RXDTP = 0;
BAUDCONbits.TXCKP = 0; // Datos de envio no invertidos
BAUDCONbits.BRG16 = 0; // Generador de baudrate de 8 bits, SPBRG
//BAUDCONbits.WUE = 0; // Deshabilitar Wake-up
BAUDCONbits.ABDEN = 0; // Autodetección de baudrate desactivada
TXSTAbits.TX9 = 1; // Activar transmision del 9º bit
TXSTAbits.TXEN = 1; // Habilitar transmision
TXSTAbits.SYNC = 0; // Seleccionar transmisión asíncrona
TXSTAbits.SENDB = 0; // No envío señal de break.
TXSTAbits.BRGH = 1; // Alta velocidad
TXSTAbits.TX9D = 1; // El 9º bit es un 1
RCSTAbits.SPEN = 1; // Activamos los puertos
SPBRG = 11; // 250 KBaudios a partir de 48 MHz. ¿¿¿correcto???
}
void send_byte()
{
/* TXREG envía automáticamente (a TSR) y pone TRMT a 1 cuando ha
acabado para que se le pueda cargar un nuevo BYTE (supongo)*/
while(1)
{
TXREG = 0xFF; // Registro de 8 bits
while (TXSTAbits.TRMT == 0); //TRMT is set when the TSR register is empty
}
}
El código compila sin errores y al simularlo con proteus y un oscilador virtual veo la gráfica de la imagen adjunta.
La pregunta es, si estoy enviando continuamente 8+1 bytes en valor alto ¿por qué aparece ese pico en el osciloscopio? ¿no debería aparecer una línea siempre en valor alto?
¿podéis echarme una mano con el cálculo del baud rate que comentaba al principio?
Ni que decir tiene que soy un novato en estos temas
Gracias!