PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM beim ATmega8



rogerberglen
13.03.2009, 22:17
Hallo,
bin gerade dabei mich mal mit PWM zu versuchen. Als kleines Testprogramm habe ich mal folgendes zusammengeschrieben.


$regfile = "m8def.dat" 'ATmega8 Prozessor
$crystal = 8000000 '16MHz Intern

$sim 'Nach Test entfernen

Config Portb.1 = Output
Config Portb.2 = Output

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , _
Compare B Pwm = Clear Up , Prescale = 1





Do


Pwm1a = 205
Pwm1b = 51

Loop

End


Ist das richtig, wenn ich nur 1 Ausgang als PWM benötige, daß ich dann den zweiten als Output definierten Pin weglassen kann und in der Timer Config Anweisung auch das Compare B PWM weglassen kann?

Klingon77
13.03.2009, 23:29
hi,

ich arbeite mich momentan zwar auch erst in PWM ein; Deine Aussage sollte aber richtig sein.

Bei Interesse:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=46478&highlight=


liebe Grüße,

Klingon77

Sauerbruch
13.03.2009, 23:34
Ist das richtig, wenn ich nur 1 Ausgang als PWM benötige, daß ich dann den zweiten als Output definierten Pin weglassen kann und in der Timer Config Anweisung auch das Compare B PWM weglassen kann?

Absolut richtig.

Allerdings ist PWM unter Bascom so ein Thema für sich (zumindest meiner Erfahrung nach). So richtig im Griff hatte ich es erst, als ich dem Controller auf Register-Ebene gesagt habe, was er tun soll. Das erfordert zwar ein wenig Eindenken, aber es macht sich bezahlt. So sehr ich Bascom schätze - beim Thema PWM kommt es m.E. schnell an seine Grenzen (und der Anwender irgendwann auch...).

guenter1604
14.03.2009, 11:36
Hallo,

selbst wenn man ein vernünftiges PWM zusammenbekommt, ist der Prozessor schwer beschäftigt und es können fast keine weiteren timingkritischen Aufgaben erfüllt werden. Das hat aber nur sekundär mit Bascom was zu tun. Sehr gerne setze ich für LED-PWM den PCA9635 ein. Der hat 16 einzelne PWM Ausgange mit 96 kHz! und zusätzlich eine Summen PWM. Ein Spezialist eben. Wer schon mal mit I²C gearbeitet hat, wird die Ansteuerung schnell beisammen haben.

Günter

Klingon77
14.03.2009, 12:36
hi guenter1604,

das verstehe ich nun nicht ganz.

Ich dachte die Timer laufen bei einer "Hardware-PWM" autonom und ohne Rechenzeit vom Prozessor "abzuzwacken"?

liebe Grüße,

Klingon77

python_rocks
14.03.2009, 13:33
Ich dachte die Timer laufen bei einer "Hardware-PWM" autonom und ohne Rechenzeit vom Prozessor "abzuzwacken"?
Hallo Klingon77!

Das ist auch so. Lass dich nicht verwirren. ;-)

mfg
Gerold
:-)

Klingon77
14.03.2009, 13:48
hi,

mal Dank für die rasche Aufklärung \:D/

Momentan bin ich, ob der vielen Info´s, welche durch meinen AVR-Einstieg auf mich einprasseln, mitunter "leicht confused" und nicht immer "trittfest auf zwei Beinen" :oops: :mrgreen:


liebe Grüße,

Klingon77

guenter1604
14.03.2009, 14:33
Hallo,

sorry für das Durcheinanderbringen. Ich habe Sauerbruchs Antwort als Software-PWM interprätiert (mein Fehler).
Wenn er jedoch Hardware-PWM gemeint hat, ist doch Bascom kein Performance-Problem? Der Hardware-PWM wird doch durch Bascom exakt gleich konfiguriert wie wenn ich die Register direkt setze ?

jetzt bin ich auch durcheinander ;-)

guenter1604
14.03.2009, 14:36
so hab ich ne 10 Kanal Software-PWM zusammengebastelt:



Ontimer2:

Tick = Tick + 1
Timer2 = 200
If Tick >= Range Then Tick = 0
If Tick < V_hell(1) Then
K1 = Channels.1
Else
K1 = 0
End If
If Tick < V_hell(2) Then
K2 = Channels.2
Else
K2 = 0
End If
If Tick < V_hell(3) Then
K3 = Channels.3
Else
K3 = 0
End If
If Tick < V_hell(4) Then
K4 = Channels.4
Else
K4 = 0
End If
If Tick < V_hell(5) Then
K5 = Channels.5
Else
K5 = 0
End If
If Tick < V_hell(6) Then
K6 = Channels.6
Else
K6 = 0
End If
If Tick < V_hell(7) Then
K7 = Channels.7
Else
K7 = 0
End If
If Tick < V_hell(8) Then
K8 = Channels.8
Else
K8 = 0
End If
If Tick < V_hell(9) Then
K9 = Channels.9
Else
K9 = 0
End If
If Tick < V_hell(10) Then
K10 = Channels.10
Else
K10 = 0
End If
Return

python_rocks
14.03.2009, 15:07
Der Hardware-PWM wird doch durch Bascom exakt gleich konfiguriert wie wenn ich die Register direkt setze ? jetzt bin ich auch durcheinander ;-)
Hallo guenter1604!

In Bascom kann man die Einstellungen für PWM direkt in die Register schreiben. Wenn man stattdessen den Highlevel-Befehl ``CONFIG TIMERx = PWM`` verwendet, um damit Hardware-PWM einzurichten, dann stellt Bascom auf "Phase Correct PWM Mode". Den PWM-Modus kann man mit dem Highlevel-Befehl nicht beeinflussen.

Genaue Informationen über die möglichen PWM-Modi findet man z.B. im Datenblatt des ATmega8 im Kapitel "16-bit Timer/Counter1 -- Modes of Operation".

mfg
Gerold
:-)

Sauerbruch
15.03.2009, 11:01
Den PWM-Modus kann man mit dem Highlevel-Befehl nicht beeinflussen.


Exakt - "CTC" und "Fast-PWM" kann man über Bascom nicht einstellen. Ebenso wie eine Bitbreite oberhalb von 10 (wenn man mit ´nem 16Bit-Timer arbeitet).

Für "normales" phasenkorrektes 8-10Bit-PWM tut´s Bascom natürlich sehr gut!

python_rocks
15.03.2009, 11:19
"CTC" und "Fast-PWM" kann man über Bascom nicht einstellen. Ebenso wie eine Bitbreite oberhalb von 10 (wenn man mit ´nem 16Bit-Timer arbeitet).

Für "normales" phasenkorrektes 8-10Bit-PWM tut´s Bascom natürlich sehr gut!
Hallo Sauerbruch!

Solche Aussagen sind schuld daran, dass Bascom von manchen Leuten belächelt wird.
Bascom tut es auch mit allen anderen PWM-Modi! Und das sehr gut. Man kann in Bascom, genau so wie mit C, auf die Register zugreifen und jeden beliebigen PWM-Modus einstellen.
Man sollte nur wissen, dass der Highlevel-Befehl den "Phase Correct PWM Mode" einstellt, damit man weiß, mit was man es zu tun hat.

mfg
Gerold
:-)

guenter1604
15.03.2009, 12:09
Hallo Gerold,

genau das fehlt in der Bascom-Reference. Ideal wäre eine Tabelle die auflistet welcher Highlevelbefehl welches Register setzt.

Günter

python_rocks
15.03.2009, 13:30
genau das fehlt in der Bascom-Reference. Ideal wäre eine Tabelle die auflistet welcher Highlevelbefehl welches Register setzt.
Hallo Günter!

Ja, die Hilfe könnte man etwas ausbauen. Es bringt einem aber auch sehr viel, wenn man zusätzlich zur Hilfe, die Bücher von Roland Walter (http://rowalt.de/mc/avr/avrbuch/index.htm) und Claus Kühnel (http://www.ckuehnel.ch/bcavr_buch2.htm) liest.

Und als kleiner Tipp: Man kann, mit der in Bascom eingebauten Simulation, herausfinden, welche Register bei einem Highlevel-Befehl verändert werden. Einfach einen Breakpoint beim Highlevel-Befehl sezten. Das Programm starten. Das Programm bleibt dann beim Breakpoint stehen. Dann stellt man auf der rechten Seite die IO-Ansicht so ein, dass man die einzelnen Bit sieht (Bin-Ansicht). Und die Farben stellt man auch zurück.

http://halvar.at/krimskrams3/bascom_io_binaer.gif

Nun kann man mit "Step into Code (F8)" einen Schritt weiter gehen. Jetzt sieht man, welche Änderungen z.B. die Codezeile ``Config Adc = Single , Prescaler = Auto , Reference = Avcc``
durchführt.

http://halvar.at/krimskrams3/bascom_config_adc_io.gif

Im Datenblatt zum jeweiligen AVR-Mikrocontroller kann man jetzt nachschlagen, was damit eingestellt wurde.

mfg
Gerold
:-)

Klingon77
15.03.2009, 15:36
hi,

wie wäre es mit einem diesbezüglichen Artikel für´s WIKI?
Also nur bezüglich der Bit-Einstellungen anhand eines Beispiels z.B: Mega 8 oder Mega 168?:
z.B: Original Datenblatteintrag und die deutsche Anwendung in der Praxis?

Wenn sich beide Spezialisten zusammentun könnte die ganze "Gemeinde" davon profitieren.

versöhnliche Grüße,

Klingon77

guenter1604
15.03.2009, 16:03
Hallo Gerold,

es ist lustig, daß du Roland Walter erwähnst. Der setzt in seinem Einsteigerbuch die Register meistens direkt und benutzt dafür keine Highlevel-Befehle. In jedem Absatz kommt mindestens einmal der Satz: "Weitere Details findest du im Atmel Datenblatt" ;-)
Er hat eigentlich völlig recht. So Highlevel ist es ja auch nicht wenn mit einer langen Textzeile gerade mal 8 Bits gesetzt werden. Auch über die Lesbarkeit des Codes lässt sich in diesem Fall streiten, denn die gesetzten Bits lassen sich auch im Kommentar erläutern.

Danke für den Simulator-Tipp. Den Simulator unterschätze ich regelmässig, obwohl er mir schon öfters weitergeholfen hat. Durch die Zeitanzeige kann auch die Performance der Bascombefehle bestimmt werden und eigentlich immer der Satz "dafür ist Bascom zu langsam" wiederlegt werden.

Günter