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


von Jürgen H. (misteret)


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:
1
void init_USART(void)
2
{
3
  // USART Einstellungen: 115200 Baud, U2X=1, Quarz: 14,7456 MHz
4
  UCSRA = (1<<U2X);
5
  UCSRB = (1<<TXEN) | (1<<RXEN);
6
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
7
  UBRRH = 0;
8
  UBRRL = 15;
9
}
10
11
void char_USART(char c)
12
{
13
  if(c=='\n') char_USART('\r');
14
  while((UCSRA&(1<<UDRE))==0);
15
  UDR = c;
16
}

=>
1
void init_USART(void)
2
{
3
  // USART Einstellungen: 115200 Baud, U2X=1, Quarz: 14,7456 MHz
4
  UCSR0A = (1<<U2X0);
5
    UCSR0B = (1<<TXEN0) | (1<<RXEN0);
6
    UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
7
    UBRR0H = 0;
8
    UBRR0L = 15;
9
}
10
11
12
13
void char_USART(char c)
14
{
15
  if(c=='\n') char_USART('\r');
16
  while((UCSR0A&(1<<UDRE0))==0);
17
  UDR0 = c;
18
}

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.

von Sascha W. (sascha-w)


Lesenswert?

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

Sascha

von spess53 (Gast)


Lesenswert?

Hi

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

Er benutzt doch keine.

MfG Spess

von Jürgen H. (misteret)


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.

von Jürgen H. (misteret)


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??

von Sascha W. (sascha-w)


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

von Jürgen H. (misteret)


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

von Jürgen H. (misteret)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

>Na toll, das kam jetzt bei raus.

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

von AVRuser (Gast)


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).

von Jürgen H. (misteret)


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 
;-)

von Jürgen H. (misteret)


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

von Jürgen H. (misteret)


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?

von Jürgen H. (misteret)


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

von Gastino G. (gastino)


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)

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.