Binäre Anzeige mit LEDs

Ich habe ein Codebeispiel ausprobiert, um die serielle Ausgabe auf einem Array von LEDs anzuzeigen.

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

Der Code für die serielle Verbindung:

#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++;
    }
}

Die Verbindung funktioniert gut und die Daten, die ich eintippe, werden wie erwartet auf einem seriellen Terminal angezeigt. Obwohl die Anzeige auf dem LED-Array seltsam ist. Egal was ich eintippe, ich bekomme die Ausgabe auf LEDs von 00001010 (8 LEDs repräsentieren jeweils ein Bit) auf PORTB des ATMEGA328p.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Es leuchten immer die gleichen 2 LEDs. Wenn ich eine zu übertragende Taste drücke, flackern die LEDs kurz auf und dann leuchten Bit 2 und 4 wieder auf. Wie kann ich das beheben?

Können Sie alle LEDs einzeln einstellen, wenn Sie den PORTB-Wert mit einem Minimalbeispiel fest codieren?
ja! funktioniert einwandfrei. Wenn ich etwas eingebe, PORTB = 0b00011100leuchten die richtigen LEDs auf
Also ... es muss etwas mit dem Ausgang der seriellen Verbindung sein?
Wenn ich String(serialCharacter) drucke, bekomme ich das auf meinem Bildschirm ¿für den Buchstaben A. Egal welche Taste ich drücke, die LEDs 0-6 flackern beim Drücken der Eingabetaste und dann leuchten LED 1 und 3 konstant. Passiert mit jedem Schlüssel.

Antworten (1)

Könnte Ihr PC-Terminalprogramm so eingerichtet sein, dass nach jedem Zeichen automatisch ein ASCII-Zeilenvorschub gesendet wird? Das würde erklären, warum das letzte Zeichen, das Ihre MCU empfängt, 0Ah ist. Überprüfen Sie, ob das Terminalprogramm auf einen einfachen Modus eingestellt ist.

Ha!! ja!! gelöst... Ich habe LF und CR deaktiviert und jetzt läuft es reibungslos! Danke Kumpel!
@sesc360, gerne geschehen, viel Spaß damit :-)