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