Forum: Mikrocontroller und Digitale Elektronik LED blinkt langsamer je höher Taktfrequenz gewählt wird.


von Fabian (Gast)


Lesenswert?

Hallo Leute,

mir ist soeben ein seltsames Phonemen untergekommen:
Chip: Attiny85
Sprache/IDE: BASCOM

Programm, Holzklasse,:
 $regfile = "ATtiny85.dat"
 $crystal = 1000000

 Config Portb.0 = Output
 Do
   Toggle Portb.0
   Waitms 1000

 Loop
 End

Zum Problem:
Je höher ich die interne Kristallfrequenz definiere, desto langsamer 
blinkt die LED - während bis ca. 50000Hz die LED-Blinkrate immer kleiner 
wird. Ab dann diesem Grenzbereich dreht es sich wieder in Richtung des 
Langsameren.
Hat dazu jemand eine Idee? Woran könnte das liegen?

Der Chip wird ohne externen Quarz und im Werkszustand genutzt.

Nette Grüße
Fabian

von Matze (Gast)


Lesenswert?

Mit der $crystal angabe gibst du an wie schnell der tiny läuft und nicht 
wie schnell er laufen soll. Wenn du also 5000000 schreibst obwohl du den 
internen 1MHz Quartz nutzt wartet der Tiny 5 Mal so lange

von Wolfgang (Gast)


Lesenswert?

Matze schrieb:
> Mit der $crystal angabe gibst du an wie schnell der tiny läuft

Da sollte man wohl besser sagen: "... wie schnell der tiny angeblich 
läuft."
Für die tatsächlichen Taktfrequenz des Tiny ist die Angabe völlig 
bedeutungslos. Die Angabe ist eine Berechnungsgrundlage für Zeiten im 
Programm.

von Fabian (Gast)


Lesenswert?

Verstehe, vielen Dank Leute.
Bin zwar auch an der UNI diverse Male mit der hardwarenahen 
Programmierung in Kontakt gestoßen, nur habe ich mir bis dato nie 
wirklich einen Gedanken um genau jene Definition gemacht. Dabei spielt 
es keine Rolle, ob in C oder BASCOM. Man hat es einfach so hingenommen 
:)

Ich wünsche schonmal ein schönes Wochenende.

von georg (Gast)


Lesenswert?

Fabian schrieb:
> Je höher ich die interne Kristallfrequenz definiere, desto langsamer
> blinkt die LED

Wenn du die doppelte Quarzfrequenz angibst, wartet waitms auch doppelt 
soviele Taktzyklen lang - logisch. Das stimmt natürlich nur, wenn 
$crystal die tatsächliche Frequenz angibt. Das ist nur eine Konstante 
für die Zeitberechnungen und hat auf den Quarz natürlich keinen 
Einfluss.

Georg

von Einer K. (Gast)


Lesenswert?

georg schrieb:
> und hat auf den Quarz natürlich keinen Einfluss.

Quarz ist hier nicht gefragt!

Fabian schrieb:
> Der Chip wird ohne externen Quarz und im Werkszustand genutzt.

Also dürfte die Angabe von 1MHz im Programm goldrichtig sein.

Fabian schrieb:
> Man hat es einfach so hingenommen :)
Du machst mir Angst!

von georg (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Also dürfte die Angabe von 1MHz im Programm goldrichtig sein.

Ok, dann existiert das Problem mit der langsamer blinkenden LED also 
garnicht. Fall gelöst.

Georg

von Einer K. (Gast)


Lesenswert?

georg schrieb:
> Ok, dann existiert das Problem mit der langsamer blinkenden LED also
> garnicht. Fall gelöst.

Richtig!
Das ist nur ein künstliches Problem, welches auf einer 
DokuLeseVerweigerung beruht.

Wenn die Einstellung, so wie im Eingangsposting, bleibt....
Dann ist alles gut.

von Fabian (Gast)


Lesenswert?

Sofern es gestattet ist, würde ich dann doch noch eine Verständnisfrage 
loswerden.
Die BASCOM-Dokumention liefert zum Befehl "wait" leider keine 
Hintergrundinformationen, daher mein Gedankengang:
- Je höher die Taktfrequenz für das Programm mit §crystal gewählt wird, 
desto kürzer läuft das Programm durch (also in der internen 
Verarbeitung), oder anders ausgedrückt: desto schneller arbeitet der 
Chip.
- Es hat sich gezeigt, dass "waitms" (oder von mir aus auch bloß "wait") 
ausschließlich halbwegs exakte Werte für die Frequenz 1MHz liefert.
- Verdoppelt man die Eingabe auf meinetwegen 2MHz, blinkt die LED nun 
auch mit einer halb so großen Frequenz.
- Zur Frage: Ist der "wait"-Befehl nicht dazu da, auch bei von 
1Mhz-abweichenden Frequenzen stets eine zumindest halbwegs korrekte 
Ablauf-Verzögerung im Bereich der angegebenen Millisekunden zu liefern?

Gemäß dem Fall, dass ein 16Mhz-Quarz an den µC angeschlossen wird, wäre 
dann die LED-Blinkrate um das 16-fache größer (?)

Achso: @Arduino Fanboy D., danke für die kühne Unterstellung, die ist 
aber nicht wahr :)

Arduino Fanboy D. schrieb:
> Das ist nur ein künstliches Problem, welches auf einer
> DokuLeseVerweigerung beruht.

Bitte nicht noch zusätzlich auf das Thema "Wait" nicht nehmen, "da 
unsauber", oder "weil andere Methoden besser" etc. eingehen ;-)

von Thomas W. (diddl)


Lesenswert?

Fabian schrieb:
> - Zur Frage: Ist der "wait"-Befehl nicht dazu da, auch bei von
> 1Mhz-abweichenden Frequenzen stets eine zumindest halbwegs korrekte
> Ablauf-Verzögerung im Bereich der angegebenen Millisekunden zu liefern?

Ja!

Der WAIT Befehl wartet eine bestimmte Zeit, unabhängig welche Takt 
Frequenz die CPU hat.



Aber!

Der Compiler muss WISSEN, welche CPU du verwendest und wie die getaktet 
ist.

Und das teilst du im Sourcecode mit ...



Erklärung:

Jeder Befehl der CPU dauert eine bestimmte Zeit.
WAIT führt nur die richtige Anzahl an Befehle aus, um die Zeit zu 
erreichen.

Eine schneller getaktete CPU muss weniger Befehle ausführen, um dieselbe 
Wartezeit zu erreichen.

von Einer K. (Gast)


Lesenswert?

Mir scheint, du irrst.

Fabian schrieb:
> Je höher die Taktfrequenz für das Programm mit §crystal gewählt wird,
Du kannst die Taktfrequenz nicht so bestimmen.

Bei AVR wird der Takt per Fuses ( plus dem evtl vorhandene Quarz) 
festgelegt.
Im Programm, kannst du dann noch den Prescaler einstellen.

Die so generierte Frequenz, musst du in deiner $crystal Variable 
eintragen.

Fabian schrieb:
> - Es hat sich gezeigt, dass "waitms" (oder von mir aus auch bloß "wait")
> ausschließlich halbwegs exakte Werte für die Frequenz 1MHz liefert.
Das ist vollkommen richtig!
Denn wenn der µC mit internem 1MHz läuft, macht es keinen Sinn da im 
Programm was anderes einzustellen.
Nein, es wäre sogar dumm.

Fabian schrieb:
> - Zur Frage: Ist der "wait"-Befehl nicht dazu da, auch bei von
> 1Mhz-abweichenden Frequenzen stets eine zumindest halbwegs korrekte
> Ablauf-Verzögerung im Bereich der angegebenen Millisekunden zu liefern?
Richtig!
Dafür ist die Variable $crystal zuständig!
Hier teilst du dem Programm die Taktfrequenz des Prozessors mit.

Fabian schrieb:
> Gemäß dem Fall, dass ein 16Mhz-Quarz an den µC angeschlossen wird, wäre
> dann die LED-Blinkrate um das 16-fache größer (?)
Nur wenn $crystal auf 1MHz stehen bleibt.
Das wäre aber dumm.

Fabian schrieb:
> Achso: @Arduino Fanboy D., danke für die kühne Unterstellung, die ist
> aber nicht wahr :)

Natürlich ist das Wahr!

Bisher meinst du noch, man könnte mit $crystal die Taktfrequenz 
manipulieren.
Das ist ein Irrtum.
Und auf diesem Irrtum beruht dein Problem.
Irrtum weg, Problem weg.

von Peter D. (peda)


Lesenswert?

Fabian schrieb:
> - Verdoppelt man die Eingabe auf meinetwegen 2MHz, blinkt die LED nun
> auch mit einer halb so großen Frequenz.

Das muß auch so sein.
Denn Du hast ja die Frequenz nicht geändert, der MC läuft weiterhin mit 
1MHz. Allerdings hast Du den Compiler angelogen, indem Du ihm sagst, der 
MC liefe mit 2MHz. Der Compiler ist also völlig unschuldig.

Stelle mal den MC auf externen Quarz um und schließe eine Quarzfassung 
an.
Dann sage dem Compiler, der Takt beträgt 5MHz und stecke gleichzeitig 
einen 5MHz Quarz in die Fassung.
Ergebnis: 1s dauert 1s.
Nun sage dem Compiler, der Takt beträgt 8MHz und stecke gleichzeitig 
einen 8MHz Quarz in die Fassung.
Ergebnis: 1s dauert immer noch 1s.

Der Compiler kann nicht ablesen, was auf dem Quarz aufgedruckt ist, das 
mußt Du tun.
Solange Du den Compiler nicht anlügst, ist alles in Butter.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Fabian schrieb:
> Achso: @Arduino Fanboy D., danke für die kühne Unterstellung, die ist
> aber nicht wahr :)
>
> Arduino Fanboy D. schrieb:
>> Das ist nur ein künstliches Problem, welches auf einer
>> DokuLeseVerweigerung beruht.

https://avrhelp.mcselec.com/index.html?crystal_1.htm
Hier ist genau dein Problem beschrieben!

Dein µC und dein Programm verhält sich exakt  so, wie spezifiziert

von Fabian (Gast)


Lesenswert?

Eine lange und schwere Geburt!
Vielen Dank für eure Mühe. Der Groschen, der nun gefallen ist, wog 
wahrscheinlich ´ne Tonne ;-)
Hätte ich gleich in der BASCOM-Hilfe mal unter dem $Crystal nachgeschaut 
und nicht in wait etc....

[SOLVED]

Dann nun nochmal: ein schönes Wochenende euch :)

von uwe (Gast)


Lesenswert?


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.