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
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
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
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.
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.
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
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
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.
Seltsam, Peter scheint auch nur einmal einen Beitrag zu liefern. Es sei denn, es geht um seine Codebeispiele hier im Forum.
@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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.