Forum: Mikrocontroller und Digitale Elektronik UART Empfangsproblem | ATMega8


von Markus E. (opc)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

uart_getc() liefert dir den ASCII Code deiner Eingabe. Bei einer "1" 
also als Beispiel 0x31. Als Stunde interpretiert wäre das dann 49Uhr, 
etwas spät am Abend.
Deine ja-nein Abfrage scheitert aus dem gleichen Grund.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Markus E. schrieb:
> Die Funktion uart_getc() sieht folgendermaßen aus:
> /* Zeichen empfangen */
> uint8_t uart_getc(void)
> {
>   while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
>   ;
>   return UDR;                   // Zeichen aus UDR an Aufrufer
> zurueckgeben
> }

 Vor langer Zeit passierte mir dasselbe (wahrscheinlich sogar auch
 mit MEGA8) und ich habe das so gemacht (natürlich nicht in C):
1
  while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
2
  ...                           /* UDR einlesen */
3
  UCSRA &= ~(1 << RXC);         /* loescht RXC Bit */

 ob das auch bei dir hilft, weiss ich nicht, must du halt ausprobieren.

: Bearbeitet durch User
von Markus E. (opc)


Lesenswert?

Georg G. schrieb:
> uart_getc() liefert dir den ASCII Code deiner Eingabe.

ich mache doch aber gar keine Eingabe.

Marc V. schrieb:
> ob das auch bei dir hilft, weiss ich nicht, must du halt ausprobieren.

guter Hinweis, habe dies auch in meiner uart_getc() Funktion eingebaut, 
löst nur leider mein Problem nicht.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Markus E. schrieb:
> ich mache doch aber gar keine Eingabe.

Dann hast du entweder ein Hardware Problem oder ET ist in der Nähe und 
telefoniert nach Hause :-)

Beschreibe bitte mal den Aufbau, vielleicht mit Foto.
Der Code der UART Initialisierung könnte auch helfen.

: Bearbeitet durch User
von Markus E. (opc)


Lesenswert?

Georg G. schrieb:
> Markus E. schrieb:
>> ich mache doch aber gar keine Eingabe.
>
> Dann hast du entweder ein Hardware Problem oder ET ist in der Nähe und
> telefoniert nach Hause :-)
>
> Beschreibe bitte mal den Aufbau, vielleicht mit Foto.

--> so ein Mist. ET sagt: Hardware defekt :)

Mein USB-UART Konverter ist wohl defekt, habe einen anderen ausprobiert, 
damit geht es.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.