aber - von 0-200 sind doch 201 Schritte: Dann sind das doch nur 55 oder?!
Druckbare Version
aber - von 0-200 sind doch 201 Schritte: Dann sind das doch nur 55 oder?!
Hallo TobiasBlome,
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 64
OCR2 = Bytevariable
ich fürchte nicht.Zitat:
Könnte ich ZUSÄTZLICH trotzdem noch zb. On Timer1 Timer1_irq benutzen?
nein, 200 Schritte sind das, zähl sie ruhig nach ;).Zitat:
von 0-200 sind doch 201 Schritte:
Und von 200 bis zum Überlauf (256=0) sind es noch 56
Gruß, Michael
Tja...würdest du denn die Hardware PWM in meinem Fall benutzen?
ich möchte noch eine Variable von 0-255 und zurückzählen lassen(wegen dem Überblenden der einzelnen Farben).
Hallo TobiasBlome,
ja logo, ich habe es bereits gemacht ;)Zitat:
würdest du denn die Hardware PWM in meinem Fall benutzen?
Gruß, Michael
das sieht doch gut aus ;-)
aber die Frage war ja auf mich bezogen? wenn du keine IR-FB hast dann hast du ja auch einen freien Timer :-)
Aber ich denke ich probier das mal mit dem Timer2 mit dem Argument, dass der ja nur eine PWM hat ;-)
gruß, Tobi
Hallo TobiasBlome,
verstehe nicht.Zitat:
wenn du keine IR-FB hast dann hast du ja auch einen freien Timer
Timer0 = RC5
Timer1A = PWM1
Timer1B = PWM2
Timer2 = PWM3
Gruß, Michael
genau - nun sind 3 Timer in Benutzung. Nun benötige ich doch noch einen 4. timer um Übeblendeffekte zwischen den Farben zu machen - oder?Zitat:
Zitat von Michael
(deswegen ja die Frage ob man nun zusätzlich noch z.b. Timer2irq aufrufen kann, um eine Variable von 0-255 zu zählen und natürlich wieder runter ;-) )
Hallo TobiasBlome,
Achso, ich dachte, das machst du mit Zähler und Pause im Hauptprogramm.Zitat:
Nun benötige ich doch noch einen 4. timer um Übeblendeffekte zwischen den Farben zu machen - oder?
probier es doch aus und berichte ;)Zitat:
ob man nun zusätzlich noch z.b. Timer2irq aufrufen kann,
Gruß, Michael
Also: zusätzliche TimerXirq aufrufen klappt bei mir nicht... sind die Timer wohl nicht für ausgelegt...?
--
Das Programm habe ich nun auf Hardware PWM umgeschrieben.
Das merkwürdige: Mit den internen 8MHz läuft das Programm. Mit den externen 16MHz läuft es nicht mehr.
Jemand eine Idee?
(ich wollte noch ein paar funktionen hinzufügen und dafür reichen die 8MHz nicht - deswegen auf 16MHz - dachte ich so....)
Gibt es statt der Case-Anweisung eine µC freundlichere Möglichkeit?
gruß, Tobi
Code:'RGB - LED - Leiste über AT-Mega8
'mit HARDWARE - PWM
'Tobias Blome - 13.01.2008
'
'-------------------------------------------------------------------------------
'INFO´s
'PWM_Wert = Sollwert für Software PWM
'RC5 Eingang über Pin5 / PD3
'Led Rot = Portb.1 = 1
'Led Grün = Portb.2 = 1
'Led Blau = Portb.3 = 1
'Auswahl = 1 -> Rot+Grün
'Auswahl = 2 -> Grün+Blau
'Auswahl = 3 -> Blau+Rot
'-------------------------------------------------------------------------------
'Version 0.01
' -Grundfunktion Regenbogen ok
'
'
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega32
$crystal = 8000000 'Quarz: 8 MHz intern
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Timer0 = 8 Bit
'wird für RC5 Auswertung benötigt!!!
Config Rc5 = Pind.3 'Timer0 in Benutzung!!!
Portd.3 = 1
'Timer1 = 16 Bit
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
Enable Interrupts
'Timer2 = 8 Bit SOFTWARE - PWM
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 256
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------
Dim Address As Byte , Command As Byte 'RC5
Dim Flag As Bit 'RC5
Dim Rot As Byte , Gruen As Byte , Blau As Byte
Dim Programm As Byte 'Lichtprogramm wählen
Dim Auswahl As Byte 'Wert 1-6 um die PWM auf die LED´s aufzuteilen
Dim Pwm As Byte
Dim Pwm_m As Bit
'Tasten festlegen
Up Alias 32 'Prog.Bezeichnung ALIAS Real Taste
Down Alias 33
Progplus Alias 16 'Lichtprogramm wählen
Progminus Alias 17
'-------------------------------------------------------------------------------
'Vor Programmstart:
Rot = 0
Gruen = 0
Blau = 0
Flag = 1 'Merker für PWM
Programm = 1 'Lichtprogramm wählen
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
Compare1a = Rot
Compare1b = Gruen
Ocr2 = Blau
'-------------------------------------------------------------------------------
'Rc5 Code einlesen:
Getrc5(address , Command)
If Flag = 1 Then
'Print "wait for command"
Flag = 0
End If
If Address <> 255 Then
Reset Command.7 ' reset toggle bit
''Print "Address: " ; Address
'Print "Command: " ; Command
Flag = 1
End If
'-------------------------------------------------------------------------------
'RC5 Code umsetzen:
'Lichtprogramm Wählen
If Command = Progplus Then
If Programm = 6 Then
Programm = 1
Else
Incr Programm
End If
Waitms 200
End If
If Command = Progminus Then
If Programm = 1 Then
Programm = 6
Else
Decr Programm
End If
Waitms 200
End If
'-------------------------------------------------------------------------------
'LED-PAAR auswählen (Handbetrieb)
'Auswahl 1 über FB LED Rot und Grün
If Command = 1 Then
Auswahl = 1
End If
'Auswahl 2 über FB LED Grün und Blau
If Command = 2 Then
Auswahl = 2
End If
'Auswahl 3 über FB LED Blau und Rot
If Command = 3 Then
Auswahl = 3
End If
'-------------------------------------------------------------------------------
'Springe zu Lichtprogramm
If Programm = 1 Then
Gosub Regenbogendauer
End If
Loop
End
'===============================================================================
'===============================================================================
Regenbogendauer:
If Pwm = 255 Then 'Wenn Led1 100% dann Merker zum hochzählen setzen
Pwm_m = 0
Incr Auswahl 'LED´s durchschieben
End If
If Pwm = 0 Then 'Wenn Led1 0% dann Merker zum runterzählen setzen
Pwm_m = 1
Incr Auswahl 'LED´s durchschieben
End If
If Auswahl = 7 Then 'Auswahl auf 6 LED-Paaren begrenzen
Auswahl = 1
End If
'PWM hoch/runter zählen
If Pwm_m = 1 Then
Pwm = Pwm + 5
End If
If Pwm_m = 0 Then
Pwm = Pwm - 5
End If
Select Case Auswahl 'LED Paar wählen
Case 1 : Rot = Pwm
Gruen = 255 - Pwm
Blau = 0
Case 2 : Rot = Pwm
Gruen = 0
Blau = 255 - Pwm
Case 3 : Rot = 0
Gruen = Pwm
Blau = 255 - Pwm
Case 4 : Rot = 255 - Pwm
Gruen = Pwm
Blau = 0
Case 5 : Rot = 255 - Pwm
Gruen = 0
Blau = Pwm
Case 6 : Rot = 0
Gruen = 255 - Pwm
Blau = Pwm
End Select
Return
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
'===============================================================================
'Pinbelegung µC RGB LED Leiste
'===============================================================================
' AT MEGA 8
' +---U---+
'PC6 +1 28+ PC5
'PD0 +2 27+ PC4
'PD1 +3 26+ PC3
'PD2 +4 25+ PC2
'PD3 +5 24+ PC1
'PD4 +6 23+ PC0
'Vcc +7 22+ GND
'GND +8 21+ AREF
'PB6 +9 20+ AVCC
'PB7 +10 19+ PB5 /PROG
'PD5 +11 18+ PB4 /PROG
'PD6 +12 17+ PB3 /PROG
'PD7 +13 16+ PB2
'PB0 + 14 15 + Pb1
' +-------+
'PB0 =
'PB1 = Software PWM LED ROT
'PB2 = Software PWM LED GRÜN
'PB3 = Software PWM LED BLAU
'PB4 =
'PB5 =
'PB6 =
'PB7 =
'PC0 =
'PC1 =
'PC2 =
'PC3 =
'PC4 =
'PC5 =
'PC6 = RESET
'PC7 =
'PD0 =
'PD1 =
'PD2 =
'PD3 = IR - RC5 Eingang
'PD4 =
'PD5 =
'PD6 =
'PD7 =
Hallo TobiasBlome,
seltasm, bei mir funktioniert es ;)Zitat:
Also: zusätzliche TimerXirq aufrufen klappt bei mir nicht... sind die Timer wohl nicht für ausgelegt...?
Durch die PWM = 8 (Bit) läuft der Timer bei 512 über. Bei 16 MHz und einem Prescaler von 64 macht das (16000000/(512*64))=488,28125 Hz Timerfrequenz.Code:Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Enable Timer1
On Timer1 Timer_irq
Enable Interrupts
''Hauptprogramm mit Compare1a usw.
Timer_irq:
Bla = Bla + 1
If Bla > 488 Then
Toggle Led1
Bla = 1
End If
Return
Die LED toggelt fast im Sekundentakt.
Gruß, Michael