PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Atmega8 genau takten



NXTman
18.12.2012, 22:53
Hallo,

Am Anfang eines jeden Programmes taktet man ja den Chip mit z.B.:

$crystal = 8000000

nun ist meine Frage, wie kann ich den mega8 genau so takten, dass er im Mikrosekundentakt läuft.
Ich habe nämlich eine LED-Matrix gebaut und mir dazu errechnet, dass ich jede LED alle 652 mikrosekunden geschaltet werden muss, damit das ganze Bild 25-mal in der Sekunde erneuert werden kann.
Die Rechnung hat sich so ergeben:
(Anmerkung: Meine Matrix ist 8x8 groß)

1 Sekunde entspricht 1000000 Mikrosekunden(µs)

(1000000/25)/64 = 625


Ich bin mir auch nicht ganz sicher, ob die Rechnung aufgeht...

Ist der/die/das crystal so richtig definiert/initialisiert?

Gruß nxtman

Sauerbruch
19.12.2012, 00:10
Am Anfang eines jeden Programmes taktet man ja den Chip mit z.B.:

$crystal = 8000000


Das ist ein weit verbreiteter Irrtum!
Die $Crystal-Direktive hat keinen Einfluss auf die Taktfrequenz des Controllers! Sie ist "nur" dazu da um Bascom mitzuteilen, mit welcher Taktfrequenz der Controller läuft. Das ist für alle zeitbezogenen Befehle sehr wichtig (wie z.B. waitms 100), denn Bascom muss ja ausrechnen, wieviele Zyklen z.B. für 100 Millisekunden vergehen müssen. Stimmt die Angabe bei $Crsytal mit der tatsächlichen Taktfrequenz nicht überein, kommt bei zeitbezogenen Befehlen natürlich nur Unsinn raus.

Die Taktfrequenz stellst Du in den Fusebits ein, und da gibt es für den Mega8 die Möglichkeit, ihn mit dem eingebauten RC-Oszillator mit einer Taktfrequenz von 1MHz zu betreiben. Dies ist sogar der Auslieferungszustand, allerdings ist der RC-Oszillator naturgemäß nicht besonders genau. Aber wenn´s auf ein paar Prozent Abweichung nicht ankommt, leistet er gute Dienste. Den RC-Oszillator kann man außerdem auch auf 2, 4 und 8 MHz einstellen

Wenn´s eine "besondere" Taktfrequenz sei soll, muss man den Controller entweder mit einem externen Quarz betreiben, oder mit einem externen Taktsignal (z.B. aus einem Quarzoszillator) versorgen. Infos dazu gibt´s im Datenblatt!

NXTman
19.12.2012, 22:38
ok, gut zu wissen ^^
Jetzt weis ich auch, warum bei den Soundausgaben mit nem Piepser immer nur Mist raus kam...

Danke für die Antwort, werds Morgen mal Testen

Sauerbruch
19.12.2012, 22:57
Du musst nur aufpassen, dass auch wirklich ein externer Quarz bzw. ein externes Taktsignal vorhanden ist, wenn Du diese Option mit den Fusebits wählst, denn sonst hat der Controller keinen Takt mehr. Und ohne Takt kannst Du auch nichts mehr an den Fusebits ändern - das wäre also quasi eine Sackgasse. Also wähle nur Taktquellen, die auch real existieren :-)

oberallgeier
20.12.2012, 08:12
... ohne Takt kannst Du auch nichts mehr an den Fusebits ändern - ... quasi eine Sackgasse ...Aus der Sackgasse gibts einen einfachen Weg (klick mal) (https://www.roboternetz.de/community/threads/45827-Fuse-irrtümlich-auf-extern-Takt-Hier-die-einfachste-Lösung!?highlight=fuseretter) der genau auf Einsteiger zugeschnitten ist.


... alle 652 mikrosekunden geschaltet werden muss ... nicht ganz sicher, ob die Rechnung aufgeht ...Mit dem Controller im Lieferzustand 1 MHz Takt (8 MHz interner Takt, mit internen Teiler) hast Du also 625 Maschinenzyklen für diese Arbeit. Da könnte es sein, dass sich der Controller dabei etwas langweilt . . .

NXTman
20.12.2012, 19:28
jetzt besteht das Problem, dass ich kein externes Quarz angeschlossen habe, was kann ich machen?

Searcher
21.12.2012, 10:37
jetzt besteht das Problem, dass ich kein externes Quarz angeschlossen habe, was kann ich machen?

Hast du denn schon irgendwelche Fuses verändert? und wenn ja, auf was hast du eingestellt?

Gruß
Searcher

NXTman
22.12.2012, 14:02
Ich habe die fuses auf 1MHz eingestellt. Geht schon

Thomas E.
22.12.2012, 16:01
Ich habe die fuses auf 1MHz eingestellt. Geht schon
Also internal RC-Clock 1Mhz? Also funktioniert es? Wolltest du nicht zu Threadanfang 8Mhz haben?:confused:

NXTman
24.12.2012, 22:45
ja, "geht schon" im Sinne von "Ich weis wie ichs einstellen kann"