AtMega Usart Abfrage

Gast #3840279
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
    }
Gast #3840422
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.
#3840519
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.
Gast #3840545
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...
#3840590
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. ;)

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