Forum: Mikrocontroller und Digitale Elektronik UART Char empfangen und auswerten funktioniert nicht


von Julian Z. (julian1103)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe ein Problem bei meinem ATmega32 ein Char über die serielle 
Schnittstelle zu empfangen.

Die Aufgabenstellung ist wie folgt:
Wird ein definiertes Zeichen (z.B c) übers Terminalprogramm geschickt 
soll eine LED angehen.

Im Anhang habe ich mal meinen Code eingefügt.
Dazu ist zu sagen, dass das Senden uart_putc (Char senden) und uart_puts 
(String senden) ohne Probleme funktioniert.
Somit kann es nur noch an der Interrupt Routine oder der Routine zum 
Empfangen liegen.

Leider bekomme ich es nicht hin, etwas zu empfangen und auszuwerten.
Mir ist bewusst, das solche Themen hier schon hundert mal abgehandelt 
wurden doch ich habe seit Tagen das Forum durchsucht, aber leider nichts 
gefunden was mir weiter hilft.

Noch kurz die Rahmenbedingungen:
-Als Entwicklungsumbegung benutze ich Atmel Studio 6
-Als Programmierboard benutze ich das Atmel Evaluationboard V2.01
-Verbunden mit einem USB<-->Serial Wandler
-Mit PonyProg2000 wird programmiert
-Als Terminalprogramm benutze ich Termite 3.2

Hoffe ihr könnt mir helfen.

von Jim M. (turboj)


Lesenswert?

Besorge Dir ein C-Buch und lies es erstmal. Du machst viele 
Anfängerfehler!

Dein Programm versucht gleichzeitig via Interrupt und via Polling auf 
den UART zuzugreifen, da sollte man sich für eine Variante 
entscheiden.

Wieso das überhaupt durch den Compiler geht ist mir auch unklar. Es 
müsste nämlich als
1
  c = uart_getc();

umgeschrieben werden.

von Jope (Gast)


Lesenswert?

Du hast in USART_init() den Empfänger nicht eingeschaltet.

von Julian Z. (julian1103)


Lesenswert?

@Jim Meba
Ist natürlich richtig das es
1
c = uart_getc();
sein muss. Erster fehler.

@Jope
Danke für diese Antwort. Ist richtig, dass ich vergessen habe den 
Empfang einzuschalten.

ich habe den Code jetzt wie folgt geändert und es funktioniert.
Allerdings bin ich noch ein bisschen überfragt was ich mit dem Interrupt 
machen soll. So wie hier geschrieben nutze ich diesen ja trotzdem nicht, 
oder?
1
int main(void)
2
{
3
  
4
  DDRD = (1<<PD5) | (1<<PD6);
5
  USART_init();
6
  sei();  
7
8
while(1)
9
  {
10
    LED1();
11
    
12
    if ( (UCSRA & (1<<RXC)) )
13
    {
14
      uint8_t c;
15
      c = uart_getc();
16
      if (c == 'a')
17
      {
18
        LED2();
19
      }
20
      
21
    }  
22
  } 
23
}

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.