Forum: Compiler & IDEs ATMega1280 und UART Lib Peter Dannegger


von Bene J. (terfagter)


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:
1
void initusart0(void)
2
{  
3
  UBRR0 = ((F_CPU+BAUD*8)/(BAUD*16)-1);
4
  UCSR0B |= (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0);
5
  UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
6
}
7
8
void putch0( char x )
9
{
10
    while (!(UCSR0A & (1<<UDRE0)));
11
12
    UDR0 = x;
13
}
Bei der Lib von Peter Dannegger initialisiere ich die USART0 folgend und 
sende einen String:
1
  init_uart0( (u16)(XTAL / BAUD / 16 - 0.5) );
2
  sei();
3
  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

von Bene J. (terfagter)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Zeig mal das komplette Testprogramm (als Anhang).


Peter

von Bene J. (terfagter)


Angehängte Dateien:

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
1
uputchar0( ugetchar0());

Wenn ich aber die die Funktion
1
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.

von Bene J. (terfagter)


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.

von Peter D. (peda)


Lesenswert?

>  putch0( 'g' );
>  uputchar0('h');

Entweder Polling oder Interrupt.
Beides zusammen geht nicht.


Peter

von Bene J. (terfagter)


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?

von Peter D. (peda)


Lesenswert?

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

Dann werden kleine Funktionen nicht wegoptimiert.


Peter

von Bene J. (terfagter)


Lesenswert?

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

von Bene J. (terfagter)


Lesenswert?

Noch eine Verständnisfrage zu einer kleinen Funktion in deiner MAIN.c:
1
z.B. i = 1000
2
void delay_1ms( u16 i )
3
{
4
  do{
5
    _delay_ms( 1 );
6
  }while( --i );
7
}

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

Wo liegt der Unterschied?
Danke.

von Bene J. (terfagter)


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?!
1
static u8 rx_buff[RX1_SIZE];
2
static u8 rx_in;
3
static u8 rx_out;
4
static u8 tx_buff[TX1_SIZE];
5
static u8 tx_in;
6
static u8 tx_out;

Z.B. dann in
1
static u8 rx_buff1[RX1_SIZE];
2
static u8 rx_in1;
3
static u8 rx_out1;
4
static u8 tx_buff1[TX1_SIZE];
5
static u8 tx_in1;
6
static u8 tx_out1;

von Peter D. (peda)


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

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.