Forum: Mikrocontroller und Digitale Elektronik Frage zum AVR-Tutorial bzgl. 7-Segment-Anzeige


von Donar (Gast)


Lesenswert?

Guten Tag allerseits,

vorerst einaml herzlichen Dank an die Autoren des AVR-Tutorials, dieses 
umfangreiche Werk erleichert einem Neuling wie mir so manches!

Ich hätte jetzt eine Frage, bei der ich nicht weiterkomme.

Ich habe die Schaltungen soweit alle nachgebaut und alles klappt wie 
erwartet, nur beim multiplexen der vier 7-Segment-Anzeigen hab ich ein 
Problem, und zwar deswegen, weil ich statt eines ATmega8 einen ATmega48 
benutze.

Im Beispiellisting am Ende der Seite
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
werden auf Zeilen 168 und 171 die Konstanten TCCR0 und TIMSK verwendet; 
für den ATmega48 sind die aber nicht definiert.

Gemäss m48def.inc gibt es aber ein TCCR0A, welches ich wohl verwenden 
kann anstelle TCCR0. Assemblieren tut's das im AVR Studio zumindest. Nur 
bei TIMSK weiss ich nicht weiter. TIMSK0 kann ich wohl nicht ohne 
weiteres verwenden, wohl weil's Memory Mapped ist.

Meine Frage ist nun: Wie übersetze ich das folgende für einen Mega48?

ldi     temp, ( 1 << CS01 ) | ( 1 << CS00 )
out     TCCR0A, temp

ldi     temp, 1 << TOIE0
out     TIMSK, temp

Besten Dank für eine Antwort!

Grüsse vom Donar

von Yalu X. (yalu) (Moderator)


Lesenswert?

Das TCCR0-Register des ATmega8 entspricht ungefähr dem TCCR0B des
ATmega48, das TIMSK dem TIMSK0. Da die beim ATmega48 neu hinzugekommenen
Features nicht genutzt werden, sollten die entprechenden Steuerbits in
diesen Registern bei ihren Defaultwerten belassen werden. Da diese alle
0 sind, brauchen im Programm also nur die Registernamen geändert zu
werden:
1
  ldi     temp, ( 1 << CS01 ) | ( 1 << CS00 )
2
  out     TCCR0B, temp
3
  
4
  ldi     temp, 1 << TOIE0
5
  out     TIMSK0, temp

Möglicherweise gibt es noch weitere Inkompatibilitäten zwischen dem
ATmega8 und dem ATmega48, die du aber am besten dadruch herausfindest,
dass du das Programm  mit den obigen Änderungen einfach mal ausprobierst
:)

Generell empfiehlt es sich bei der Portierung auf einen anderen AVR,
nicht nach ähnlichen Registernamen, sondern nach gleichen oder ähnlichen
Bitnamen zu suchen. Die Bits gibt es bei neueren Versionen einer Serie
meist ebenfalls, sind aber möglicherweise anders auf die einzelnen
Register verteilt.

von oldmax (Gast)


Lesenswert?

Hi
Vielleicht hilft hier auch mal der Vergleich der Datanblätter vom 
Atmega8 und Atmega48
Gruß oldmax

von spess53 (Gast)


Lesenswert?

Hi

>Meine Frage ist nun: Wie übersetze ich das folgende für einen Mega48?

>ldi     temp, ( 1 << CS01 ) | ( 1 << CS00 )
>out     TCCR0A, temp

>ldi     temp, 1 << TOIE0
>out     TIMSK, temp

>Besten Dank für eine Antwort!

Einfach
   out    TIMSK, temp
durch
   sts  TIMSK, temp
ersetzen.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Korrektur:

 sts  TIMSK, temp -> sts  TIMSK0, temp

MfG Spess

von Donar (Gast)


Lesenswert?

Besten Dank, hat wunderbar geklappt.

Mittlerweile hab ich allerdings auf 7 Schieberegister umgestellt für die 
7 x 7-Segment-Anzeigen :)

Herzlichen Dank nochmals!

von ... (Gast)


Lesenswert?

Donar schrieb:
> Mittlerweile hab ich allerdings auf 7 Schieberegister umgestellt für die
> 7 x 7-Segment-Anzeigen :)

Und was machst du bei einem 8x8x8 LED Würfel?

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.