Ich kenne nicht alle AVR, aber es scheint eine Logik bei den Prescaler-Werten zu geben - auch wenn nicht alle Teilerschritte bei allen AVRs vorhanden sind. Es wäre doch schön, wenn man einfach nur die Frequenz eines Interrupts angibt, und der Rest (Prescaler- und z.B. Compare-Register-Werte) vom PC berechnet würden. Habt ihr Profis da nicht ein paar Ideen in der grauen Schublade?
Wenn sichs während der Ausführungszeit ändert, dann eine Funktion schreiben die das berechnet als Teil eines Timer-Moduls für den µC. Wenn sichs nur beim Kompilieren ändern können soll dem entsprechenden Register den Wert eines Makros geben, das erst beim Kompilieren definiert wird (-D Flag). Da kann man sich dann ein Script / Programm schreiben, dass die Berechnung am PC übernimmt und dann beim Kompilieren richtig setzt. Geht mit Makefiles wunderbar. Da ist man dann allerdings wirklich faul.
Gast schrieb: > Es wäre doch schön, wenn man einfach nur die Frequenz eines Interrupts > angibt, und der Rest (Prescaler- und z.B. Compare-Register-Werte) vom PC > berechnet würden. Hallo, ich lasse grundsätzlich solche Sachen berechnen - das Folgende ist PIC, aber vielleicht kannst du ein paar prinzipielle Dinge draus entnehmen. Ich gebe nur den Schrittwinkel eines Schrittmotors (AStep) und die Quarzfrequenz (Fq) vor und lasse die ganzen Schritttabellen für verschiedene Drehzahlen berechnen:
1 | ; |
2 | ; set Values for Fq (quartz frequ) |
3 | ; Astep (step angle * 100) |
4 | ; |
5 | Fq equ D'12000000' |
6 | Astep equ D'1125' ;11.25 |
7 | IntRes1 equ Fq / D'205' |
8 | IntRes2 equ IntRes1 * Astep |
9 | ; GFactor = Fq / 205 * Astep / 100 |
10 | GFactor equ IntRes2 / D'100' |
11 | MinRpM equ GFactor / D'65000' |
12 | MaxRpM equ D'599' |
13 | ; |
14 | ; |
15 | ; Table macros |
16 | ; |
17 | ltab macro RpM |
18 | if RpM < MinRpM |
19 | retlw Low (GFactor / MinRpM) |
20 | else |
21 | retlw Low (GFactor / RpM) |
22 | endif |
23 | endm |
24 | ; |
25 | ; |
26 | TLStart |
27 | variable li |
28 | li = 0 |
29 | while li < D'200' ;Table 0..199 |
30 | ltab li |
31 | li += 1 |
32 | endw |
33 | while li < D'400' ;Table 200..399 |
34 | ltab li |
35 | li += 1 |
36 | endw |
37 | while li < D'600' ;Table 400..599 |
38 | ltab li |
39 | li += 1 |
40 | endw |
41 | ; |
Hier steht dann eine Tabelle für 0..599 U/min. Gruss Reinhard
Hi, interessant, aber für meinen Fall braucht es nicht zur Laufzeit zu sein. Der Knackpunkt ist wohl, die Bedeutung der Prescaler Bits herauszufinden. Gibt's da schon irgend ein Config File oder so, wo sowas drinsteht?
Wirf mal einen Blick in das AVR GCC Tutorial und schau dir dort die Baudratenberechnung im Kapitel UART an. Das dürfte in die Richtung gehen. Tschü Dude
Gast schrieb: > Hi, interessant, aber für meinen Fall braucht es nicht zur Laufzeit zu > sein. Ist es auch nicht. Es wird bloss eine Tabelle erstellt, die im Flash landet. Genauso kann man Konfigurationsbits berechnen. Die Befehle If und Grösser und Macros werden vom Präprozessor interpretiert. Gruss Reinhard
Nun haben wir das Jahr 2013 und ich stehe vor dem gleichen Problem. Ich kann irgendwie nicht glauben das es für das Timer-Problem noch keine Musterlösung gibt? Das Beispiel für die UART-Berechnung ist "Standard" - bei den Timern muss noch immer jeder das Rad für sich selbst neu erfinden?
In einem neuen Thread wurde nun auch endlich eine Lösung für das Problem gefunden. :-) Beitrag "Re: Bits im Timer-Register durch Präprozessor / Compiler ausrechnen"
:
Bearbeitet durch User
Hi >In einem neuen Thread wurde nun auch endlich eine Lösung für das Problem >gefunden. :-) Vorsintflutliches Preload. MfG Spess
Dann zeige doch Mal eine zeitgemäße Lösung auf. ;-) Wahrscheinlich kommt aber nichts ausser diesem Spruch ...
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.