Forum: Mikrocontroller und Digitale Elektronik ATMega 328Taktfrequenz falsch ?


von Hugo.G (Gast)


Lesenswert?

Hallo

Ich habe eine ATmega 328
Ein kleiner Test mit Bascom verwirrt mich etwas.

wenn ich die $crystal = 1000000 in Bascom einstellt und
mit  speed = 500
 folgende schleife laufen lasse blinkt diese im sec Takt
    Waitms Speed
    Led1 = 0
    Waitms Speed
    Led1 = 1

das sollte so ok sein
wenn ich aber die Fuse mit Basecom auslese ( in Bascom mit mk3 Prommer
)wird 8MHz angezeigt
auch eine Info im Datenblatt brachte das es mit 8MHz ausgeliefert wird
und nicht mit 1MHz
die default werte der Fuse habe ich bisher nicht geändert.

auch zeigt Bascom im Prommer keine Möglichkeit 1MHz einzustellen
sondern nur 128KHZ und 8MHz
leider habe ich als Neuling noch keine weitere Erfahrung.

habe ich im Datenblatt was falsch geglaubt zu sehen
und Bascom zeigt den falschen wert ?

danke für die Infos

Hugo G

von Timmo H. (masterfx)


Lesenswert?

Das $crystal stellt nichts am Quarz um, sondern er sagt dem Compiler nur 
welchen Clock der AVR tatsächlich hat, damit die Berechnungen für delay 
etc stimmen. Der Compiler weiß ja nicht wie der Takt des µCs ist.
Über die Fuses stellst du ein ob du den internen 128 khz oder 8MHz 
oszillator nehmen willst, oder eben einen externen mit einer beliebigen 
Frequenz.
Die 1 MHz bekommst du indem du das CKDIV8 bit enablest. Dann wird der 8 
MHz takt (oder der externe Takt mit x-MHz) durch 8 geteilt und du 
erhältst in diesem Fall deine 1 MHz.

von Stefan E. (sternst)


Lesenswert?

Hugo.G schrieb:
> auch eine Info im Datenblatt brachte das es mit 8MHz ausgeliefert wird
> und nicht mit 1MHz
> die default werte der Fuse habe ich bisher nicht geändert.

Dann schau dir im Datenblatt die Bedeutung der Fuse CKDIV8 an.

von Hugo.G (Gast)


Lesenswert?

Hallo
danke für die Infos

Ich habe mal Im Datenblatt unter CKDIV8 nachgeschaut
wenn ichs richtig verstanden habe läuft der per default immer
mit 8 MHz und CKDIV8 ist gesetzt so dass der Takt durch 8
geteilt wird.
Das im Bascom ist klar dort wird nur der takt angegeben damit es den 
richtigen Teiler ermitteln kann.
Die 8MHz werden daher auch in der Brennsoft von Bascom angezeigt.

Wenn ich jetzt das CKDIV8 bit lösche sollte er mit 8MHz laufen.
momentan ist mir noch unklar wo ich das ckdiv8 bit  löschen kann.
Beim Bascom Brennprog habe ichs unter den fuse nicht gefunden,
einfach probieren trau ich mich im Moment noch nicht da ich nur einen
Chip habe der bei falscher fuse eventuell nicht mehr erreichbar ist.

geht das mit der bascom Software vielleicht gar nicht ?
mfg
Hugo

von во'дка (Gast)


Lesenswert?

Hugo.G schrieb:
> momentan ist mir noch unklar wo ich das ckdiv8 bit  löschen kann.
Schau dir  mal das Brenn-Dialogfenster genau an.

von Eumel (Gast)


Lesenswert?

Hugo.G schrieb:
> Ich habe mal Im Datenblatt unter CKDIV8 nachgeschaut
> wenn ichs richtig verstanden habe läuft der per default immer
> mit 8 MHz und CKDIV8 ist gesetzt so dass der Takt durch 8
> geteilt wird.
> Das im Bascom ist klar dort wird nur der takt angegeben damit es den
> richtigen Teiler ermitteln kann.
> Die 8MHz werden daher auch in der Brennsoft von Bascom angezeigt.

Genau so ist es!
Habe mit der Bascom Software noch nie gearbeitet, aber es würde mich 
sehr wundern wenn man da nicht auch die Fuses umstellen kann.

von Timmo H. (masterfx)


Lesenswert?


von Hugo.G (Gast)


Lesenswert?

Hallo
Klar kann man die Fuse im Bascom Prog ändern.
ich habe ich unter KLA987
100010 int RC OSC 8MHz   ( ist der Default Wert )
folgende sind auch noch da
000010 int RC OSC 8MHz
010010 int RC OSC 8MHz
Ich habe nur noch nicht gefunden welcher der richtige ist.
Das Bit CKDIV8  ist nicht direkt dort zu finden
Bin noch auf der suche, ich will ihn ich schrotten.
mfg
Hugo

von Hugo.G (Gast)


Lesenswert?

Hallo
ich habe gerade gesehen man kann per Software auch den Clock-Prescaler
der beim starten vom atmega gesetzt wird ändern.
das wäre nicht so gefärlich.
mfg
hugo

von Eumel (Gast)


Lesenswert?

http://www.engbedded.com/fusecalc

Vielleicht hilft dir das tool weiter.

von Timmo H. (masterfx)


Lesenswert?

Fusebit C: divide clock by 8 disabled

von Hugo.G (Gast)


Lesenswert?

Hallo
das geht super
einfach folgendes am Anfang vom Prog einfügen und er leuft mit 8 MHz

!LDI R16, &b10000000
!LDI R17, &b00000000 
'''''''''''''''''' set clock prescaler to 1
!OUT CLKPR, R16
!OUT CLKPR, R17

Die Fuse wird zwar nicht verändert und das programm wird um ein par 
bytes größer man hat aber kein Risiko beim probieren.

Danke für den Tip mit der Seite

mfg
Hugo

von Hugo.G (Gast)


Lesenswert?

Hallo
Danke Timmo H.


Habs probiert geht prima
Fusebit C: divide clock by 8 disabled

Beide Lösungen gehen bei mir

Nochmal danke für die Tips
mfg
Hugo

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hugo.G schrieb:
> ich habe gerade gesehen man kann per Software auch den Clock-Prescaler
> der beim starten vom atmega gesetzt wird ändern.
> das wäre nicht so gefärlich.

Richtig, das ist unbedingt zu empfehlen!

Grade wenn man kaum Erfahrung mit dem Setzen von Fusebits hat, sollte 
man den Takt möglichst über den Clock-Prescaler einstellen. Das geht 
problemlos per Software, und man hat sogar eine viel Größere Auswahl an 
Taktfrequenzen.

Man braucht dazu lediglich ein paar Zeilen am Programmanfang, die sich 
um die Einstellung des Prescalers kümmern: das Register CLKPR muss auf 
eine bestimmte Art beschrieben werden. Beispiel für Teilen durch 8 
(Ergebnis dann 1 MHz):
1
ldi temp,(1<<CLKPCE)
2
out CLKPR,temp
3
ldi temp,0b00000011  ; CPU-Prescaler 8
4
out CLKPR,temp

Anders Beispiel für Teilen durch 256 (Ergebnis dann 31,25 kHz):
1
ldi temp,(1<<CLKPCE)
2
out CLKPR,temp
3
ldi temp,0b00001000  ; CPU-Prescaler 256
4
out CLKPR,temp

In Bascom schaut der Syntax natürlich dann ein bisschen anders aus, aber 
das kriegst du locker hin. Alles Weitere steht im Datenblatt des 
ATmega328, Kapitel 9.12.2, Seite 38.

von Norbert S. (norberts)


Lesenswert?

Hi,

Markus Weber schrieb:
> In Bascom schaut der Syntax natürlich dann ein bisschen anders aus,

ja, "gänzlich" anders, nämlich mit jeweils einem $asm davor und $end asm 
danach ;-)

Oder einfach
Edit: CLKPR = &b10000000
CLKPR = &b00000011

Gruß,
Norbert

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.