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
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
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
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
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
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)
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