PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 15Kanäle schalten und dimmen



guenter1604
29.11.2008, 09:29
Hallo NG,

mit einem ATMega88 will ich 15 Ausgänge schalten und mit PWM dimmen.
Im Idealfall sollen 3 Helligkeiten für die Ausgänge wählbar sein.

3 Software-PWMs scheiden ja warscheinlich wegen der sich beeinflussenden Interrupts aus. Wie bekomme ich das Signal des Hardware-PWM auf mehrere Pins verteilt?

Günter

pyr0skull
29.11.2008, 11:28
Welche Interrupts sollten sich da beeinflussen?

Das kann man alles mit einem Interrupt erschlagen. Mit einem Quarz sollte bei 3 PWMs auch die Abtastrate in einem brauchbaren Rahmen bleiben, zumindest war es bei mir mit C so - wie das bei Bascom aussieht weiß ich nicht, müsste aber auch klappen.

Du musst dann in der Interrupt-Routine eben alle Ports je nach Konfiguration an- und abschalten. Das Beispiel für Software-PWM im Wiki sollte dir weiterhelfen, den Rest kann man sich dazzureimen.

guenter1604
29.11.2008, 11:40
Hallo Pyo0skull,

damit ich 3 verschiedene Helligkeiten kriege, brauche ich doch 3 PWMs.
Lasse ich bei jedem einen Interrupt auslösen, um die Ausgänge umzuschalten, kann es passieren, daß 2 Interrupts gleichzeitig anstehen und einer warten muß. Dieses ist durch ein zappeln am Ausgang meßbar.
Geht das mit einem Interrupt auch?

Günter

pyr0skull
29.11.2008, 12:46
Du benutzt einfach einen der Hardware-Timer und in deren Interrupt-Routine baust du dir dann ein Software-PWM.

https://www.roboternetz.de/wissen/index.php/Pwm#PWM_per_Software

Da ist der grundlegende Ablauf drin, das muss dann eben für 3 verschiedene PWM-Ausgänge gemacht werden. Die Aufteilung auf einzelne Kanäle musst du dann im Hauptprogramm ausprogrammieren, so das möglichst wenig Logik in der ISR ist.

guenter1604
29.11.2008, 16:26
Hallo pyr0skull,

wenn mans mal begriffen hat eigentlich ganz einfach ;-)

$regfile = "m8def.dat"
$crystal = 1000000

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

Osccal = 255

Dim Hell0 As Byte
Dim Hell1 As Byte
Dim Hell2 As Byte
'bis hell123456 ;-)

Dim Tick As Byte
Dim Range As Byte
Range = 100

On Timer0 Ontimer0
Tccr0 = &B00000001
Timsk.toie0 = 1
Enable Interrupts

Hell0 = 100
Hell1 = 10
Hell2 = 1

Do

Loop

End

Ontimer0:
Tick = Tick + 1
Timer0 = 254
If Tick >= Range Then
Tick = 0
End If
If Tick < Hell0 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
If Tick < Hell1 Then
Portb.2 = 1
Else
Portb.2 = 0
End If
If Tick < Hell2 Then
Portb.3 = 1
Else
Portb.3 = 0
END IF
Return

Danke für deine Hilfe!

Günter

Uwe DK1KQ
03.12.2008, 19:47
Hallo Günter,
kannst Du mir einmal auf die Sprünge helfen,
die eine LED laufend hell und dunkel steuert. (PWM)
(atmega8)
Uwe, dk1kq@darc.de

guenter1604
04.12.2008, 08:53
Timer0 wird mit 254 gestartet und löst bei 255 einen Interrupt aus.
Im Interrupt wird der Ausgang unterhalb des Helligkeitswerts auf High ansonsten auf Low gesetzt.

Fertig ist die PWM

Günter

Uwe DK1KQ
04.12.2008, 09:36
Hallo Günter,

nun ja, das habe ich auch schon gelesen - aber nicht verstanden
Das Programm das Du Pyr0skull geschickt hast -
hm
wenn man sich das Signal mit OSzi ansieht, dann liegen dort Impulse an, die jedoch -- NICHT -- ihr Breite verändern, wie das gewünscht ist.

Es ist mir klar dass der Timer hoch und runterzählt - doch wo ist die Verbindung zum Port ?

m.E müsste sich die Pulsbreite stetig ändern.

Jede Erklärung ( oder Literaturhinweis ) willkommen.

gruß Uwe

guenter1604
04.12.2008, 10:24
Hallo Uwe,


Es ist mir klar dass der Timer hoch und runterzählt - doch wo ist die Verbindung zum Port ?

z.B. hier: Portb.1 = 1


m.E müsste sich die Pulsbreite stetig ändern.

nö nur wenn die Helligkeit geändert wird

z.B. hier:

Hell0 = 100
Hell1 = 10
Hell2 = 1

gruß Günter