Hallo Community,
Auf Empfehlung sponsere ich dem Thema einen eigenen Thread^^
mein Vorhaben ganz simpel: eine Zahl (16bit) soll in 2x(8bit) zerlegt werden und via UART auf einen zweiten µC gesendet und auf einer 7-Segment LED-Anzeige ausgegeben werden.
Mit einer 8-bit Zahl habe ich die Ansteuerung des 7-Segment Displays getestet um dies schonmal abzuhaken in seiner Funktion.
Problem ist, wenn ich eine 16-bit Zahl (hier 6789) sende, gibt die LED-Anzeige lauter Zufallszahlen aus und wechselt hin- und her.
Ich stehe mit meiner Programmiererfahrung noch ziemlich am Anfang und habe versucht eine Lösung zu finde, jedoch ohne Erfolg. Ich poste die wichtigen Ausschnitte meines Codes (unwichtiges rausgelöscht) was das Senden und Empfangen angeht, wäre nett wenn mir einer helfen kann (ist ja bestimmt nichts großes)
SENDEN
Code:
.
.
.
.
uint16_t zahl=6789;
uint8_t HByte;
uint8_t LByte;
void daten_senden (uint8_t data)
{
while (!(UCSRA & (1<<UDRE))){} //warten bis senden möglich ist
UDR = data; //Zeichen in den Ausgabepuffer schreiben
}
void usart_init (void)
{
UCSRB |= (1<<TXEN); //Daten senden
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Asynchron 8N1
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}
int main(void)
{
usart_init();
while (1)
{
HByte = (zahl >> 8);
LByte = zahl & 0xff;
daten_senden(HByte);
daten_senden(LByte);
}
}
EMPFANGEN
Code:
.
.
.
uint16_t zahl;
uint8_t usart_empfang;
void usart_init (void)
{
UCSRB |= (1<<RXEN) |(1<<RXCIE) ; //Daten empfangen und Interrupt für Datenempfang enable
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Asynchron 8N1
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}
ISR(USART_RXC_vect)
{
usart_empfang = UDR;
}
int main(void)
{
usart_init();
sei();
while (1)
{
uint8_t HByte = usart_empfang;
uint8_t LByte = usart_empfang;
zahl = (((uint16_t) HByte) << 8 ) | LByte;
zahl_ausgeben(zahl);
}
}
Lesezeichen