www.mikrocontroller.net

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


Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir reicht also ein Lösung, die beides nur beim Compilieren/assemblieren 
berechnet?
im AVR-Studio wäre das so was:
; die AVR-Frequenz ...
    .equ F_CPU 4000000
; 0x10000 = 65536, wenn der Timer mitvollen 16Bit überläuft
; geht der 64er prescaler:
.if F_CPU < 0x10000 * 64
    .equ oc1_val = F_CPU/64
    .equ presc_bits = (1<<CS11)|(1<<CS10)
; nimm den nächsten prescaler
.else
    .equ presc_bits = (1<<CS12)
    .equ oc1_val = F_CPU/256
.endif
;...
    ldi r16, high(oc1val)
    out OCR1_H, r16
    ldi r16, low(oc1val)
    out OCR1_L, r16
    ldi r16, wert_fuer_TCCR1B | presc_bits
    out TCCR1B
;...

rtfm ;) Jörg

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.