Forum: Mikrocontroller und Digitale Elektronik UART Empfangsproblem | ATMega8


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus E. (opc)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.