www.mikrocontroller.net

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


Autor: Markus Meinhard (neuland)
Datum:

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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Markus Meinhard (Gast)
Datum:

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

Autor: Markus Meinhard (Gast)
Datum:

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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Markus Meinhard (Gast)
Datum:

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

Autor: Markus Meinhard (Gast)
Datum:

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

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.