Hi,
ich hab grade mit programmieren angefangen (1 monat ungef.), vorzugsweise mit assembler.
kleinere Geschichten sind kein problem (blinklichter, taster abfragen...).
Jetzt würd' ich gern was mit PWM machen, der mega88 soll ja 6 PWM kanäle haben.
wie kann ich die den beeinflussen,(anschalten, an / aus abstände einstellen, und so zeug...)
könnte mir da jemand Helfen? (datenblatt ist asig kompliziert und unverständlich)
Gruss Ro
PWM mit ATmega88
Moderator: T.Hoffmann
Vielen dank erst mal,
ich habs natürlich immer noch nicht ganz gepeilt, die ganzen geschichten im datenblatt +/- verstanden (siehe bild)
aber wie steuer ich jetzt einzelne Ports mit PWM an. im bild hab ich jetzt erst mal die ganzen einstellungen getroffen,
aber wie setze ich das ganze ein
Am besten wär so ne art beispiel, wie man beliebige ports (auf einmal) ansteuern kann, mit einstellbarer puls weite...
Gruss Ro
PS: vielen dank für die schnellen antworten.
ich habs natürlich immer noch nicht ganz gepeilt, die ganzen geschichten im datenblatt +/- verstanden (siehe bild)
aber wie steuer ich jetzt einzelne Ports mit PWM an. im bild hab ich jetzt erst mal die ganzen einstellungen getroffen,
aber wie setze ich das ganze ein
Am besten wär so ne art beispiel, wie man beliebige ports (auf einmal) ansteuern kann, mit einstellbarer puls weite...
Gruss Ro
PS: vielen dank für die schnellen antworten.
- CRI 93+ / Ra 93+
- Auserwählter
- Beiträge: 2801
- Registriert: So, 19.10.08, 23:56
- Wohnort: Hannover
Ich empfehle Dir, auf C umzusteigen. Das ist zwar erstmal etwas weniger durchschaubar als Assemnbler, aber dafür muss man auch nicht jeden noch so kleinen Pups selbst machen, das macht es doch deutlich komfortabler --- und so ein Atmel AVR ist für fast alles locker schnell genug, Assembler braucht man heutztage nur noch in ganz wenigen Spezialfällen und dann lässt es sich auch in C-Code integrieren.
AVRStudio (kostenlos von Atmel runterladbar, liegt außerdem jedem AVR ISP Stk 500 mk II bei) + WinAVR (kostenlos, Open soruce, wird automatisch von AVRStudio erkannt und macht AVRStudio damit C-fähig) oder CodeVisionAVR (bis 4 kB Programmcode kostenlos nutzbar) könnte ich empfehlen. Atmel bevorzugt den IAR C-Compiler, der kostet jedoch ca. 3000€.
Wenn man die Hardware-PWM-Ports nutzt (das sind beim Mega88 nur 3, alle wo OCR oder sogar PWM mit dransteht), dann muss man letzlich nur noch ein oder 2 Byte schreiben, um das PWM-Tastverhältnis zu ändern und das ganze läuft mit exakt 0 CPU-Last, man hat also 100% Rechenleistung für's Programm über. Damit erreicht man auch problemlos sehr hohe PWM-Frequenzen und Flackern kann auch nicht auftreten.
Hierzu ist CodeVisionAVR auch in der kostenlosen Variante ganz gut, denn dort kann man mit dem CodeWizard bequem den Code erzeugen lassen, der die Register passend initialisiert. (Allerdings macht einen das auch etwas doof, weil man nicht mehr sieht, was da warum wie initialisiert wird, anders als wenn man das aus dem Datenblatt abliest)
AVRStudio (kostenlos von Atmel runterladbar, liegt außerdem jedem AVR ISP Stk 500 mk II bei) + WinAVR (kostenlos, Open soruce, wird automatisch von AVRStudio erkannt und macht AVRStudio damit C-fähig) oder CodeVisionAVR (bis 4 kB Programmcode kostenlos nutzbar) könnte ich empfehlen. Atmel bevorzugt den IAR C-Compiler, der kostet jedoch ca. 3000€.
Wenn man die Hardware-PWM-Ports nutzt (das sind beim Mega88 nur 3, alle wo OCR oder sogar PWM mit dransteht), dann muss man letzlich nur noch ein oder 2 Byte schreiben, um das PWM-Tastverhältnis zu ändern und das ganze läuft mit exakt 0 CPU-Last, man hat also 100% Rechenleistung für's Programm über. Damit erreicht man auch problemlos sehr hohe PWM-Frequenzen und Flackern kann auch nicht auftreten.
Hierzu ist CodeVisionAVR auch in der kostenlosen Variante ganz gut, denn dort kann man mit dem CodeWizard bequem den Code erzeugen lassen, der die Register passend initialisiert. (Allerdings macht einen das auch etwas doof, weil man nicht mehr sieht, was da warum wie initialisiert wird, anders als wenn man das aus dem Datenblatt abliest)
@ CRI 93+ / Ra 93+:
Gut, ich denk mal ich nehm dann das avr studio + WinAVR, mit C hab ich nur ein mal was gemacht, das war Asuro.
was die Hardware-PWM-Ports betrifft, das sind aber nur 3 einzelne pins oder?
falls ja dann ist das für mich ungeeignet.
mal schaun wie ich mit C zurecht komme
Gruss Ro
Gut, ich denk mal ich nehm dann das avr studio + WinAVR, mit C hab ich nur ein mal was gemacht, das war Asuro.
was die Hardware-PWM-Ports betrifft, das sind aber nur 3 einzelne pins oder?
falls ja dann ist das für mich ungeeignet.
mal schaun wie ich mit C zurecht komme
Gruss Ro
- CRI 93+ / Ra 93+
- Auserwählter
- Beiträge: 2801
- Registriert: So, 19.10.08, 23:56
- Wohnort: Hannover
Die Hardware-PWM-Kanäle sind fest 6 Pins zugeordnet, jedoch benötigen die einen Timer/Counter zum funktionieren und davon gibt's nur 3, d.h. mehr als 3 Hardware-PWM-Kanäle kann man nicht wirklich nutzen und dann sind auch schon alle 3 Timer/Counter "aufgebraucht".
Wenn Du mehr als 3 PWM-Kanäle benötigst, dann wird ein Timer-Interrupt das beste sein, damit kann man aber schon nur noch ein Zehntel bis hundertstel oder weniger PWM-Frequenz erreichen wie mit Hardware, aber immer noch im Bereich 500 bis 5000 Hz bleiben, im Interrupt sollte der Code so kurz und effizient wie möglich sein, d.h. z.B. keine Berechnungen dort durchführen, die dann hunderte mal pro Sekunde ablaufen, obwohl sie genausogut außerhalb des Interrupts gemacht werden können.
(Beispiel: die Einschaltdauer eines Kanals ändert sich, weil mehrere LEDs über den gleichen Vorwiderstand angeschlossen sind (z.B. gemeinsamer Vorwiderstand für alle Segmente einer 7-Segment-Anzeige), so dass man die Einschaltdauer mit jeder zusätzlichen LED minimal verlängern muss: dann berechnet man die immer nur dann neu, wenn sich die Anzahl eingeschalteter LEDs bzw. der anzuzeigende Wert ändert und nicht unnötigerweise in jedem PWM-Zyklus, wie sogar mancher Doktor das macht... hier ging's allerdings um Display-Multiplexing, aber mit Software-PWM-Dimmung ist das relativ artverwandt)
Wenn Du mehr als 3 PWM-Kanäle benötigst, dann wird ein Timer-Interrupt das beste sein, damit kann man aber schon nur noch ein Zehntel bis hundertstel oder weniger PWM-Frequenz erreichen wie mit Hardware, aber immer noch im Bereich 500 bis 5000 Hz bleiben, im Interrupt sollte der Code so kurz und effizient wie möglich sein, d.h. z.B. keine Berechnungen dort durchführen, die dann hunderte mal pro Sekunde ablaufen, obwohl sie genausogut außerhalb des Interrupts gemacht werden können.
(Beispiel: die Einschaltdauer eines Kanals ändert sich, weil mehrere LEDs über den gleichen Vorwiderstand angeschlossen sind (z.B. gemeinsamer Vorwiderstand für alle Segmente einer 7-Segment-Anzeige), so dass man die Einschaltdauer mit jeder zusätzlichen LED minimal verlängern muss: dann berechnet man die immer nur dann neu, wenn sich die Anzahl eingeschalteter LEDs bzw. der anzuzeigende Wert ändert und nicht unnötigerweise in jedem PWM-Zyklus, wie sogar mancher Doktor das macht... hier ging's allerdings um Display-Multiplexing, aber mit Software-PWM-Dimmung ist das relativ artverwandt)
So würde ich das nicht sagen. Die 6 Hardware-PWM-Kanäle lassen sich bei Mega88 (o.ä.) schon nutzen. Ok, je zwei Kanäle hängen am gleichen Timer, aber meist verwendet man ja für alle Kanäle die gleiche PWM-Frequenz so dass das auch keine Rolle spielt. Und pro Timer gibt es zwei unabhängige Compare-Register um die Pulsbreite vorzugeben. Den 6 PWM Kanälen kann man also durchaus auch 6 verschiedene Werte zuweisen.mehr als 3 Hardware-PWM-Kanäle kann man nicht wirklich nutzen
Ich würde aber auch nicht versuchen, dass in ASM zu schreiben. Die reine PWM Ausgabe ginge ja noch (ist ja fast sprachunabhängig weil ja nur Werte in Register geschrieben werden), aber Farbübergänge o.ä. für 6 unabhängige PWM Kanäle in ASM Schleifen zu programmieren... Nein danke