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 =
Lesezeichen