Forum: Mikrocontroller und Digitale Elektronik Über UART Buchstaben einlesen und PORT setzen


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 Michael W. (extremrider)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
Ich habe eine Atmega 32 und dort die RS232 Schnittstelle programmiert, 
hardware-mäßig aufgebaut und über ein kleines Testprogramm Daten 
eingelesen und wieder ausgegeben.

Jetz hab ich allerdings ein Problem und zwar möchte ich untersuchen ob 
sich ein a im UDR befindet und dann einen Pin am PORTB setzen.

Überprüfe ob ein a über Uart eingelesen

ja--> LED einschalten

Hier mein Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <ctype.h>
4
5
6
// ---------- Konstantendefinitionen ----------------------------------
7
8
const char startText[] = "UART Test\r";
9
10
11
// ---------- Globale Variablen ---------------------------------------
12
13
14
// ---------- Funktionsprototypen -------------------------------------
15
16
int receiveByte();
17
int transmitByte(char data);
18
19
20
// ---------- Hauptprogramm -------------------------------------------
21
22
int main(void)
23
{
24
  uint8_t i;
25
  char cIn;
26
27
  //---------- Initialisierung Port IO ------------------------------
28
29
  PORTB = 0x00;                     // LEDs inaktiv setzen
30
  DDRB = 0xFF;                      // Port B auf Ausgang schalten
31
32
33
  //---------- Initialisierung USART --------------------------------
34
35
  //  UCSRA = (0<<U2X);            // disable 2x speed change
36
37
  UCSRB = (1<<RXEN)|(1<<TXEN); // enable receiver and transmitter
38
39
  UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // USART Mode Select
40
41
  UBRRH = 0;                   //
42
  UBRRL = 23;                   // set the baudrate
43
44
  
45
  for (i = 0; startText[i] != '\0'; i++) // Initialisierungstext senden
46
  {
47
    transmitByte(startText[i]);
48
  }
49
50
51
  //---------- Hauptschleife ----------------------------------------
52
53
  while(1)
54
  {
55
    //cIn = receiveByte();
56
      //      cIn = toupper(cIn);
57
    //cIn++;
58
    //transmitByte(cIn);
59
  
60
    while (receiveByte==97)
61
    {
62
      PORTB=0x01;
63
    }
64
    
65
  
66
    
67
  }
68
69
  return 0;
70
}
71
72
73
74
// ---------- Unterprogramme ------------------------------------------
75
76
int receiveByte()
77
{
78
  while( !(UCSRA & (1<<RXC)) );     // Wait for incomming data
79
  return UDR;
80
}
81
82
83
int transmitByte(char data)
84
{
85
  while ( !(UCSRA & (1<<UDRE)) );   // Wait for empty transmit buffer
86
  UDR = data;
87
  //    _delay_ms(50);                    // start transmission
88
  return 0;
89
}

: Bearbeitet durch Moderator
von Michael W. (extremrider)


Bewertung
0 lesenswert
nicht lesenswert
Mein Problem ist, dass es nicht funktioniert...
Kann mir bitte jemand helfen?

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
wo ist jetzt die Frage?

dein code düfte überhaupt nicht durch den Compiler gehen:

while (receiveByte==97)

ist für eine Funktion kein gültiger Aufruf.

von Michael W. (extremrider)


Bewertung
0 lesenswert
nicht lesenswert
Kannst du mir sagen bitte, wie es denn lauten müsste?

Komm irgendwie grad nicht weiter, hatte sich compilieren lassen

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael W. schrieb:
> while (receiveByte==97)
>     {
>       PORTB=0x01;
>     }

Was soll diese while-Schleife? Der Prozessor kreist doch sowieso in 
seiner Hauptschleife.

von Michael W. (extremrider)


Bewertung
0 lesenswert
nicht lesenswert
Na ja, ich dachte er soll ständig die Funktion abfragen und dadurch 
beobachten ob sich ein a im UDR befindet und je nachdem darauf reagieren

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Michael W. schrieb:
> Kannst du mir sagen bitte, wie es denn lauten müsste?

Ähm.
Wenn dir nicht geläufig ist, dass ein Funktionsaufruf immer eine 
Argumentliste besitzt, die auch leer sein kann, dann bedeutet das 
hauptsächlich eines: Du brauchst mehr als dringend ein C-Buch
1
    if( receiveByte() == 97 )

und warum schreibst du eigentlich 97? Soll das möglichst kryptisch sein? 
Nach dem Muster: Wenn es schwer zu schreiben war, soll es auch schwer zu 
lesen sein.
1
    if( receiveByte() == 'a' )

So braucht niemand erst mal eine ASCII Tabelle konsultieren, um zu 
wissen auf welches Zeichen du deinen Code reagieren lassen willst.


Hast du deine UART schon getestet? Funktioniert die Übertragung vom µC 
zum Terminal auf dem PC? Wenn nicht, dann mach das zuerst. Denn dann 
siehst du erst mal im Terminal ob die UART grundsätzlich funktioniert. 
WEnn du in der Schleife einfach immer nur ein 'x' sendest, dann müssen 
im Terminal auch lauter x auftauchen. Wenn nicht, dann stimmt etwas an 
der UART grundsätzlich nicht. In dem Fall hat es dann nämlich auch 
überhaupt keinen Sinn, vom PC an den AVR zu übertragen. Das ist dann nur 
Stochern im Nebel.


> Komm irgendwie grad nicht weiter, hatte sich compilieren lassen

Du solltest dir angewöhnen, Warnungen vom Compiler ernst zu nehmen! Denn 
in den meisten Fällen hat er recht, wenn er dubiose Konstrukte anwarnt.

: Bearbeitet durch Moderator
von Michael W. (extremrider)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Okay, danke erst mal.

Ist es nicht so, dass wenn ich die Taste a (Kleinbuchstabe) auf der 
Tastatur drücke der ASCII CODE im UDR steht?

Diesen wollte ich auslesen und hab auf 97 abgefragt.

Kommunikation ist möglich (nur ein Problem was im Bild erkennen kann), 
eigentlich sollte der Controller dies wieder ausgeben, was er empfangen 
hat doch leider bekommen ich andere Zeichen zurück.

Gibts ne Erklärung dafür?

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael W. schrieb:
> Gibts ne Erklärung dafür?

Der Standardtip wäre: Übertragungsgeschwindigkeit von Sender und 
Empfänger stimmen nicht überein. Guck dir auf dem Oszi mal ein vom PC 
gesendetes und ein vom µC gesendetes Zeichen an und vergleiche die 
Symboldauer.

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.