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.
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ö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.
Rev
sesc360
PORTB = 0b00011100
leuchten die richtigen LEDs aufsesc360
sesc360
¿
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.