Forum: Mikrocontroller und Digitale Elektronik Vorteiler & Compare Wert errechnen lassen von 16-Bit Timer


von Michael M. (Gast)


Lesenswert?

Hey Leute,

ich bin dabei mir ein Assembler Programm zu schreiben, in welchem ich 
den Timer1 des ATmega16 benötige.
Da dieses Programm dann auf verschiedenen Frequenzen laufen soll, hab 
ich ein Problem.

Der Timer soll mir jede Sekunde einen Interrupt auslösen.
Momentan hab ich das ganze für 4MHz Programmiert.

Also Compare Wert 62500 und Vorteiler 64.

Nun gibt es irgendeine Möglichkeit den Vorteiler & Comparewert vom uP 
berechnen zu lassen und nacher automatisch einstelle lassen oder kann 
dies nur Manuell geschehen? Also Comparewert sollte eigentlich ohne 
Probleme zu machen sein aber der Vorteiler bereitet mir grosse Mühe.

Mir ist klar, dass es sehr unwarscheinlich ist dass es eine Lösung für 
den Vorteiler gibt, aber ich hoffe trotzdem, dass es irgendwie möglich 
ist.

Grüsse Michael Meyer

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

wie soll dein Programm im AVR später wissen mit welcher Frequenz es 
läuft ?

Wenn du das deinem Prog. mitteilen musst, kannst du auch gleich die 
Teilerwerte vorgeben.

An sonsten würde ich sagen du probierts die Vorteiler nacheinander 
durch, und nimmst den größten, bei welchem sich noch eine ganzzahlige 
Frequenz ergibt.

Sascha

von Michael M. (Gast)


Lesenswert?

vielen dank für deine Antwort.

Also die Frequenz wird mittels einer Konstanten eingegeben. Ja klar 
könnt ich auch gleich den Vorteiler einstellen und nur den Compare Wert 
errechnen lassen, aber ich möchte nicht jedes mal das Datenblatt 
hervorkramen und schauen welche bits ich setzen muss damit ich den und 
den Vorteiler erhalte.

Oder kann ich den Vorteiler auch als Konstante definieren und irgendwie 
so programmieren, damit gleich die benötigten bits gesetzt werden?

grüsse

von Jörg X. (Gast)


Lesenswert?

Dir reicht also ein Lösung, die beides nur beim Compilieren/assemblieren 
berechnet?
im AVR-Studio wäre das so was:
1
; die AVR-Frequenz ...
2
    .equ F_CPU 4000000
3
; 0x10000 = 65536, wenn der Timer mitvollen 16Bit überläuft
4
; geht der 64er prescaler:
5
.if F_CPU < 0x10000 * 64
6
    .equ oc1_val = F_CPU/64
7
    .equ presc_bits = (1<<CS11)|(1<<CS10)
8
; nimm den nächsten prescaler
9
.else
10
    .equ presc_bits = (1<<CS12)
11
    .equ oc1_val = F_CPU/256
12
.endif
13
;...
14
    ldi r16, high(oc1val)
15
    out OCR1_H, r16
16
    ldi r16, low(oc1val)
17
    out OCR1_L, r16
18
    ldi r16, wert_fuer_TCCR1B | presc_bits
19
    out TCCR1B
20
;...

rtfm ;) Jörg

von Sebastian (Gast)


Lesenswert?

Was mir noch nicht ganz klar ist: Willst du ein einziges Programm 
flashen und danach irgendwann entscheiden, mit welcher Frequenz der 
Controller läuft? Oder reicht es, vor dem Flaschen festzulegen, mit 
welcher Frequenz dieser spezielle Controller (Serienfertigung?) laufen 
wird.

Im zweiten Fall kann man ja einfach den Assambler rechnen lassen. Du 
definierst halt irgendeien Konstante mit der Taktfrequen und lässt dann 
über Formel den Vorteiler ausrechnen. Gibts hier im Forum schon 
hundertfach fertig zum kopieren (z.B. im Beitrag über mir).

Im Ersten Fall wirst du deinem Programm irgendwie klar machen müssen, 
mit welcher Frequenz es läuft. Ich weiß nicht, ob man die Fusebits zur 
Laufzeit auslesen kann. Dann könnteset du darüber unter Umständen den 
Takt kriegen. Läuft er auf einem externen Quarz ginge aber so weit ich 
mich erinnere selbst das nicht.
Ansonsten halt über Jumper Pins high/low ziehen. Je nach sonstiger 
Beschaltung brauchst du dafür noch nicht mal neue Pins opfern.
Die Berechnung des des Vorteilers ist dann halt wieder Formel. Diesmal 
halt in Software und nicht vom Assambler berechnet.

Sebastian

von Michael M. (Gast)


Lesenswert?

Vielen dank für eure Antworten. Ja ich möchte vor dem flashen das zeug 
berechnen lassen. Ich wusste schon, dass man sich das vom Assembler 
berechnen lassen kann, wusste aber nicht, dass er auch befehle wie if 
und else versteht.

Ist also genau das was ich suche. Nun mein Problem ist nur, wie baue ich 
eine verschachtelte if Anweisung auf? Ich habs mit .else if versucht, 
aber das scheint er nicht zu kennen.
Gibt es eine möglichkeit, mit der ich alle 5 Vorteiler des Timer 1 
austesten kann?

Grüsse

von Jörg X. (Gast)


Lesenswert?

Hast du mal unter "help->AVR Tools User Guide->Assembler" geschaut ?
Du suchst wohl ".elif" oder (".else .if", aber ich hab keine Ahnung, ob 
das geht).
Rechne außerdem mal nach, ob du wirkllich alle Prescaler brauchst (bei 
den 16-Bit-Timern sicher nicht...).

hth. Jörg
ps.: der "Assembler 2" versteht außerdem die "#if", "#elseif", "#else" 
anweisungen ( und noch ein paar c-Preprocessor ähnliche Sachen)

von Michael M. (Gast)


Lesenswert?

Vielen dank für eure Hilfe, genau den .elif befehl hab ich gesucht, 
jetzt funktionierts ohne Probleme.

Sicherheitshalber hab ich mal mein Programm für alle Vorteiler gemacht, 
Da das Projekt noch sehr am Anfang steht, möcht ich flexibel sein.

Den 1024 Prescaler brauch ich mit sicherheit nicht, da hast du Recht, 
hab ihn aber trotzdem mal eingebunden.

Vielen dank für die super Hilfe.

Grüsse Michael

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.