UART empfangen funktioniert nicht

OP #1842860
Lesenswert?

Moin Leute,

habe ein Problem ein Zeichen zu empfangen. Senden geht hingegen 
problemlos!
 Es ging auch schonmal vor einiger Zeit nur jetzt weiß ich nicht mehr 
wieso es nicht geht.

Hier mein Programm.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdint.h>
4
#include <inttypes.h>
5

6
/* 
7
  UART-Init: 
8
Berechnung des Wertes für das Baudratenregister 
9
aus Taktrate und gewünschter Baudrate
10
*/
11
 
12
#ifndef F_CPU
13
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
14
   F_CPU im Makefile definiert werden, eine nochmalige Definition
15
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
16
   #ifndef/#endif 
17
 
18
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
19
   verwendet wird und dort eine andere, nicht zur Hardware passende 
20
   Taktrate eingestellt ist: Dann wird die folgende Definition 
21
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
22
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
23
   noch nicht definiert: */
24
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
25
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
26
                         // Ohne ergeben sich unten Fehler in der Berechnung
27
#endif
28
 
29
#define BAUD 9600UL      // Baudrate
30
 
31
// Berechnungen
32
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
33
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
34
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
35
 
36
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
37
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
38
#endif 
39

40

41
//Prototypes
42
void uart_init(void);
43
uint8_t uart_getc(void);
44

45
int main(void)
46
{
47
   uart_init();
48
   char start='x';
49

50
   while(1)
51
      {
52
      if(uart_getc==start)
53
           PORTD |=(1<<PD4);    //LED
54
      }
55
return 0;
56
}
57

58

59
void uart_init(void)
60
{
61
    UCSR0B |= (1<<TXEN0);  // UART TX einschalten
62
    UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01)|(1<<USBS0);  // Asynchron 8N1 
63
 
64
    UBRR0H = UBRR_VAL >> 8;
65
     UBRR0L = UBRR_VAL & 0xFF;
66
}
67

68
/* Zeichen empfangen */
69
uint8_t uart_getc(void)
70
{
71
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
72
        ;
73
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
74
}

Ich habe beim SUB-D Stecker nur Leitung 2,3 und 5 angeschlossen (reicht 
ja aus). Ich verwende den ATmega324P20PU und einen externen 16 Mhz 
Quarz.
#1842864
Lesenswert?

Das hier
1
      if(uart_getc==start)

ist kein Funktionsaufruf der Funktion uart_getc. Das vergleicht, ob die 
Startadresse der Funktion uart_getc identisch ist mit start. Und da hier 
die Datentypen so gar nicht zusammenpassen, hätte ich hier eigentlich 
eine Warnung vom Compiler erwartet.


Mach dir Leerzeichen rein!
Seit du 6 Jahre alt bist, hast du dein Gehirn darauf trainiert, dass 
sich zwischen einzelnen Wörtern ein Leerraum befindet! Nutze dieses 
Potential!
Nur weil man in C alle Wörter prinzipiell auf Knirsch schreiben kann, 
heißt das nicht, das man das auch muss!
Wenn ich sehe, wieviele blödsinnige Fehler in diesem Forum von anderen 
gesucht werden müssen, nur weil man die einfachsten Dinge in den 
Schreibweisen bzw. Formatierung nicht beherzigt, könnte ich schreien.

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