PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kompatibilität von ATmega8 und ATmega168



cumi
21.05.2007, 14:25
Hallo Zusammen

Ich möchte gerne wissen wie kompatibel der ATmega8 und der neuere ATmega168 ist. Also rein von der Pin-Belegung sind sie ja (bis auf die zusätzlichen Funktionen des ATmega168) kompatibal.
Ich habe nun das Problem, dass die 8kb Speicher des ATmega8 nicht ausreichen und ich daher etwas mehr benötige.
Wenn ich jedoch versuche den selben Programmcode (C-Code mit avr-gcc und avr-libc) zu kompilieren kriege ich einige Fehler (Register nicht bekannt, etc.),
Beim Blick ins Datanblatt stelle ich fest, dass einige Register und auch die Bits in den Registern neue Namen bekommen habe. Sind dies nur neue Namen und funktioniert die Hardware noch gleich, sodass ich den selben Code für das Ansprechen vom EEPROM, SPI, UART, Timer brauchen kann wie beim ATmega8 und nur die Namen (über den Präprozessor) in den Grif kriegen muss?

Vielen Dank für eure Hilfe.
cumi

raggy
21.05.2007, 16:41
Hallo
Mein Programm DCF läuft auf dem Atmega168 auch nicht mehr.
Habe mal im Internet gestoebert,es scheinen einige Register woanders zu liegen.RN-Wissen ist auch was angedeutet.
Gruß raggy
Ps.Mit C kenne ich mich nicht aus.

linux_80
21.05.2007, 18:07
Hallo cumi,

der Code sollte noch funktionieren, nur die Namen sind anders,
wenn man einfach nur für den M168er compiliert sollte es eigentlich soweit passen. :-k nach dem anpassen der Registernamen.

Nur das Hex für einen Mega8 läuft auf einen M168 nicht, da die Register an anderer Stelle sind, und der andere bzw. mehr IRQs hat. Das RAM fängt auch später an als beim M8.

JanB
21.05.2007, 19:50
Hallo,
die Interupt-Sprungtabelle ist anders aufgebaut und die Sprünge sind JMPs anstatt RJMPs.

Einige IO-Register liegen an anderen Adressen.
Manche auch an Adressen oberhalb von 1Fh,
so dass sie mit den "normalen" IO-Befehlen wie IN und OUT usw. nicht erreicht werden können.
Die muss man dann mit LDS und STS ansprechen.
Das kostet dann jedesmal einen zusätzlichen Takt. :-(

Die Registerbezeichnungen haben sich auch geändert, meistens
sind sie aber nur durch eine Ziffer erweitert worden.
Z.B: Usart-Data-Register heisst beim Mega-8 UDR und beim Mega-168 UDR0


Gruß Jan

cumi
21.05.2007, 19:56
hmm, ok dann hat sich da doch etwas getan. Was ja nicht immer nur schlecht ist. Ich finde es grundsätzlich toll, dass die AVR Familie weiterentwickelt wird. Etwas mühsam ist es jedoch schon :(

Aber dann sollen ja eigentilch alle Probleme mit richtigen Haederfiles (io.h) gelöst werden können, denn das wäre mir schon noch wichtig. Ich benutze die Library schon für den ATmega32 und den ATmega8. Dort sind sogar die Name gleich.

Mal schauen. Ich hoffe ich krieg das hin, denn wenn ich verschiedenen Code habe für die verschiedenen Controller wird das ganze etwas umständlicher.

linux_80
21.05.2007, 21:01
Du könntest entweder eigene Headerdateien machen, in denen die Namen so angepasst werden, das es bei allen passt.
Oder den Compiler die Arbeit machen lassen, und Du für jeden AVR den Code angeben:

#if defined (__AVR_ATmega32__)
#define irgendwas 1
#endif
#if defined (__AVR_ATmega8__)
#define irgendwas 2
#endif
Oder statt dem define gleich den Code, beim compilieren wird der richtige Code, für den AVR wie im Makefile angegeben, zusammengestellt.

ogni42
22.05.2007, 12:37
Der Migration Guide AVR094 (zu finden auf www.atmel.com) stellt die Unterschiede dar.

cumi
24.05.2007, 12:59
das heisst der ATmega88 und der ATmega168 sind vollständig kompatibel? Denn die Tabelle im AVR094 ist super praktisch...