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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.