Forum: Mikrocontroller und Digitale Elektronik brauche Beispiel zum Frequenzgenerieren !!!


von Andreas (Gast)


Lesenswert?

Guten Tag alle zusammen,
erstmal zur sachlage.
es werden 2 AVR Boards verbunden. Am 2. Board ist ein LCD zur ausgabe
der Frequenz als Drehzahl. Das 1. Board ist der "Motor" und soll
mittels Poti eine Frequenz zwischen 500Hz und 10.000Hz generieren und
diese an das andere Board zur LCD ausgabe weiterleiten. Das Problem
liegt jetz in der Frequenzgenerierung.
Ich habe mir die anderen Beiträge zu diesen Thema durchgelesen und das
hat mir erstma geholfen das alles noch besser zu verstehen.
Das müsste alles in Assembler Programmiert werden. Vom verstehen her
seh ich da durch aber Programiertechnisch hab ich keinen richtigen
ansatz. Der Poti soll nur eine Frequenz zuwischen 500 und 10000Hz
generieren und auf einem Port ausgeben. Kann auch sein das die Lösung
ganz einfach ist und das ich nur irgendwie aufn Schlauch stehe.
beschäftige mich jetz erst 2Wochen mit Assembler und hab da noch die
richtige Peilung.
Danke schon mal für Antworten

von Peter Dannegger (Gast)


Lesenswert?

Das Poti mit einem Kondensator an den Komparatoreingang, den anderen an
die interne Band-Gap.

Dann im Komparatorinterrupt den Kondensator entladen und über das Poti
wieder aufladen lassen (Sägezahngenerator).

Damit bildet der AVR einen 555 nach.


Peter

von Andreas (Gast)


Lesenswert?

ok danke für deine Antwort, aber ich weis nicht so richtig wie du das
meinst. hab das jetz so weit hin bekommen. Hab es mit einem 8Bit Timer
realisiert und da sind die abstufungen zu grob, jetz will ich das auf
16Bit umstellen. hab mir auch hier die erklärung durchgelesen aber komm
da ziemlich mit dem TCNT1L und TCNT1H durcheinander. So wie ichs
verstanden hab muss mann die öfter laden und schreiben. kann ma jemand
nen beispiel in Assembler schreiben wie son 16Bit Timer gemacht wird.
hab bis jetz das hier zu stande gebracht und komm nicht so richtig
weiter.

            ldi    r16,   0b11000011
            out    TCCR1A, r16
            ldi    r16, 0b10000011
            out     TCCR1B, r16
            cli
            ldi    r16,0b00000000
            out    TCNT1L, r16
            out    TCNT1H, r16
            sei

            cli

            sei

            ldi    r16,   0b00000001
            out    TIMSK, r16
            sbi    DDRB,  0
            ldi    r25,   0b00100000

von TravelRec. (Gast)


Lesenswert?

Beim ATMega 8  16  32 kannst Du auch das InputCaptureRegister (ICP)
als TopValue für den Timer laden, wenn Du das dann veränderst zur
RunTime, hast Du ´ne wunderbare Feineinstellung für Deine Frequenz.
Guck mal in´s Datenbladdl.

von Marko B. (Gast)


Lesenswert?

Poti an AD-Eingang.

Im Main-Loop AD-Wert * 64 (oder eine andere Zahl, je nachdem wie klein
die Minimalfrequenz sein muß) direkt als Reload-Wert ins Timerregister
schreiben.

Im Timer-Interrupt den Ausgabepin toggeln.

von Andreas (Gast)


Lesenswert?

Danke für die Antworten,
gut zu wissen das da ICP heisst das hab ich schon mal gesucht wie das
heißt!.
@Marko:
hört sich sehr Plausiebel an, ich werd das ma versuchen. kannst du das
noch ansatzweise als Quellcode darstellen, weil ich mir nich so sicher
so sicher bin das ich das 100%ig hinbekomm. Werds aber erstma
versuchen.
Danke nochma

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

ich krieg das irgendwie überhaupt nich hin. Das ganze 8Bit und 16Bit
Timer zeug verwirrt mich total.
@Marko
so wie du es meinst leuchtet ein aber ich kanns nich umsetzen.

Ich hab ma meinem Quellcode in Anhang getan.
Wie gesagt es müsste ein 16Bit Timer werden. Ich denke ich habe noch
andere grobe Fehler drin. Bis jetz bekomm ich halt nor werte von 0-255

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Ok, Ich hab jetz erstma Ordnung gemacht und die Register bisschen
verteilt so das ich mehr durchsicht hab. Im Anhang ist jetz die
Aufgeräumte version. Fehlt nur noch der 16Bit Timer denke ich mal.
Danke schonmal für eure Hilfe.

von Jens (Gast)


Lesenswert?

Seltsam, Peter scheint auch nur einmal einen Beitrag zu liefern. Es sei
denn, es geht um seine Codebeispiele hier im Forum.

von Peter Dannegger (Gast)


Lesenswert?

@Jens

"Seltsam, Peter scheint auch nur einmal einen Beitrag zu liefern. Es
sei
denn, es geht um seine Codebeispiele hier im Forum."


???


Ich schreibe keinem vor, was er wann und wozu schreibt.

Ich denke mal, jeder macht es wie er will.

Was soll daran seltsam sein ?


Peter

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Hä versteh jetz nich worums geht!!!
hab ich was Falsch gemach hier im Forum...
Ich zwing ja keinen mir zu antworten, ich weis auch das das schon x mal
hier gefragt wurde nur kann ich mit anderen Threads dazu nicht so
richtig was anfangen.

So jetz Back to Topic.
hab jetz den gesamten Quellcode Kommentiert. Das ist jetz erstma die
Final. Frequenzen liefert er auch. Halt nur zwischen 0 und 255.
ich will aber Frequenzen zwischen 500 und 10000Hz generieren und den
Timer auf 16Bit laufen lassen.

wie ich die minimalfrequenz machen kann hat ja Marko geschrieben und
das versteh ich auch, nur weiss ich nicht wie ich das schreiben soll
als Programmcode. Und für den 16Bit Timer hab ich auch keinen Richtigen
Plan wie ich das als Quellcode schreiben kann. Im Datenblatt habe ich
aus nachgesehen aber hab da auch keinen richtigen durchblick gehabt,
kann ja auch sein ich da was übersehen hab.

Danke schonmal für alle Antworten und Sorry für die Rechtschreibung.
Die aktuelle Datei ist im Anhang

von Peter Dannegger (Gast)


Lesenswert?

Vor dem Timer1 brauchst Du keine Angst zu haben.

Du setzt ihn ohne Vorteiler in Mode 14 und PB1 als PWM-Output
(Table37).
Den Frequenzteiler dann in ICR1 und die Hälfte in OCR1A.

Der Teiler ist dann:

ICR1 = Quarz / frequenz

Also:

500HZ: ICR1 = 7373, OCR1A = 3686
...
10kHz: ICR1 = 368, OCR1A = 184


Du kannst Dir nun eine Tabelle anlegen, in der der Teilerwert für jeden
ADC-Wert (0..1023) drinsteht (.dw xxx).

Die Tabelle kannst Du z.B. in Excel berechnen lassen und dann in Dein
Programm kopieren.



Peter

von Andreas (Gast)


Lesenswert?

Bin ich jetz Dumm wenn ichs nich hin bekomm. Ich weiss wie dus meinst
aber ich kanns nich umsetzen. Ich zweifel echt an mir.Bei Mode 14 steht
erst WGM13 und CTC1, an welcher stelle setze ich die Bits. Bin grad
dabei mir das alles dort durchzulesen aber ich blick nich so richtig
durch. Ich glaub ich bin zu doof fürn 16Bit Timer... Trotzdem Danke für
eure Hilfe jede Antwort bring mich ein bisschen weiter aber bis zum
durchbruch fehlt noch ein Stück. Ich hab halt das Problem das ichs
meistens entweder ganz oder garnicht Kapier. Schonmal wieder Danke für
eure Hilfe ist ech cool hier

von Andreas (Gast)


Lesenswert?

So ich hab jetz das Handbuch durchgeackert und bisschen rumprobiert. Ich
bekomms einfach nicht hin den 16bit Timer richtig zu Initialisieren.
Find auch nirgens ein richtiges beispiel in assembler.

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.