www.mikrocontroller.net

Forum: Compiler & IDEs ATMega1280 und UART Lib Peter Dannegger


Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich versuche seit ein paar Tagen die UART Lib von Peter Dannegger zu 
benutzen. Bisher habe ich eine andere Lib benutzt, die aber weit weniger 
ausgereift ist und auch keinen FIFO hat.
Leider kann ich über meine UART mit der neuen Lib aber kein Zeichen 
versenden.
Bei meiner alten Lib sah die init und putc so aus:
void initusart0(void)
{  
  UBRR0 = ((F_CPU+BAUD*8)/(BAUD*16)-1);
  UCSR0B |= (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0);
  UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
}

void putch0( char x )
{
    while (!(UCSR0A & (1<<UDRE0)));

    UDR0 = x;
}
Bei der Lib von Peter Dannegger initialisiere ich die USART0 folgend und 
sende einen String:
  init_uart0( (u16)(XTAL / BAUD / 16 - 0.5) );
  sei();
  uputs0("Hallo Peter\n\r");

Der String kommt aber nie an.
Baud ist 9600 und XTAL 8000000
Wo könnte ich die Fehlersuche ansetzen?
Fehler meldet der Compiler auch nicht. Alle Registernamen sind doch bei 
dieser Lib schon richtig eingestellt oder?
Danke für eure Hilfe

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also an der Initialisierung liegt es nicht. Da hab ich mit meiner alten 
init etwas rumprobiert und da ist alles gleich.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal das komplette Testprogramm (als Anhang).


Peter

Autor: Bene Jan (terfagter)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bin mittlerweile schpon etwas weiter gekommen.
Ich habe alles testweise in die uart.h getan, habe aber nur die uartinit 
etwas verändert.

Als Ausgabe erhalte ich so ein g, aber kein weiteres h oder abcdef.
Ein Echo erhalte ich dann auch nicht über
uputchar0( ugetchar0());

Wenn ich aber die die Funktion
uputs0("abcdef\n\r");
auskommentiere, dann kommt das h auch an und danach kriege ich auch 
teilweise ein Echo zurück. Manchmal kommt aber auch gar nix zurück und 
manchmal alles dreifach. Nach ca. einer halben Minute kommt dann gar 
nichts mehr zurück.

Vielen Dank für deine Hilfe.

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich gerade noch festgestellt habe:

Das erste g wird ausgegeben und danach nichts mehr.
Sende ich aber jetzt irgendeinen Buchstaben an den Controller antwortet 
er einmal mit habcdef. Danach antwortet er nicht mehr.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  putch0( 'g' );
>  uputchar0('h');

Entweder Polling oder Interrupt.
Beides zusammen geht nicht.


Peter

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber auch wenn ich die Funktion ganz raus nehme, ändert sich nichts. 
Erst wenn ich ein Zeichen an den controller schicke sendet er die 
Zeichen. Danach kann ich aber senden was ich will, er gibt mir kein echo 
zurück.

Das komische ist, dass ich das gleiche verhalten auch bei der uart lib 
von Peter fleury habe. Woran könnte das liegen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte vielleicht ein volatile-Problem sein.
Setze mal die Compileroption:
-fno-inline-small-functions

Dann werden kleine Funktionen nicht wegoptimiert.


Peter

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.
Es lag tatsächlich daran.
Da wäre ich wohl nie drauf gekommen...

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch eine Verständnisfrage zu einer kleinen Funktion in deiner MAIN.c:
z.B. i = 1000
void delay_1ms( u16 i )
{
  do{
    _delay_ms( 1 );
  }while( --i );
}

Wieso benutzt du diese Funktion und nicht einfach
_delay_ms(1000);

Wo liegt der Unterschied?
Danke.

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch eine letzte kleine Frage:

Wenn ich eine weitere USART-Schnittstelle einbinden will, muss ich dann 
ausser bei allen Funktionen und Registernamen die 0 durch eine 1 zu 
ersetzen, auch die folgenden Variablen etwas umbenennen oder stören die 
sich nicht gegenseitig?!
static u8 rx_buff[RX1_SIZE];
static u8 rx_in;
static u8 rx_out;
static u8 tx_buff[TX1_SIZE];
static u8 tx_in;
static u8 tx_out;

Z.B. dann in
static u8 rx_buff1[RX1_SIZE];
static u8 rx_in1;
static u8 rx_out1;
static u8 tx_buff1[TX1_SIZE];
static u8 tx_in1;
static u8 tx_out1;

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die alten AVR-GCC konnten noch kein _delay_ms(1000).

Static Variablen können den gleichen Namen haben.
Du mußt dann aber die C-Files nacheinander compilieren.


Peter

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.