'=============================================================================== 'RGB Fader for Night Flight Wing V1 ' 'Im mittleren RC Kanalbereich bleibt momentane Farbe an (kein Fading) 'Im oberen und unteren RC Kanalbereich fadet die Farbe weiter (Richtung und Geschwindigkeit abhängig vom RC Kanalbereich) ' 'RC Eingang an Pin 7 (PB2, INT0) 'LED rot (PB4) 'LED gruen (PB3) 'LED blau (PB0) 'LEDs --> gemeinsame Kathode (Minus), zum Ändern der Logic in ISR "Rgb_fader" 0 und 1 tauschen 'Optionale Mittelstellung-Kontoll-LED an Pin6 (PB1) ' 'Geringe Timerauflösung der RC Signale (62 Schritte) um Überläufe bei Signalen > 2ms zu vermeiden '=============================================================================== $regfile = "attiny45.dat" $crystal = 8000000 $hwstack = 32 'default use 32 for the hardware stack $swstack = 10 'default use 10 for the SW stack $framesize = 40 'default use 40 for the frame space '------------------------------------------------------------------------------------------------- 'Timer konfigurieren '------------------------------------------------------------------------------------------------- Config Timer0 = Timer , Prescale = 1 'Timer0 für PWM On Timer0 Rgb_fader Enable Timer0 Tccr1 = &B00001000 'Timer1 für RC-Signal Einlesung wird gestartet (Prescale 128) (geht beim Attiny45 nicht mit "Config"!)RC Werte typ. 63-125 (1-2ms) '------------------------------------------------------------------------------------------------- 'Interrupt-Service-Routinen konfigurieren und freigeben '------------------------------------------------------------------------------------------------- Config Int0 = Change 'beim Flankenwechsel an PB2/INT0 (RC Eingang) Int0 auslösen und in die Subroutine springen Enable Int0 On Int0 Rc_eingang_1 Nosave 'Register werden manuel in der ISR gesichert Enable Interrupts '------------------------------------------------------------------------------------------------------------- 'Ein- und Ausgang festlegen '------------------------------------------------------------------------------------------------------------- Ddrb = &B00011011 'PB0, PB3 und PB4 werden Ausgänge, restlicher PortB bleibt Eingang, opt PB1 für Kontroll-LED Rot Alias Portb.4 Gruen Alias Portb.3 Blau Alias Portb.0 Controll_led Alias Portb.1 '------------------------------------------------------------------------------------------------------------- 'Variablen definieren '------------------------------------------------------------------------------------------------------------- 'für PWM Dim Zaehler As Byte Dim Blauled As Byte Dim Gruenled As Byte Dim Rotled As Byte Dim R As Byte 'Hilfvariable für Rot Dim G As Byte 'Hilfvariable für Gruen Dim B As Byte 'Hilfvariable für Blau Dim Farbe As Word 'Variable für Farbwahl, Werte zwischen 0-1535 (6 unterschiedliche Fadingstufen * 256 Schritte) 'für Fading Geschwindigkeit Dim Speed As Word Dim Speed_wert As Word 'für RC Signal einlesen Dim Rc_signal_1_start As Byte Dim Rc_signal_1_stop As Byte Dim Rc_signal_1_stop_flag As Byte Dim Impulslaenge_1 As Byte '====================================================== 'Hauptprogramm '====================================================== Do 'Mittelstellung RC ergibt einen Wert von ca. 94 in der Variable "Impulslaenge_1" 'Todbereich um die Mittelstellung soll +-6 sein --> zwischen 88 und 100 'Farbwerte 0 - 1536 (256*6) 'RC Kanal auswerten If Rc_signal_1_stop_flag = 1 Then 'Bearbeitung nur, wenn ISR Pulsende gefunden hat Impulslaenge_1 = Rc_signal_1_stop - Rc_signal_1_start Rc_signal_1_stop_flag = 0 End If ' Kontroll_LED einschalten, solange Impulslaenge_1 außerhalb des Todbereichs If Impulslaenge_1 > 87 And Impulslaenge_1 < 101 Then Controll_led = 1 Else Controll_led = 0 'Vorwärts faden (rot - grün - blau) If Impulslaenge_1 < 88 Then ' im unteren RC Kanal Bereich (63 - 87)... If Farbe = 0 Then Farbe = 1536 End If Decr Farbe ' ...wird "vorwärts" gefadet Speed_wert = Impulslaenge_1 - 62 'Werte 1 - 25 If Speed_wert > 25 Then 'bei RC-signal unter 1ms würde Wert wieder groß (0-1=255), daher beim Unterschreiten von 1 abfangen Speed_wert = 1 End If Speed_wert = Speed_wert * 150 'Werte 150-3750 For Speed = 0 To Speed_wert 'Fadegeschwindigkeit in Abhängigkeit vom RC Kanal Next Speed End If 'Rückwärts faden (blau - grün - rot) If Impulslaenge_1 > 100 Then ' im oberen RC Kanal Bereich (101-125)... If Farbe = 1535 Then Farbe = 0 End If Incr Farbe ' ...wird "rückwärts" gefadet Speed_wert = Impulslaenge_1 - 100 'Werte 1 - 25 If Speed_wert > 25 Then ' höhere Werte (wenn RC Signal länger als 2 ms) abfangen Speed_wert = 25 End If Speed_wert = 26 - Speed_wert 'Speedwerte inventieren Speed_wert = Speed_wert * 150 'Werte 150 - 3750 For Speed = 0 To Speed_wert 'Fadegeschwindigkeit in Abhängigkeit vom RC Kanal Next Speed End If '------------------------------------------------------------------------------------------------------------- 'Farbe "mischen" '------------------------------------------------------------------------------------------------------------- If Farbe < 255 Then 'Farbbereich zwischen Rot und Violett Rotled = 255 Blauled = Farbe Gruenled = 0 End If If 255 < Farbe And Farbe < 511 Then 'Farbbereich zwischen Violett und Blau R = Farbe - 255 Rotled = 255 - R Blauled = 255 Gruenled = 0 End If If 511 < Farbe And Farbe < 767 Then 'Farbbereich zwischen Blau und Cyan Rotled = 0 Blauled = 255 Gruenled = Farbe - 512 End If If 767 < Farbe And Farbe < 1023 Then 'Farbbereich zwischen Cyan und Gruen Rotled = 0 B = Farbe - 767 Blauled = 255 - B Gruenled = 255 End If If 1023 < Farbe And Farbe < 1279 Then 'Farbbereich zwischen Gruen und Gelb Rotled = Farbe - 1023 Blauled = 0 Gruenled = 255 End If If 1279 < Farbe Then 'Farbbereich zwischen Gelb und Rot Rotled = 255 Blauled = 0 G = Farbe - 1280 Gruenled = 255 - G End If Loop End '====================================================== 'ISR '====================================================== 'Soft PWM Programm RGB Fader Rgb_fader: Incr Zaehler If Rotled > Zaehler Then Rot = 1 Else Rot = 0 If Gruenled > Zaehler Then Gruen = 1 Else Gruen = 0 If Blauled > Zaehler Then Blau = 1 Else Blau = 0 Return 'RC Kanal einlesen Rc_eingang_1: $asm push r17 'Register auf Stack sichern sbis pinb , 2 'Skip next Instr if PINBx = 1 rjmp Puls_ende1 'Springe Puls_ende in r17 , tcnt1 'Timer1 Wert holen sts {Rc_signal_1_start} , r17 'Speichere Timer1 nach Rc_signal_1_start rjmp ende1 'Springe zum Ende Puls_ende1: in r17 , tcnt1 'Timer1 Wert holen sts {Rc_signal_1_stop} , r17 'Speichere Timer1 nach Rc_signal_1_stop ldi r17 , 1 sts {Rc_signal_1_stop_flag} , r17 'Setze Flag zur Bearbeitung von Impulslaenge in Hauptschleife Ende1: pop r17 'Register vom Stack zurückholen $end Asm Return