Forum: Compiler & IDEs UART empfangen funktioniert nicht


von C. S. (chappi)


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.

von Karl H. (kbuchegg)


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.

von C. S. (chappi)


Lesenswert?

sry schreibfehler

habe natürlich
1
if(uart_getc()==start)

da stehen ^^

von Karl H. (kbuchegg)


Lesenswert?

C. S. schrieb:
> sry schreibfehler
>
> habe natürlich
>
>
1
if(uart_getc()==start)
2
>
>
> da stehen ^^

Das heißt, du hast wieder mal nicht den Code gepostet, den du auch 
compilierst.

Danke. Ich bin raus.
Ich hab kein Interesse daran, Fehler zu suchen und zu finden, die du in 
deinem wirklichen Code gar nicht hast.

von g457 (Gast)


Lesenswert?

>    UCSR0B |= (1<<TXEN0);  // UART TX einschalten
                   ^^               ^^
> uint8_t uart_getc(void)
               ^^^

Was fällt an diesen beiden Zeilen auf? :-)

von C. S. (chappi)


Lesenswert?

okay.

habe (1<<RXEN0) geaddet.
Geht immer noch nicht T.T

von Hc Z. (mizch)


Lesenswert?

C. S. schrieb:
> Geht immer noch nicht

Und das siehst Du an der LED:
1
PORTD |=(1<<PD4);    //LED
Nur: Wo wird PD4 als Output definiert?

Nu sach bloß nicht, das ist drin, nur nicht im veröffentlichten Code. 
Dann wäre ich auch raus.

von C. S. (chappi)


Lesenswert?

nenene wie schlecht. jaaaaaa danke.

von rudel (Gast)


Lesenswert?

nimm die uart blibliothek von peter fleury^^

von C. S. (chappi)


Lesenswert?

aber da muss man sehr viel umdefinieren oder?

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.