ATmega164PA -> UARTs wollen nicht -.-

OP #2322062
Guten Tag liebe Gemeinde,
seit gestern Abend sitze ich an einem Problem, was mir bis jetzt 
jegliche graue Haare bereitet hätte, wenn ich denn welche hätte ;-)
Es geht um den UART beim ATmega164PA.

Ich "beclocke" diesen über einen Quarz mit 12MHz, habe ihn an meinem 
JTAGICE mk2 zum debuggen, alles wunderbar soweit.

Hier mal der Code, mit welchem ich die UARTs inite:
1
void uart_init(void)
2
{
3
  UBRR0 = (F_CPU/(16*19200ul))-1;
4
  UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
5
  UCSR0C = (3<<UCSZ00);
6
  
7
  //configure UART -> FT232RL
8
  UBRR1 = (F_CPU/(16*(long)19200))-1;
9
  UCSR1B = (1<<TXEN1) | (1<<RXEN1) | (1<<RXCIE1);
10
  UCSR1C = (3<<UCSZ10);
11
}

F_CPU ist in diesem Fall auf 12000000ul gesetzt.
So, der aufmerksame Leser wird erkannt haben, dass am UART1 ein FT232RL 
hängt, welcher mir als USB Brücke für den Laptop dient.
Hier benutzt ich HTerm, um das ganze zu testen.

Empfangen funktioniert...wenn ich über HTerm 10mal hintereinander das 
Zeichen schicke, lande ich in der ISR und kann auch die Bits auf der 
Leitung mit dem Oszi erkennen, diese Richtung FT232RL -> ATmega geht 
also.
Senden allerdings nicht...
Zu Beginn des Programms ist der Pin low, logischerweise, habe ich die 
Init-Routine durchschritten, ist der Sende-Pin high, so soll es auch 
sein, aber dabei bleibts.
Sende ich mit dieser Routine ein Zeichen:
1
void uart1send(uint8_t data)
2
{
3
  while(!(UCSR1A & (1<<UDRE1)))
4
  UDR1 = data;
5
}

Das Gleiche habe ich auch mit dem UART0, hier ist das gleiche Phänomen 
am Ausgangspin.
Daher vermute ich mal, dass __irgendwo__ ein dummes Bit nicht gesetzt 
ist oder sonst eine Einstellung verkehrt, was mir das Senden verhindert.
Ich wüsste momentan nicht, an was es liegen könnte...FuseBits sind 
soweit alle richtig gesetzt, sonst funktioniert der Controller ja auch.

Kann mir jemand helfen?

MfG
Markus

P.S.:
Die Main schaut recht unspektakulär aus, aber hier dennoch:
1
int main(void)
2
{
3
  uint8_t test;
4
  uart_init();
5
  sei();
6
  
7
    while(1)
8
    {
9
    uart0send(0x55);
10
    uart1send(0x55);
11
    //TODO:: Please write your application code 
12
    }
13
}
OP
Ein kleines Addendum:
Interessanterweise lande ich auch nicht in der USARTn_TX_vect ISR, 
obwohl diese im Register UCSRnB |= (1<<TXCIEn) aktiviert ist.
'n' steht hier jeweils als Platzhalter für UART1 und UART0!

Daher geht mein Verdacht immer mehr Richtung ATmega!
Markus Oberle schrieb:
> Hier mal der Code, mit welchem ich die UARTs inite:
> void uart_init(void)
> {
>   UBRR0 = (F_CPU/(16*19200ul))-1;
>   UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
>   UCSR0C = (3<<UCSZ00);
>
>   //configure UART -> FT232RL
>   UBRR1 = (F_CPU/(16*(long)19200))-1;
>   UCSR1B = (1<<TXEN1) | (1<<RXEN1) | (1<<RXCIE1);
>   UCSR1C = (3<<UCSZ10);
> }

Hier hast du das aber unterschlagen.
OP
hm damn it.
ok, da geb ich dir recht.
So schaut meine Routine aktuell aus:
1
void uart_init(void)
2
{
3
  UBRR0 = (F_CPU/(16*19200ul))-1;
4
  UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0) | (1<<TXCIE0);
5
  UCSR0C = (3<<UCSZ00);
6
  
7
  UBRR1 = (F_CPU/(16*(long)19200))-1;
8
  UCSR1B = (1<<TXEN1) | (1<<RXEN1) | (1<<RXCIE1) | (1<<TXCIE1);
9
  UCSR1C = (3<<UCSZ10);
10
}

kommt davon, wenn man gleichzeitig postet und nebenbei rumprobiert.

Erfolg bleibt weiterhin aus :-(
OP
So, ich darf teilweisen Erfolg verkünden...ich verstehs aber net...

es funktioniert, wenn ich die Zeile auskommentier:
1
while(!(UCSR1A & (1<<UDRE1)))

aber warum....KEINE AHNUNG! in allen möglichen Beispielen und laut 
Datenblatt, soll es SO mit der Zeile funktionieren...tut es aber nicht 
-.-
Gast
Exakt. Im Datenblatt steht, dass das UDRE Bit gesetzt wird, wenn das 
Senderegister leer ist und weiteres Datenbyte gesendet werden darf. Also
1
while (((UCSR1A & (1<<UDRE1))==0))
2
{
3
  __no_operation;
4
}
5

6
UDR1=dummy;

Wenn man die geschweiften Klammern nicht haben möchte, setzt man ein ; 
ans Ende der Zeile von der while-Anweisung.

So wie Du das hingeschrieben hast, schreibst Du ins UDR Register wenn es 
belegt ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.