www.mikrocontroller.net

Forum: Compiler & IDEs UART empfangen funktioniert nicht


Autor: C. S. (chappi)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <inttypes.h>

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


//Prototypes
void uart_init(void);
uint8_t uart_getc(void);

int main(void)
{
   uart_init();
   char start='x';

   while(1)
      {
      if(uart_getc==start)
           PORTD |=(1<<PD4);    //LED
      }
return 0;
}


void uart_init(void)
{
    UCSR0B |= (1<<TXEN0);  // UART TX einschalten
    UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01)|(1<<USBS0);  // Asynchron 8N1 
 
    UBRR0H = UBRR_VAL >> 8;
     UBRR0L = UBRR_VAL & 0xFF;
}

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

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier
      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.

Autor: C. S. (chappi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sry schreibfehler

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

da stehen ^^

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. S. schrieb:
> sry schreibfehler
>
> habe natürlich
>
>
if(uart_getc()==start)
> 
>
> 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.

Autor: g457 (Gast)
Datum:

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

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

Autor: C. S. (chappi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay.

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. S. schrieb:
> Geht immer noch nicht

Und das siehst Du an der LED:
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.

Autor: C. S. (chappi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nenene wie schlecht. jaaaaaa danke.

Autor: rudel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm die uart blibliothek von peter fleury^^

Autor: C. S. (chappi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber da muss man sehr viel umdefinieren oder?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.