Forum: Mikrocontroller und Digitale Elektronik AtMega Usart Abfrage


von Rogger M. (Gast)


Lesenswert?

Hi

ich wollte über usart 2 bestimmte Tasten abfragen mit denen eine LED an 
Port B0 ein oder ausgeschaltet wird.
Das usart protocol funktioniert an sich ohnen Probleme, die empfangenen 
Zeichen werden jeweils wieder korrekt gesendet... doch die Abfrage 
funktioniert nicht, die LED ist immer an.

1
if (UCSR0A & (1<<RXC0))
2
    {
3
      receive_a = UDR0;
4
      if (receive_a == 'q')
5
      {
6
        PORTB=0;
7
      }
8
      if (receive_a == 'w')
9
      { 
10
        PORTB=1;
11
      }
12
      Uart0_Write(receive_a);
13
    }

von Hannes (Gast)


Lesenswert?

UCSR0A ist nicht USART 2

von Mathias O. (m-obi)


Lesenswert?

Wo steht was von USART 2? Er will 2 bestimmte Tasten abfragen.
Versuch es mal so:
1
if (strcmp(receive_a, "q") == 0)
Vergess nicht #include <string.h>

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Mathias O. schrieb:
> if (strcmp(receive_a, "q") == 0)

wenn man nur ein Zeichen vergleichen will ist das falsch. Denn receive_a 
wird wohl nur ein char sein.

von guest (Gast)


Lesenswert?

was sagt denn der debugger dazu?

von Daniel A. (daniel-a)


Lesenswert?

Rogger M. schrieb:
> Das usart protocol funktioniert an sich ohnen Probleme, die empfangenen
> Zeichen werden jeweils wieder korrekt gesendet... doch die Abfrage
> funktioniert nicht, die LED ist immer an.

Die abfrage kann es nicht sein. Led am richtigen Pin? Pin als Ausgang 
eingestellt? Funktioniert ein einfaches 
while(1){PORTB=PORTB?0:1;_delay(1000);}

von Rogger M. (Gast)


Lesenswert?

Daniel A. schrieb:
> Die abfrage kann es nicht sein. Led am richtigen Pin? Pin als Ausgang
> eingestellt? Funktioniert ein einfaches
> while(1){PORTB=PORTB?0:1;_delay(1000);}

ja, portsettings sind richtig, die Blinkroutine funktioniert.
was mir aber aufgefallen ist:
wenn ich einen bestimmten Buchstaben ausgeben will mit
1
Uart0_Write('w')

wird nicht ein "w" augegeben sondern "▒u". Gebe ich hier aber die 
Variable an die ich eingelesen hab, wird aber der entsprechende 
Buchstabe richtig ausgegeben.

von Max H. (hartl192)


Lesenswert?

Baudrate richtig eingestellt?

von Karl H. (kbuchegg)


Lesenswert?

Rogger M. schrieb:

>
1
> Uart0_Write('w')
2
>
>
> wird nicht ein "w" augegeben sondern "▒u".

Das ist ein Hinweis darauf, dass deine UART Kommunikation eben nicht 
funktioniert.

Ehe du die Kommunikation PC->Mega in Betrieb nimmst, solltest du erst 
mal die Umkehrung Mega->PC in Betrieb nehmen! Denn da fallen dir Fehler 
auf, die du in der anderen RIchtung nicht siehst, weil du am Mega keine 
vernünftige Ausgabemöglichkeit hast, von der du annehmen kannst, dass 
sie fehlerfrei ist. Auf dem PC hast du die aber. Daher spielt erst mal 
der PC die Anzeige und der Mega sendet zum PC.
1
int main()
2
{
3
  ...
4
5
  while( 1 ) {
6
    Uart0_Write( 'x' );    // oder 'w' :-)
7
  }
8
}

solange du am PC nicht genau die Zeichen siehst, die am Mega 
weggeschickt werden, brauchst du die Umkehrung erst gar nicht versuchen. 
Das ist sinnlos.

Also: siehst du im Terminalprogramm die 'x' (oder 'w'), dann ist alles 
in Ordnung. Siehst du sie nicht, dann musst du dem nachgehen, warum das 
so ist. In den meisten Fällen stimmt ganz einfach die Taktfrequenz des 
µC nicht, wenn am anderen Ende der UART nicht das rauskommt, was man am 
Mega reingibt.

von Thomas E. (thomase)


Lesenswert?

Einzelne Zeichen sind manchmal trügerisch.
1
  unsigned char nInd = 0;
2
  char foxtext[] = {"the quick brown fox jumps over the lazy dog\r\n"};
3
4
  while(1)
5
  {
6
    Uart0_Write(foxtext[nInd++]);
7
    if(!foxtext[nInd]) nInd = 0;
8
  }

mfg.

von Rogger M. (Gast)


Lesenswert?

vielen Dank für die Hilfe, Problem gefunden:

im Register UCSR0A war das Bit U2X0 gesetzt.
das Programm hatte also einen Wirwar eingelesen, war aber auf der 
anderen Seite fähig den Wirwar wieder als das jeweilige ursprüngliche 
Zeichen auszugeben...

von M. K. (sylaina)


Lesenswert?

Also ich mach wahrscheinlich immer zuviel aber bei USART mache ich es 
immer so, dass ich zunächst mir ein beliebiges Zeichen vom Atmega an den 
PC senden lasse, so wie Karl-Heinz es schon geschrieben hat. Als zweite 
Prüfung kommt dann, dass ich mir erst mal zurückschicken lasse, was ich 
dem Atmega gesendet habe. So sieht man IMO am besten ob die 
USART-Kommunikation überhaupt läuft. ;)

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.