Guten Nabend,
eine kleine Frage.. Bin noch relativ neu in dem Thema "Timer".
Wenn ich jetzt meinen Timer1_CompA so konfiguriere, dass er jede
Millisekunde in die ISR läuft..
Wie folgt konfiguriert..:
Seltsames Bitgefummel. Was da effektiv bei heraus kommt ist:
> TCCR1A = 0> TCCR1B = 11 (WGM12, CS11, CS10)> OCR1A = 124
Das ist der CTC Modus mit Prescaler 64.
> messe das ich eine Amplitude von ~520us habe..> Was verstehe ich falsch?
Ja, Amplituden haben eine Höhe, nicht Zeit. Die meinst wohl eine
Pulsbreite.
Bei 16 MHz dauert ein Timer-Takt 1/16000000*64 = 4µs
124 ∙ 4µs = 496µs
Das passt also ungefähr. Oder hast du eine andere Taktfrequenz als
Systemtakt?
> Bei 16 MHz dauert ein Timer-Takt 1/16000000*64 = 4µs> 124 ∙ 4µs = 496µs> Das passt also ungefähr.
Zum einen sind es 125, zum anderen kämen 16 MHz aus einem Quarz, wären
also hinreichend genau.
S. Landolt schrieb:> Zum einen sind es 125
Stimmt, als exakt 500µs. Wie dem auch sei, es passt zum Messergebnis.
Wenn Impulse im 1ms Abstand gewünscht sind, muss man OCR1A auf 255
setzen.
S. Landolt schrieb:> Zum einen sind es 125, zum anderen kämen 16 MHz aus einem Quarz, wären> also hinreichend genau.
Ja - interpretierst Du in saudummes Geschwätz z. B. auf der Wies'n auch
immer etwas hinein?
Hugo H. schrieb:> Ja - interpretierst Du in saudummes Geschwätz z. B. auf der Wies'n auch> immer etwas hinein?
Verstehe ich nicht, er hat doch absolut Recht!
Stefan F. schrieb:> Wie dem auch sei, es passt zum Messergebnis.> Wenn Impulse im 1ms Abstand gewünscht sind, muss man OCR1A auf 255> setzen.
Ich bin schon wieder halb am Schlafen. 2∙125-1 ist natürlich 249, nicht
255.
Hugo H. schrieb:> Wo siehst Du das?
psTab kann nur das sein
> { .uiCnt = 124 , .uiCSxx = _PRESCALER_64 , .uiWGMxx = _TMR1_MODE4 }
Ergibt sich aus dem Zusammenhang.
Stefan F. schrieb:> Ergibt sich aus dem Zusammenhang.
Nö - ist nicht bekannt (im Beispiel). Compiliere das mal und berichte
über das Ergebnis.
Hugo H. schrieb:> Arduino Fanboy D. schrieb:>> Was ist das für eine Sprache?>> Die des Unwissenden.
S. Landolt schrieb:> Wie sieht die ISR aus?
Da ist wirklich nur nen Pin drin, der getoggelt wird.
Mehr nicht. Die main() ist auch leer..
Sehe ich das richtig das ich eigentlich eine "Pulsbreite" von einer
Millisekunde haben müsste mit den Werten?
TimerNoob schrieb:> Die main() ist auch leer..
Der Timer wird also gar nicht initialisiert.
Ehy, sach mal...
Gibts irgend einen Grund, warum du nicht ein kompilierbares/lauffähiges
Beispiel liefern willst?
Wir wollten etwas compilierbares haben. Keine Lust mehr, weiter zu
raten.
Wie hast du denn verifiziert, ob dein Mikrocontroller wirklich auf 8MHz
läuft?
Stefan F. schrieb:> Wir wollten etwas compilierbares haben. Keine Lust mehr, weiter zu> raten.>> Wie hast du denn verifiziert, ob dein Mikrocontroller wirklich auf 8MHz> läuft?
Was bringt Dir ausführbarer Code wenn Du ihn nicht testen kannst? Ich
habe genau diese Routine genutzt um den Timer zu initalisieren. Mehr
steht nicht drin.
Den Takt habe ich in den Fuses nachgeschaut. Dort ist auch kein DIV8
etc. aktiviert.
TimerNoob schrieb:> Also hier ist mal die Initalisierung die ich aufrufe> extern inline enum eTimerError Timer1CompAInit( const sTimer16Config_t> *psTab , void (*pFncCallback)(void) )
[...]
> TCCR1A = psTab->uiWGMxx;> TCCR1B = psTab->uiWGMxx;
Wer auch immer das verbrochen hat, es kann nur kompletter Bullshit
sein...
c-hater schrieb:> TimerNoob schrieb:>>> Also hier ist mal die Initalisierung die ich aufrufe>>> extern inline enum eTimerError Timer1CompAInit( const sTimer16Config_t>> *psTab , void (*pFncCallback)(void) )> [...]>> TCCR1A = psTab->uiWGMxx;>> TCCR1B = psTab->uiWGMxx;>> Wer auch immer das verbrochen hat, es kann nur kompletter Bullshit> sein...
Achja.. Warum?
TimerNoob, deine Codefragmente sind immer noch unvollständig und
widersprechen sich.
c-hater schrieb:>> TCCR1A = psTab->uiWGMxx;>> TCCR1B = psTab->uiWGMxx;> Wer auch immer das verbrochen hat, es kann nur kompletter Bullshit> sein...
Das kommt noch dazu.
TimerNoob schrieb:> Achja.. Warum?
Weil man nicht in zwei unterschiedliche Konfigurationsregister den
gleichen Wert schreiben will. Das kann so nicht beabsichtigt gewesen
sein.
Weiter oben wurde psTab->uiWGMxx wenigstens noch mit unterschiedlichen
Bitmasken gefiltert, was zwar funktioniert, aber auch sehr verwirrend
ist. Merkt man auch daran, dass du deinen eigenen Code nicht verstehst.
Das ist bei diesem Code kein Wunder.
Lege die Karten (den Quelltext) offen auf den Tisch oder höre auf,
unsere Hilfsbereitschaft zu missbrauchen.
Ich bin den Hinweisen bzw. den Fragen zum Thema Quarz nochmal nach
gegangen..
In den Fuses steht er auf 8MHz, wenn ich ihn auf den internen RC Oszi.
schalte, läuft er deutlich langsamer und das mit den Timing von einer
Millisekunde passt.. Das heißt im Endeffekt er steht bei den Fuses auf
8MHz und wird übertaktet.. (ist ein China Arduino!)..
Auf dem Quarz kann man natürlich keine Frequenz ablesen.
TimerNoob schrieb:> und wird übertaktet
Nein.
Übertakten bedeuted betreiben ausserhalb (oberhalb) der
spezifizierten Frequenzgrenze (die liegt beim 328P bei
16 MHz bzw 20 MHz).
Das bezweifle ich in deinem Fall sehr stark.
TimerNoob schrieb:> Anbei mal ein Foto.
Wo ist jetzt dein Problem?
Du hast 500µs Intervalle programmiert und sie auch bekommen. Das zeigt
dein Oszilloskop an. immer abwechselnd 500µs LOW und 500µs HIGH.
TimerNoob schrieb:> In den Fuses steht er auf 8MHz, wenn ich ihn auf den internen RC Oszi.> schalte, läuft er deutlich langsamer
Moment mal. Der interne Oszillator hat 8 MHz. Mit der CLKDIV8 Fuse kann
er der Takt (egal ob intern oder extern) durch 8 geteilt werden.
Wenn der Mikrocontroller mit dem internen Oszillator nur halb so schnell
läuft, wie mit dem externen, dann hat der externe Oszillator
logischerweise die doppelte Taktfrequenz, also 16 MHz.
16 MHz ist bei Arduino Modulen die übliche Bestückung. Meistens ist das
bei den billigen Modulen übrigens nur ein Keramik Resonator - weniger
genau als ein Quarz.
Und das passt zu deinem zuerst genannten Code und deinem Messergebnis.
Ergo: Da ist kein Problem. Wenn du andere Intervalle wolltest, musst du
wie gesagt den Wert im OCR1A Register ändern.
TimerNoob schrieb:> Ich bin den Hinweisen bzw. den Fragen zum Thema Quarz nochmal nach> gegangen..>> In den Fuses steht er auf 8MHz, wenn ich ihn auf den internen RC Oszi.> schalte, läuft er deutlich langsamer und das mit den Timing von einer> Millisekunde passt.. Das heißt im Endeffekt er steht bei den Fuses auf> 8MHz und wird übertaktet.. (ist ein China Arduino!)..> Auf dem Quarz kann man natürlich keine Frequenz ablesen.
Die Fuses kann man nicht auf 8MHz extern einstellen.
5V Arduinos sind mit 16MHz Resonatoren ausgestattet.
Die billigen China Modelle auch mal mit Quarz.
Eine korrekte und vor allem vollständige Antwort würde umfangreich,
sicher nicht viel kürzer als das, was im Datenblatt steht; also dort
nachlesen.
Von mir nur soviel: man wählt den Oszillator aus, diverse interne
RC-Oszillatoren sowie Oszillatoren, die mit extern anzuschließendem
Quarz (oder Resonator) betrieben werden; bei letzteren gilt es noch,
hinreichend gut an die Frequenz anzupassen.
Beo Bachta schrieb:> Übertakten bedeuted betreiben ausserhalb (oberhalb) der> spezifizierten Frequenzgrenze (die liegt beim 328P bei> 16 MHz bzw 20 MHz).
Die "Frequenzgrenze" ist Spannungsabhängig! Im DB befindet sich ein
schönes Diagramm, das den sicheren Arbeitsbereich veranschaulicht. Die
Maximal vom Hersteller spezifizierte Frequenz beträgt 20 Mhz. Die 16Mhz
auf zB. sämtlichen Arduino-boards kann damit erklärt werden, dass viele
ältere AVRs nur höchstens 16Mhz unterstützen.
TimerNoob schrieb:> CLK Fuses [...] Was bewirken diese Einstellungen?
Datenblatt!
Vielleicht hilft dir auch eine Gui zum Fuses setzen, wie der im Atmel
Studio weiter?
TimerNoob schrieb:> Wozu stellt man genau die CLK Fuses ein? Wenn man 8MHz eingestellt hat> ihn dann aber auch mit 16MHz betreiben kann?
Nochmal: Man kann nicht 8MHz einstellen.
Du kannst da drei Sachen einstellen:
1) Die Quelle, das ist entweder der interne 128 kHz Oszillator, oder der
interne 8 MHz Oszillator oder eine externe Quelle.
2) Die Startup Time (SUT) gibt dem Oszillator Zeit, sich einzuschwingen.
3) Mit CLKDIV8 kann die Taktfrequenz (egal aus welcher Quelle) durch 8
geteilt werden.
Guck Dir das mal im Engbedded Fuse Calculator an (Anhang).