Forum: Mikrocontroller und Digitale Elektronik Von ATMEGA8 auf ATMEGA88V umgestellt


von Lokus P. (derschatten)


Lesenswert?

Ich habe mir anstelle vom ATMEGA8 nun den ATMEGA88V besorgt und wollte 
den Code 1:1 verwenden.

Nun habe ich festgestellt das die Interrupts beim ATMEGA88 anders 
angesprochen werden.
TCCR0 und TIMSK funktionieren hier nicht mehr.

Laut Datenblatt heißen die hier TCCR0A, TCCR0B, TCCR1A, TCCR1B und 
TIMSK0, TIMSK1, TIMSK2.

Nur welche sind die richtigen?
Ich blicke da nicht ganz durch.

hab schon ein wenig herumprobiert, komme aber leider zu keinem Ergebnis.

Ich verwende bei mir einen Timer-Interrupt für die Tastenabfrage (kurz, 
lang gedrückt)

von Jan (Gast)


Lesenswert?

Manfred W. schrieb:
> Nur welche sind die richtigen?

Das verraten dir die Datenblätter. Lesen bildet. ;)

von bensch (Gast)


Lesenswert?

> Nur welche sind die richtigen?

Das verraten dir die Datenblätter. Lesen bildet. ;)

Ausserdem gibt's bei Atmel dafür eine "Migration Note".

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Manfred,

Du: "Ich habe mir anstelle vom ATMEGA8 nun den ATMEGA88V besorgt und 
wollte
den Code 1:1 verwenden.
Nun habe ich festgestellt das die Interrupts beim ATMEGA88 anders
angesprochen werden."

Du findest sicher irgendwo auf der Atmel Homepage eine Dokument 
"migration from Atmega8 to Atmega88".

Ciao
Wolfgang Horn

von Lokus P. (derschatten)


Lesenswert?

> Du findest sicher irgendwo auf der Atmel Homepage eine Dokument
> "migration from Atmega8 to Atmega88".
>
Der Tip war schonmal nicht schlecht, danke.
Die Tabelle habe ich hier gefunden: 
http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf

Jetzt lese ich allerdings das es für TIMSK 3 unterschiedliche I/O 
Regsiter Adressen am MEGA88 gibt. Was bedeutet das? In wiefern ist das 
wichtig für das programm? Und woher weiß ich welcher Register für mich 
Relevant ist?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Manfred W. schrieb:
> Jetzt lese ich allerdings das es für TIMSK 3 unterschiedliche I/O
> Regsiter Adressen am MEGA88 gibt. Was bedeutet das?

Das bedeutet einfach, dass der ATmega88 mehr als 8 unterschiedliche
Timerinterruptquellen hat, so dass die Enableflags nicht mehr in einem
einzelnen Register Platz haben. Also hat man die Flags — geordnet nach
Timer — auf drei Register verteilt. Auf Seite 6 der Appnote kannst du
nachlesen, wohin die einzelnen Bits des TIMSK-Registers gewandert sind.
Eine genauere Beschreibung zu den einzelnen Bits findest du in den
Datenblättern.

Mehr als die Datenblätter und optional die Appnote brauchst du wirklich
nicht, um dein Problem zu lösen. Du musst nur bereit sein, die genannten
Dokumente auch zu lesen ;-)

von Lokus P. (derschatten)


Lesenswert?

> Du musst nur bereit sein, die genannten
> Dokumente auch zu lesen ;-)
>
Das Problem liegt eher beim "verstehen"

von Yalu X. (yalu) (Moderator)


Lesenswert?

Manfred W. schrieb:
> Das Problem liegt eher beim "verstehen"

Ok, vielleicht hat dir mein letzter Beitrag beim Verständnis etwas
geholfen. Wenn nicht, musst du deine Frage anders formulieren, um nicht
in den Verdacht der Leseunwilligkeit zu geraten. Wenn du bspw.
schreibst, welche Passage du in welchem Dokument nicht verstanden hast,
wird jeder erkennen, dass du dich bereits informiert hast. Entsprechend
werden die Antworten anders ausfallen.

von Lokus P. (derschatten)


Lesenswert?

Das mit den Bit, ok.

Also anstelle von:
1
TCCR0 = (1<<CS02)|(1<<CS00);
2
TIMSK = 1<<TOIE0;

müßte es heißen:
1
TCCR0B = (1<<CS02)|(1<<CS00);
2
TIMSK0 = 1<<TOIE0;

Und für den PWM?
1
void lcd_dimmer(uint8_t lcd)
2
{
3
  TCCR1A=0x81;
4
  TCCR1B=0x02;
5
  OCR1A=lcd;
6
}

Den OCR1A finde ich nicht in der Liste.

von Peter Z. (Gast)


Lesenswert?

OCR1AL und OCR1AH .... 16bit

von Yalu X. (yalu) (Moderator)


Lesenswert?

> Den OCR1A finde ich nicht in der Liste.

OCR1A ist ein Doppelregister (mit 16 Bit breitem Inhalt), das sich aus
den 8-Bit-Registern OCR1AH und OCR1HL zusammensetzt. Beim ATmega88 haben
sich zwar die Adressen dieser Register geändert, die Namen sind aber
gleich geblieben. Deswegen musst du hier im Sourcecode nichts ändern.
Der Compiler wird die geänderte Adresse automatisch einsetzen, wenn du
beim Kompilieren den ATmega88 als Controllertyp angibst.

von Lokus P. (derschatten)


Lesenswert?

Yalu X. schrieb:
> Der Compiler wird die geänderte Adresse automatisch einsetzen, wenn du
>
> beim Kompilieren den ATmega88 als Controllertyp angibst.

Ja, das ist gleich die nächste Sache.
Im AVRStudio kann ich für den Compiler zwar den ATMEGA88 auswählen aber 
nicht im programmiertool? Kann ich da den ATMEGA8 nehmen?

von Peter Z. (Gast)


Lesenswert?

Mach halt ein Update vom AVR Studio, dann kannst ihn auch auswählen...

von Manfred W. (Gast)


Lesenswert?

Die Interrupts dürften nun richtig gesetzt sein.

Allerdings habe ich jetzt noch folgendes Problem.
Die ganze Sache reagiert viel langsamer als beim ATMEGA8

Dieser war mit 4MHz getaktet.
Der ATMEGA88 kann per FUSE auf 8MHz oder 128kHz getaktet werden.
Ich hab mal standard 8MHz belassen.

Eigentlich müßte die Schaltung ja schneller reagieren.
Oder ist da irgendwo ein Teiler drinnen?

Liegts an der Software oder an den FUSES?

von spess53 (Gast)


Lesenswert?

Hi

>Liegts an der Software oder an den FUSES?

CKDIV8-Fuse?

MfG Spess

von Lokus P. (derschatten)


Lesenswert?

> CKDIV8-Fuse?
>
Du bist mein Held! :)
Danke!

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.