Forum: Mikrocontroller und Digitale Elektronik Bits im Timer-Register durch Präprozessor / Compiler ausrechnen lassen?


von Gast (Gast)


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?

von Christopher G. (cbg)


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.

von Reinhard Kern (Gast)


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

von Gast (Gast)


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?

von 12er Dude (Gast)


Lesenswert?

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

von Reinhard Kern (Gast)


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

von Karsten W. (lsmod)


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?

von Karsten W. (lsmod)


Lesenswert?

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
von spess53 (Gast)


Lesenswert?

Hi

>In einem neuen Thread wurde nun auch endlich eine Lösung für das Problem
>gefunden. :-)

Vorsintflutliches Preload.

MfG Spess

von Karsten W. (lsmod)


Lesenswert?

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
Noch kein Account? Hier anmelden.