ATmega16 durch ATmega644 getauscht - UART geht nicht mehr

OP #1779094
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.
OP #1779101
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.
OP #1779138
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
Gast #1779166
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).
OP #1779170
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 
;-)
OP #1779177
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
#1779310
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren