Bits im Timer-Register durch Präprozessor / Compiler ausrechnen lassen?

Gast #1489369
Lesenswert?

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?
#1489385
Lesenswert?

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 #1489394
Lesenswert?

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
Gast #1489474
Lesenswert?

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?
Gast #1490084
Lesenswert?

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
#3446278
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren