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


von Michael W. (extremrider)


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


Lesenswert?

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

von Peter II (Gast)


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)


Lesenswert?

Kannst du mir sagen bitte, wie es denn lauten müsste?

Komm irgendwie grad nicht weiter, hatte sich compilieren lassen

von Wolfgang (Gast)


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)


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)


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


Angehängte Dateien:

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)


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.

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.