Pantalla binaria con LED

Probé un ejemplo de código para mostrar la salida en serie en una matriz 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 ingreso se mostrarán en un terminal serial como se esperaba. Aunque la pantalla en la matriz de LED es extraña. Independientemente de lo que ingrese, obtengo la salida en LEDS de 00001010 (8 LED cada uno representa un bit) en PORTB de ATMEGA328p.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Siempre se encienden los mismos 2 LED. Cuando presiono una tecla para que se transmita, los LED parpadean brevemente y luego vuelven a encenderse los bits 2 y 4. ¿Cómo puedo solucionar esto?

¿Puede configurar todos los LED individualmente si codifica el valor PORTB con un ejemplo mínimo?
¡sí! funciona perfectamente bien Si ingreso, PORTB = 0b00011100se encienden los LED correctos
Entonces... ¿debe ser algo con la salida de la conexión serial?
Cuando imprimo String(serialCharacter) obtengo esto en mi pantalla ¿para la letra A. No importa qué tecla presione, los LED 0-6 parpadean al presionar la tecla Enter y luego los LED 1 y 3 se encienden constantemente. Pasa con todas las teclas.

Respuestas (1)

¿Podría configurarse el programa de su terminal de PC para enviar automáticamente un avance de línea ASCII después de cada carácter? Eso explicaría por qué el carácter final que recibe su MCU es 0Ah. Verifique que el programa de la terminal esté configurado en un modo simple.

¡¡Ja!! si!! lo resolví... ¡Desactivé LF y CR y ahora funciona sin problemas! ¡Gracias amigo!
@sesc360, de nada, diviértete :-)