Hallo zusammen. Ich möchte am Atmega8 mit drei Schiebepotis die Farbe von RGB LEDs mischen. Ich weiß es gibt da schon dutzende Einträge zu aber ich werde da leider nicht schlau draus. Also ich habe das Potential der drei Potis je in eine 8 Bit Zahl umgewandelt und möchte damit nun per PWM die LEDs mischen. Per "Software PWM" habe ich eine Farbe schon faden können. Mehr leider nicht. Da ich mich mit den Verschiedenen Timern und ihren Modi noch schwer tue zunächst die Frage: Kann der Atmega8 das überhaupt? Das Prinzip ist mir bewusst. Der soll von 0 bis 255 Zählen, wenn der Wert den ich vom ADC habe überschritten ist den jeweiligen Pin ausschalten. Aber Wie? Welchen Timer? Welchen Modus? Was bedeuten die Register für die jeweiligen Timer? Ich bitte um verständliche und gedulgige Erklärung, da ich wirklich absoluter Neuling bin und mit vorhandenen Beispielen leider nicht weiter komme. Danke im Voraus Gruß Sebastian
8-bit Timer/Counter2 with PWM and Asynchronous Operation Du brauchst also Timer2. Dann brauchst du noch das Counter-Register zum Timer2, namentlich TCNT2 und das Vergleichs-Register OCR2. Immer wenn sie gleich sind schaltet der entsprechende Pin um. Vorteiler, etc. mußte halt auch setzen. Ach ja, und probier mal den Fast-PWM mode, der sollte gehen. Im Datenblatt steht gleich zu Beginn das er drei PWM-Kanäle hat. Ich bin aber nicht sicher ob ein Timer drei Kanäle sop ohne weiteres bedient. Meiner Meinung nach sind drei Kanäle für einen Anfänger schon sehr sportlich. Einer ist aber kein Problem. Bei den anderen beiden wäre im Zweifelsfall halt der Sw-Aufwand erheblich größer. Technisch geht das aber problemlos.
Sebastian Joe schrieb: > umgewandelt und möchte damit nun per PWM die LEDs mischen. Per "Software > PWM" habe ich eine Farbe schon faden können. Mehr leider nicht. Wieso 'leider'. Ist doch gut! (Es sei denn natürlich, du hast das Programm einfach abgeschrieben, und hast nicht verstanden, wie es funktioniert) > Da ich mich mit den Verschiedenen Timern und ihren Modi noch schwer tue > zunächst die Frage: Kann der Atmega8 das überhaupt? Natürlich. > Das Prinzip ist mir bewusst. Der soll von 0 bis 255 Zählen, wenn der > Wert den ich vom ADC vergiss an dieser Stelle den ADC. Sag einfach PWM-Wert. Denn: wo dieser Wert herkommt, ist ja völlig wurscht. Der Trick in der Programmierung besteht darin, die Dinge voneinander zu trennen! Auf der einen Seite brauchst du 3 PWM Stufen, weil du für jede LED deiner RGB-LED eine Möglichkeit brauchst, sie in der Helligkeit einzustellen. Und auf der anderen Seite brauchst du 3 ADC Abfragen um Werte zu erhalten. Diese beiden Dinge haben erst mal nichts miteinander zu tun. Für deine Aufgabenstellung stellt sich dann heraus, dass du die Werte von deinem einen Teilmodul dem anderen als PWM-Werte vorgibst. Das ist aber ein reiner Datentransfer von dem einen Modul zum anderen. Die PWM weiß nichts vom ADC und der ADC weiß nichts von der PWM. > Aber Wie? > Welchen Timer? Timer1 kann 2 PWM Kanäle erzeugen, Timer 2 kann 1. In Summe hast du da deine 3 benötigten PWM Kanäle. Vergiss fürs erste den ADC und bring diese 3 PWM Kanäle zum laufen. Wenns nicht anders geht, einzeln - einen nach dem anderen, > Welchen Modus? Was bedeuten die Register für die jeweiligen Timer? FAQ: Timer
Vielen Dank schon mal. Kann leider im Moment nix testen. Aber könnte das funktionieren? Gruß Sebastian
>atmega8b.c >ADCSRA=0b11000101; Kleiner Tipp nebenbei, die Bitschreibweise ADCSRA=(1<<BITa)|(1<<BITb)|(1<<Bitxyz); liest sich deutlich einfacher.
So hab mich jetzt mal mit dem Datenblatt vertraut gemacht und auch schon das gröbste geschafft. Leider gehen die beiden LEDs an Timer1 nicht ganz aus, obwohl ich die OCRs schon manuell auf 0 gesetzt hab. Bei Timer 2 ist alles Super. Hat jemand ne Idee? Vielen Dank Sebastian
@ Sebastian Joe (broty) > * atmega8b.c (1,6 KB, 2 Downloads) | Codeansicht Hällst du es für sinnvoll, immer wieder eine Initialisierung durchzuführen? Ich nicht. Die macht man EINMAL beim Programmstart. Danach beschreib man nur noch die Register, die wirklich benötigt werden. >das gröbste geschafft. Leider gehen die beiden LEDs an Timer1 nicht ganz >aus, obwohl ich die OCRs schon manuell auf 0 gesetzt hab. Ist ein bekannter Effekt bei Fast PWM, musst du Phase correct PWM machen.
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.