Probé un ejemplo de código para mostrar la salida en serie en una serie de LED.
#define F_CPU 1000000UL
#define BAUD 9600UL
#include <avr/io.h>
#include <util/delay.h>
#include <USART.h>
#include <pinDefines.h>
int main(void) {
char serialCharacter;
LED_DDR = 0xff;
initUSART();
printString("Connection Successful\r\n");
while (1) {
serialCharacter = receiveByte();
transmitByte(serialCharacter);
PORTB = serialCharacter;
}
return 0;
}
El código para la conexión en serie:
#ifndef BAUD
#define BAUD 9600
#endif
#define USART_HAS_DATA bit_is_set(UCSR0A, RXC0)
#define USART_READY bit_is_set(UCSR0A, UDRE0)
#include <avr/io.h>
#include <util/setbaud.h>
void initUSART(void) {
#define BAUDRATE ((F_CPU) / (BAUD * 8UL)-1) // Set Baud Rate Value for UBRR
// Set register
UBRR0H = (BAUDRATE >> 8);
UBRR0L = BAUDRATE;
UCSR0A |= (1 << U2X0);
// Enable USART transmitter and receiver
UCSR0B = (1 << TXEN0) | (1 << RXEN0);
// Set 8 data bits and 1 stop bit
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
void transmitByte(uint8_t data) {
// Wait for empty transmit buffer
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = data;
}
uint8_t receiveByte(void) {
// Wait for incoming data
loop_until_bit_is_set(UCSR0A, RXC0);
return UDR0;
}
void printString(const char myString[]) {
uint8_t i = 0;
while (myString[i]) {
transmitByte(myString[i]);
i++;
}
}
La conexión funciona bien y los datos que ingresé se mostrarán en un terminal serial como se esperaba. Aunque la pantalla en la matriz de LED es impar. No importa lo que ingrese, obtengo la salida en los LED de 00001010 (8 LED que representan cada uno un bit) en el PORTB del ATMEGA328p.
Siempre se encienden los 2 LEDs iguales. Cuando presiono una tecla para ser transmitida, recibo un breve parpadeo de los LED y luego vuelvo a encender los Bit 2 y 4. ¿Cómo puedo solucionar esto?