www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega16 durch ATmega644 getauscht - UART geht nicht mehr


Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte vorher einen ATmega16 verwendet, habe ihn nun durch einen 
ATmega644PV 10PU ausgetauscht.
Die UART Programmierung habe ich wie folgt angepasst, da der ATmega16 
nur einen, der ATmega644 2 UARTs besitzt:
void init_USART(void)
{
  // USART Einstellungen: 115200 Baud, U2X=1, Quarz: 14,7456 MHz
  UCSRA = (1<<U2X);
  UCSRB = (1<<TXEN) | (1<<RXEN);
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
  UBRRH = 0;
  UBRRL = 15;
}

void char_USART(char c)
{
  if(c=='\n') char_USART('\r');
  while((UCSRA&(1<<UDRE))==0);
  UDR = c;
}

=>
void init_USART(void)
{
  // USART Einstellungen: 115200 Baud, U2X=1, Quarz: 14,7456 MHz
  UCSR0A = (1<<U2X0);
    UCSR0B = (1<<TXEN0) | (1<<RXEN0);
    UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
    UBRR0H = 0;
    UBRR0L = 15;
}



void char_USART(char c)
{
  if(c=='\n') char_USART('\r');
  while((UCSR0A&(1<<UDRE0))==0);
  UDR0 = c;
}

Im AVR Studio habe ich ATmega16 durch ATmega644 getauscht. Ich hatte es 
auch mal mit ATmega644P versucht, ging aber auch nicht.

Beim Debuggen sehe ich folgendes:
Wenn ich im HyperTerminal einen Buchstaben eingebe, passiert schon 
nichts.
Ich weiß nicht woran es liegen könnte, da vorher doch alles geklappt 
hat.

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wo ist deine ISR - hast du auch entsprechend geändert ?

Sascha

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>und wo ist deine ISR - hast du auch entsprechend geändert ?

Er benutzt doch keine.

MfG Spess

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich habe nur das geändert, was oben steht.

ISR? Hatte ich vorher auch nicht drin.

Ich habe nur noch ein main-Programm, dass die init aufruft und in der 
while(1)-Schleife immer sowas wie char_USART('k'); stehen hat.
Aber an der Stelle UDR0 = c sehe ich beim Debuggen, dass UDR0 IMMER auf 
Null bleibt.

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe schon alle anderen Sachen getestet (SPI, TWI), das 
funktioniert alles wie beim ATmega16. Hat jemand vielleicht noch eine 
Idee, was ich noch probieren könnte??

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jürgen

wenn dein AVR keine Daten empfängt, was soll dann passieren wenn du im 
HyperTerminal einen Buchstaben eintippst?
Hast du an TX mal gemessen ob da überhaupt was rauskommt, wg. 
Baudrate/CKdiv-Fuses!


Sascha

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha Weber schrieb:
> Hast du an TX mal gemessen ob da überhaupt was rauskommt, wg.
> Baudrate/CKdiv-Fuses!

Hm ok, habe ich mal getan jetze.
Ich sende in einer while(1)-Schleife ständig die 0x55.
Anschließend 2ms pause.

Während der Pause ist TX HIGH.

Die 8 Bits sendet er innerhalb 1ms.
Ich habe aber eigentlich 115.2k Baudrate eingestellt.
Habe die ganauso wie beim ATmega16 eingestellt.
Irgendwas passt hier nicht oder?

CKDiv/8 ist angekreuzt.ich mach mal den Haken weg und sage gleich, was 
bei rauskommt

Autor: Jürgen Hems (misteret)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Na toll, das kam jetzt bei raus.
Aber immerhin nicht mehr nichts.
Sah beim ATmega16 aber immer noch etwas besser aus

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Na toll, das kam jetzt bei raus.

Dann läuft er noch nicht mit dem Quarz. Und nochmal an die Fuses;)

Autor: AVRuser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> Quarz: 14,7456 MHz
und
> ATmega644PV 10PU
das passt so nicht zusammen. Dieser Controller ist für max. 10MHz 
spezifiziert; siehe Datenblatt (es kann aber trotzdem gehen ...).

Wie stehen die restlichen Fuse-Bits? Die vom Mega16 können beim Mega644 
nicht passen. Der beliebte Fehler "ClkDiv8-Fuse" wurde bereits gefunden 
:-)
Stehen die CLKSEL-Fuses auf "externer Quarz"? Ansonsten ist der interne 
Takt aktiv (8 MHz RC-Oszillator).

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Dann läuft er noch nicht mit dem Quarz. Und nochmal an die Fuses;)

Okay, das war wohl korrekt.
Hatte ich eigentlich schon eingestellt, keine Ahnung, warum was wieder 
auf Intern gestellt war.

Ich bekomme schon ein paar Werte hin, aber noch nicht alles. Aber sieht 
schon wesentlich besser aus und ein paar Wörter sind sogar lesbar.


Ich probier mal weiter, ich bin zuversichtlich es jetzt hinzubekommen 
;-)

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVRuser schrieb:
> das passt so nicht zusammen. Dieser Controller ist für max. 10MHz
> spezifiziert; siehe Datenblatt (es kann aber trotzdem gehen ...).

Also ich habe das Datenblatt zu 
164A/164PA/324A/324PA/644A/644PA/1284/1284P vor mir liegen. Das müsste 
wohl auch auf den ATmega644PV 10PU zutreffen??

In dem Datenblatt, was ich hier habe, ist sogar die UBRR-Einstellung für 
14.7456 MHz in Table 18-11 aufgeführt

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, also die Übertragung von Großbuchstaben und von Zahlen funktioniert 
nun. Ich habe es im HyperTerminal so, wenn ich einen Buchstaben 
eintippe, dass dieser dann direkt wieder in UDR0 geschrieben wird.

Hat jemand eine Idee, wieso es nicht für Kleinbuchstaben funktioniert?

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geeeeeht! Der Mist geht!

Ich schwörs euch, eben konnte er NUR Großbuchstaben verarbeiten.
Ich habe nichts verändert, nur ein bisschen probiert.
Aber es geht.
Hoffe das war nur eine Ausnahme. Vielleich muss sich der Mikrocontroller 
ja erst an mich gewöhnen :D

Autor: Gastino G. (gastino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen Hems schrieb:
> Also ich habe das Datenblatt zu
> 164A/164PA/324A/324PA/644A/644PA/1284/1284P vor mir liegen. Das müsste
> wohl auch auf den ATmega644PV 10PU zutreffen??

Nein, Du hast den 644PV. Der ist nur bis 10 MHz spezifiziert. Du 
betreibst den weit außerhalb seines zulässigen Bereiches. Eine korrekte 
Funktion ist so eher Glückssache.

http://www.atmel.com/dyn/resources/prod_documents/8011S.pdf

("Speed Grades" auf der ersten Seite)

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.