Hallo,
mal wieder ein UART-Problemchen.
Problem: über uart_getc() soll ein 8bit Variablenwert als Dezimalzahl
vom PC via UART an einen ATMega8 gesendet werden. Problem hierbei: es
werden ohne auf eine Eingabe zu warten irgendwelche Zufallszahlen über
den UART übertragen, ohne dass ich eine Eingabe mache.
Hier der entsprechende Teil des Codes bei dem die Variablen
"stunde,minute,sekunde" über UART eingelesen werden sollen:
1 | void uhrzeit_eingeben_uart(void)
|
2 | {
|
3 | char string[20];
|
4 |
|
5 | uint8_t ja_nein=0;
|
6 |
|
7 | while (ja_nein==0)
|
8 | {
|
9 |
|
10 | uart_puts("Stunden eingeben: \r\n");
|
11 | stunde=uart_getc();
|
12 | uart_puts("Minuten eingeben: \r\n");
|
13 | minute=uart_getc();
|
14 | uart_puts("Sekunden eingeben: \r\n");
|
15 | sekunde=uart_getc();
|
16 | sprintf(string,"%i:%i:%i\r\n",stunde,minute,sekunde);
|
17 | uart_puts("\r\nUhrzeit: ");
|
18 | uart_puts(string);
|
19 | uart_puts("\r\nSind die Eingaben korrekt? Eingabe: (1)=ja oder (0)=nein\r\n");
|
20 | ja_nein=uart_getc();
|
21 | if (ja_nein==0)
|
22 | {
|
23 | ja_nein=0;
|
24 | }
|
25 | else if (ja_nein==1)
|
26 | {
|
27 | ja_nein=1;
|
28 | }
|
29 |
|
30 |
|
31 | }
|
32 |
|
33 |
|
34 | }
|
die Variablen stunde, minute, sekunde sind global definiert als:
volatile uint8_t sekunde, ..... da eine ISR (Zeitzähler 1sek.) noch
darauf zugreift.
Die Funktion uart_getc() sieht folgendermaßen aus:
1 | /* Zeichen empfangen */
|
2 | uint8_t uart_getc(void)
|
3 | {
|
4 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
|
5 | ;
|
6 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
|
7 | }
|
Die Kommunikation an sich ist ok, strings/Variablen senden = i.O., ich
überprüfe die Eingaben/Ausgaben und auch das Problem in Hterm und
TeraTerm (beides mal das gleiche Phänomen).
Im Anhang ein Foto von der Übertragung mit den Zufallswerten.
Was lässt sich noch überprüfen/einstellen, wenn einfach Zeichen gesetzt
werden ohne, dass man eine Eingabe gemacht hat?
Gruß
Markus