UART Empfangsproblem | ATMega8

OP #4804956
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
Angehängte Dateien:
(Firma: Vescomp) #4805020
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.
OP #4805082
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren