Forum: Mikrocontroller und Digitale Elektronik ATmega644P UART , Senderegister nie Leer


von Markus M. (neuland)


Lesenswert?

Hallo,

ich habe folgendes Problem beim Programmieren des UART meines 
ATmega644P.

Den Code hab ich soweit direkt aus dem Datenblatt übernommen, bis auf
Register UBR0, das wird im Datenblatt mit 2 Registern ( High und Low ) 
dagestellt, wird mir aber beim Compilieren als Fehler angepriesen.


Nach dem Initialisieren wird das SendeDatenRegisterFlag UDRE0 ständig 
geprüft. Sobald dieses Leer, wird das SendeRegister mit dem Byte gefüllt 
und SOLLTE dann den Wert auf meiner RS232 Schnittstelle ausgegeben .

Die Ausgabe überprüfe ich auf meinem Rechner mit Hyperterminal und einem 
Angeschlossenem Null-Modem Kabel. Leider hab ich dabei keinen Erfolg, es 
kommen keine Daten an.



Ein Blick in den Simulator des AVR-Studios ( Device ist ATmega644P ) 
zeigt mir, das nach dem Zweiten schreiben in das SendeRegister das 
EmptyFlag des SendeRegisters ( UDRE0 ) nicht gesetzt wird. Somit bleibt 
das Programm in der Pollingschleife für das Flag hängen.

Scheinbar sendet der Controller die Daten nicht, da auch das TXCO Bit ( 
Daten gesendet ) zu keiner Zeit auf 1 gesetzt wird.


Aber wieso sendet der Controller nicht ? Evtl. Falsche Baudrate 
berechnet oder einen Fehler beim initialisieren gemacht ?

Den Clock Divisor 8 (CKDIV8) hab ich deaktiviert, d.h der Controller 
sollte mit dem Takt des Externen Quarzes laufen (14,7456MHz)

Hier ist das Programm, so wie ich es im Controller geflasht habe.

------------------------------------------------------------------------ 
--

#include<avr/io.h>


int main(void)
{
  //PRR = (PRR|(1<<PRUSART0));

  UBRR0 = 95; // BaudRate 9600 bei 14,7456MHz
  // Transmitter und Receiver Enable
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);

  UCSR0C = (1<<USBS0)|(1<<UCSZ00);

  while(1)
  {
    // Abfrage ob Senderegister Leer
    while ( !(UCSR0A & (1<<UDRE0)) )
      ;
    // Daten in Sende Register legen
    UDR0 = 0b10101010;
  }

}

------------------------------------------------------------------------ 
---

Danke schonmal fürs durchlesen, vielleicht kann mir von euch jemand 
weiterhelfen :)

Gruss Markus

von Spess53 (Gast)


Lesenswert?

Hi

Was hast du für ein Board? Beim STK500 wird ein normales 
Verlängerungskabel verwendet. kein Nullmodemkabel.

MfG Spess

von Markus Meinhard (Gast)


Lesenswert?

Ist kein Kaufboard.

Der Max istfolgendermassen angeschlossen :

     Pin14 T1OUT ---> Pin2 RS232 (Rx)
     Pin13 R1IN  ---> PIN3 RS232 (Tx)

Ok, das Null-Modem Kabel funktioniert in diesem Fall natürlich 
nicht.Werde ich ändern.

Erklärt aber immernoch nicht das verhalten in der AVR-Studio Simulation 
?!?

von Markus Meinhard (Gast)


Lesenswert?

Hab mal für nen ATmega8 das ganze Simuliert, und dabei verhält es sich 
genauso.
Ich bin mir aber ganz sicher, das hier das senden mit dem Controller 
funktioniert hatte.

Das mit dem EmptyFlag Scheint wohl mit der Simulation zusammenzuhängen 
:/

Werde mal ein Anderes Kabel anschliessen, evtl. Sendet der ATmega644P ja 
die ganze Zeit schon, und es hängt wirklich nur an dem Kabel.

von Spess53 (Gast)


Lesenswert?

Hi

Der Simulator hat einige Macken. Mal in der Hilfe bei 'Known Issues' 
nachsehen.

MfG Spess

von Markus Meinhard (Gast)


Lesenswert?

Hab da jetz nix gefunden.
Ich warte jetz einfach mal auf das Kabel ab, werde dann schreiben falls 
es daran gelegen hatte....

Gruss Maggus

von Markus Meinhard (Gast)


Lesenswert?

Ok, funktioniert nun :) (freu)


Scheinbar waren es zwei Sachen auf einmal .....

a)     Der Simulator vom AVR-Studio ist scheinbar sehr launig.
       Am Schluss konnte ich nichteinmal die Ports als Ausgänge 
definieren,
       über die Anweisung ist er einfach drübergesprungen. Deshalb auch
       wahrscheinlich der Fehler mit dem Empty-Flag.

b)     Wenn man sich ein Adapterkabel selbst bauen will, sollte man sich 
auch
       über die Belegung im klaren sein , Soviel nur dazu ;)


Trotzdem vielen Dank für die Hilfe :)

Gruss Maggus

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.