Über UART Buchstaben einlesen und PORT setzen

OP #3514432
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
}
#3514454
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.
OP #3514470
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?
Angehängte Dateien:

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