ich habe es versuchsweise mit goto gemacht - aber STOP ist natürlich viel besser
Programm ist noch nicht ganz fertig aber dieser Teil funktioniert in sich.
STOP habe ich eingeramt
'=======================================
'=======================================
STOP
'=======================================
'=======================================
Code:'RGB - LED - Leiste über AT-Mega8 'Tobias Blome - 12.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.04 ' -RS232 ok ' -RC5 ok ' -Farbe wechseln durch ' -jede Farbe doppelt!!!!!!!!!!!!!!!! 'Version 0.06 ' - >251 und <4 wird die Auswahl umgeschaltet 'Version 0.07 ' -Auswahl von 3 auf 6 erhöht ' -Farben sortiert ' 'Version 0.09 ' -GoSub Anweisung für verschiedene Programme ' 'Version 1.10 ' -Lauflicht ' '------------------------------------------------------------------------------- 'Konfiguration µC: $regfile = "m8def.dat" 'AT-Mega32 $crystal = 8000000 'Quarz: 8 MHz intern $baud = 9600 'Baudrate definieren '------------------------------------------------------------------------------- 'Ein- Ausgänge: Ddrb = &B1111111 '1 Ausgang, 0 Eingang = Pin PB7-0 '------------------------------------------------------------------------------- '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 = Timer , Prescale = 1024 On Timer1 Timer1_irq Const Timervorgabe1 = 57722 'also ca 1 mal pro Sekunde!!! Enable Timer1 Enable Interrupts 'Timer2 = 8 Bit SOFTWARE - PWM Config Timer2 = Timer , Prescale = 8 'Teiler Enable Timer2 On Timer2 Pwm_prog 'timer einschalten Const Timervorgabe2 = 200 'also ca 18200 mal pro Sekunde!!! Enable Interrupts '------------------------------------------------------------------------------- 'Variablen: '------------------------------------------------------------------------------- Dim Address As Byte , Command As Byte Dim Flag As Bit 'PWM Dim Z As Word Dim Pwm_wert As Byte 'Sollwert Dim Ri As Byte ' Hilfsregister Dim Programm As Byte 'Lichtprogramm wählen Dim Auswahl As Byte 'Wert 1-3 um die PWM auf die LED´s aufzuteilen Dim Updown As Bit 'Merker für automatisch hoch und runter dimmen Dim Updownm As Bit Dim T2 As Bit 'Timer2 deaktiviren 'Tasten festlegen Up Alias 32 'Prog.Bezeichnung ALIAS Real Taste Down Alias 33 Progplus Alias 16 'Lichtprogramm wählen Progminus Alias 17 '------------------------------------------------------------------------------- 'Vor Programmstart: Flag = 1 'Merker für PWM Pwm_wert = 128 'PWM-Wert 0-255 => Hälfte 127,5 Auswahl = 1 'LED Auswahl Updown = 1 'Merker um vor zurück zu änden Updownm = 0 Programm = 1 'Lichtprogramm wählen '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Do '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 'nicht benötigte 3. LED-Farbe bei Auswahl ausschalten If Auswahl = 1 Then 'Rot und Grün -> Blau aus Portb.3 = 0 End If If Auswahl = 2 Then 'Grün und Blau -> Rot aus Portb.1 = 0 End If If Auswahl = 3 Then 'Blau und Rot -> Grün aus Portb.2 = 0 End If 'Lichtprogrammauswahl If Programm = 1 Then Gosub Regenbogen End If '======================================= '======================================= '======================================= If Programm = 2 Then 'Stop Timer2 T2 = 0 Gosub Lauflicht Else T2 = 1 End If '======================================= '======================================= '======================================= If Programm = 3 Then Gosub Doppelblitz: End If Loop End '------------------------------------------------------------------------------- 'Sprungmarken '------------------------------------------------------------------------------- '_______________________________________________________________________________ Doppelblitz: '_______________________________________________________________________________ 'ROT Portb.3 = 0 'BLAU AUS!!! Auswahl = 1 'Auswahl = 1 -> Rot+Grün Pwm_wert = 0 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 'Geld Portb.3 = 0 'BLAU AUS!!! Auswahl = 1 'Auswahl = 1 -> Rot+Grün Pwm_wert = 128 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 'GRÜN Auswahl = 1 'Auswahl = 1 -> Rot+Grün Pwm_wert = 255 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 'BLAU Auswahl = 2 'Auswahl = 1 -> Rot+Grün Pwm_wert = 0 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 Return '_______________________________________________________________________________ Lauflicht: '_______________________________________________________________________________ 'ROT Portb.3 = 0 'BLAU AUS!!! Auswahl = 1 'Auswahl = 1 -> Rot+Grün Pwm_wert = 0 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 'GRÜN Auswahl = 1 'Auswahl = 1 -> Rot+Grün Pwm_wert = 255 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 'BLAU Auswahl = 2 'Auswahl = 1 -> Rot+Grün Pwm_wert = 0 'PWM-Wert 0-255 => Hälfte 127,5 Waitms 50 Return '_______________________________________________________________________________ Regenbogen: '======================================= '======================================= '======================================= If T2 = 0 Then Goto Sprung End If '======================================= '======================================= '======================================= '_______________________________________________________________________________ 'PWM-Wert über Taste UP & DOWN hoch runter 'PWM-Wert wird auf 0-255 begrenzt 'Wenn das Ende einer Richtung erreicht ist, wird automatisch in die andere Richtung gezählt (Merker: UpDown) If Command = Up And Pwm_wert < 251 And Updown = 1 Then Pwm_wert = Pwm_wert + 5 End If If Command = Down And Pwm_wert > 4 And Updown = 1 Then Pwm_wert = Pwm_wert - 5 End If '--- If Command = Down And Pwm_wert < 251 And Updown = 0 Then Pwm_wert = Pwm_wert + 5 End If If Command = Up And Pwm_wert > 4 And Updown = 0 Then Pwm_wert = Pwm_wert - 5 End If '--------Umschaltung Updown 0/1 (Hilfsmerker: UpDownM) If Pwm_wert < 4 And Updownm = 1 Then Toggle Updown Updownm = 0 End If If Pwm_wert > 251 And Updownm = 1 Then Toggle Updown Updownm = 0 End If If Pwm_wert < 15 Or Pwm_wert > 240 And Updownm = 0 Then 'Hilfsmerker bei 200 zurücksetzen Updownm = 1 End If '----------- '------------------------------------------------------------------------------- 'Farbübergänge: zwischen den LED Paaren wechseln 'wenn Taste für LED´s hochdimmen gedrückt -> muss bei 251 und bei 4 umgeschaltet werden If Command = Up And Pwm_wert > 251 Then Pwm_wert = 255 'falls er sich verzählt!!! If Auswahl = 6 Then Auswahl = 1 Else Auswahl = Auswahl + 1 End If End If If Command = Up And Pwm_wert < 4 Then Pwm_wert = 0 'falls er sich verzählt!!! If Auswahl = 6 Then Auswahl = 1 Else Auswahl = Auswahl + 1 End If End If '--- 'wenn Taste für LED´s runterdimmen gedrückt -> muss bei 251 und bei 4 umgeschaltet werden If Command = Down And Pwm_wert < 4 Then Pwm_wert = 0 'falls er sich verzählt!!! If Auswahl = 1 Then Auswahl = 6 Else Auswahl = Auswahl - 1 End If End If If Command = Down And Pwm_wert > 251 Then Pwm_wert = 255 'falls er sich verzählt!!! If Auswahl = 1 Then Auswahl = 6 Else Auswahl = Auswahl - 1 End If End If Sprung: Return '------------------------------------------------------------------------------- 'TIMER SPRUNGMARKEN: Timer1_irq: Timer1 = Timervorgabe1 'Print "Command: " ; Command ; " RC5 von FB" 'Print "PWM_Wert: " ; Pwm_wert ; " Sollwert" 'Print "Auswahl: " ; Auswahl ; " Wert 1-3 um die PWM auf die LED´s aufzuteilen" 'Print "UpDown: " ; Updown ; " Merker für automatisch hoch und runter dimmen" 'Print "UpDownM: " ; Updownm 'Print "Programm: " ; Programm 'Print " " Return Pwm_prog: Timer2 = Timervorgabe2 'Funktion: 'Wenn der Zähler (z) =0 ist, dann beginnt ein neuer PWM Zyklus: 'Der Zähler (z) wird auf 255 gesetzt weil ein PWM Zyklus 255 Takte hat! 'In das Hilfsregister (Ri) wird der Sollwert (PWM_Wert) geladen 'der Zähler wird -1 gezählt 'wenn Ri z.B. = 50 dann ist Ri größer 0 und der Ausgang wird eingeschaltet Ri wird -1 gerechnet 'beim nächsten Durchlauf wird der Zähler wieder um 1 runtergezählt. Ri ist 50-1 also 49. 49ist größer als 0 und der Ausgang wird eingeschaltet 'wenn irgendwann Ri = 0 ist wird der Ausgang ausgeschaltet. Und das passiert solange (soviele Takte)bis der Zähler (Z) auf 0 heruntegezählt wurde 'wenn der Zähler (Z) = 0 ist ist ein PWM Zyklus zuende, der Zähler wird wieder auf 255 gesetzt und alles beginnt von vorne 'bei einem Sollwert von 50 (Ri=50) wird der Ausgang also 50 Takte EIN geschaltet und 205 Takte AUS geschaltet; 'das entspricht bei 5V im Mittel ca. 1V If Z = 0 Then 'Z = Zähler für Verhältnisstakte Z = 255 'Zähler (Z) auf 255 setzen Ri = Pwm_wert 'Sollwert (PWM_Wert) in Hilfregister (Ri) schreiben End If 'Zähler runterzählen Z = Z - 1 'PWM UMSETZUNG ANFANG If Ri > 0 Then 'wenn Hilfsregister (Ri) größer 0, dann 'PWM auf die LED-Paare übertragen If Auswahl = 1 Then 'Auswahl der LED Farben Portb.2 = 1 'GRÜN PWM-Ausgang einschalten Portb.1 = 0 'ROT PWM-Ausgang ausschalten End If If Auswahl = 2 Then 'Auswahl der LED Farben Portb.2 = 1 'GRÜN PWM-Ausgang einschalten Portb.3 = 0 'BLAU End If If Auswahl = 3 Then 'Auswahl der LED Farben Portb.1 = 1 'ROT PWM-Ausgang einschalten Portb.3 = 0 'BLAU End If If Auswahl = 4 Then 'Auswahl der LED Farben Portb.1 = 1 'ROT PWM-Ausgang einschalten Portb.2 = 0 'GRÜN PWM-Ausgang ausschalten End If If Auswahl = 5 Then 'Auswahl der LED Farben Portb.3 = 1 'BLAU PWM-Ausgang einschalten Portb.2 = 0 'GRÜN End If If Auswahl = 6 Then 'Auswahl der LED Farben Portb.3 = 1 'BLAU PWM-Ausgang einschalten Portb.1 = 0 'ROT End If Else 'sonst '--- If Auswahl = 1 Then Portb.2 = 0 'GRÜN PWM-Ausgang ausschalten Portb.1 = 1 'ROT PWM-Ausgang einschalten End If If Auswahl = 2 Then Portb.2 = 0 'GRÜN Portb.3 = 1 'BLAU End If If Auswahl = 3 Then Portb.1 = 0 'ROT Portb.3 = 1 'BLAU End If If Auswahl = 4 Then Portb.1 = 0 'ROT PWM-Ausgang ausschalten Portb.2 = 1 'GRÜN PWM-Ausgang einschalten End If If Auswahl = 5 Then Portb.3 = 0 'BLAU Portb.2 = 1 'GRÜN End If If Auswahl = 6 Then Portb.3 = 0 'BLAU Portb.1 = 1 'ROT End If End If 'PWM UMSETZUNG ENDE Ri = Ri - 1 If Ri = 255 Then Ri = 0 Return '=============================================================================== '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 =






Zitieren

Lesezeichen