PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer2 deaktiviren?



TobiasBlome
12.01.2009, 16:04
Hallo,
kann man den Timer2 (und nur den) deativiren?

ich habe es so versucht. Bascom kompiliert zwar aber sobal dieser Part aktiv ist geht nix mehr....

If Programm = 2 Then
'Disable Timer2
Gosub Lauflicht
End If

TomEdl
12.01.2009, 16:09
Hallo!

Mit diesem Befehl schaltest du nur die Interrupts des Timers aus, um ihn zu stoppen musst du folgendes schreiben:



Stop Timer2


Gruß
Thomas

TobiasBlome
12.01.2009, 16:26
Hallo Thomas,
dann läuft keiner der Timer mehr. gibt es da noch eine andere Möglichkeit? (ausser in der Int-Routine mit goto an das ende zu springen?)

TomEdl
12.01.2009, 16:28
Hallo Thomas,
dann läuft keiner der Timer mehr. gibt es da noch eine andere Möglichkeit? (ausser in der Int-Routine mit goto an das ende zu springen?)
Es läuft keiner mehr? Hast du explizit STOP TIMER2 geschrieben? Also bei mir funktionierts eigenartigerweise...

Poste mal das gesamte Programm.

Gruß
Thomas
;)

TobiasBlome
12.01.2009, 16:42
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
'=======================================
'=======================================



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

TomEdl
12.01.2009, 16:48
Sollte aber funktionieren...
Komisch...

Gruß
Thomas
;)

TobiasBlome
12.01.2009, 16:53
oder benutzt der RC5 Code den Timer2 und nicht den Timer1? ich habe da leider nicht richtig viel gefunden....

Michael
12.01.2009, 17:19
Hallo TobiasBlome,

RC5 benutzt Timer0.


Const Timervorgabe2 = 200 'also ca 18200 mal pro Sekunde!!!
es sind nur 17857. Du hast 56 Takte bis zum Überlauf, nicht 55.
Allerdings hast du nur 56*8 = 448 Takte bis zum nächsten Interrupt und bei dem, was du dort alles drin hast, kann ich mir nicht vorstellen, daß das gutgeht. Warum überhaupt SW-PWM? Du hast doch 3 Kanäle in HW?

Gruß, Michael

TobiasBlome
12.01.2009, 20:02
Ich habe mir mal eine Exceltabelle gebaut, um Timer zu berechnen und laut Tabelle habe ich den Timer richtig - aber ich rechne das gleich noch mal nach.


Tja SW-PWM:

der Mega8 hat ja nur 3 Timer:
1xRC5
2xPWM

ich weiß nicht ob die Timer noch etwas anderes nebenbei schaffen...

PS: ich habe den 3.Kanal (OC2) nicht zum laufen bekommen... :oops: :oops: :oops:

aber die SW-PWM kommt tatsächlich an ihre Grenzen :-b

Aber ich bin ja noch (hoffentlich) lernfähig.
Könnte mir jemand die 3 Timer aufschreiben?

Könnte ich ZUSÄTZLICH trotzdem noch zb. On Timer1 Timer1_irq benutzen?



'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 Up , Compare B Pwm = Clear Up , Prescale = 1

'Timer2 = 8 Bit
Config Timer2=PWM ??????????????????

Enable Interrupts

'----

Compare1a = Led1
Compare1b = Led2
Compare_??? = Led3

TobiasBlome
12.01.2009, 20:14
ok - 17857,1.. ich muss mal meine Exceltabelle kontrollieren...

TobiasBlome
12.01.2009, 20:17
aber - von 0-200 sind doch 201 Schritte: Dann sind das doch nur 55 oder?!

Michael
12.01.2009, 20:23
Hallo TobiasBlome,

Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 64
OCR2 = Bytevariable


Könnte ich ZUSÄTZLICH trotzdem noch zb. On Timer1 Timer1_irq benutzen?
ich fürchte nicht.


von 0-200 sind doch 201 Schritte:
nein, 200 Schritte sind das, zähl sie ruhig nach ;).
Und von 200 bis zum Überlauf (256=0) sind es noch 56

Gruß, Michael

TobiasBlome
12.01.2009, 20:27
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).

Michael
12.01.2009, 20:46
Hallo TobiasBlome,


würdest du denn die Hardware PWM in meinem Fall benutzen?
ja logo, ich habe es bereits gemacht ;)

Gruß, Michael

TobiasBlome
12.01.2009, 20:53
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

Michael
12.01.2009, 21:09
Hallo TobiasBlome,


wenn du keine IR-FB hast dann hast du ja auch einen freien Timer
verstehe nicht.
Timer0 = RC5
Timer1A = PWM1
Timer1B = PWM2
Timer2 = PWM3

Gruß, Michael

TobiasBlome
13.01.2009, 15:59
verstehe nicht.
Timer0 = RC5
Timer1A = PWM1
Timer1B = PWM2
Timer2 = PWM3


genau - nun sind 3 Timer in Benutzung. Nun benötige ich doch noch einen 4. timer um Übeblendeffekte zwischen den Farben zu machen - oder?

(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 ;-) )

Michael
13.01.2009, 16:19
Hallo TobiasBlome,


Nun benötige ich doch noch einen 4. timer um Übeblendeffekte zwischen den Farben zu machen - oder?
Achso, ich dachte, das machst du mit Zähler und Pause im Hauptprogramm.


ob man nun zusätzlich noch z.b. Timer2irq aufrufen kann,
probier es doch aus und berichte ;)

Gruß, Michael

TobiasBlome
13.01.2009, 20:56
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



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

Michael
13.01.2009, 21:39
Hallo TobiasBlome,


Also: zusätzliche TimerXirq aufrufen klappt bei mir nicht... sind die Timer wohl nicht für ausgelegt...?
seltasm, bei mir funktioniert es ;)


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


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.
Die LED toggelt fast im Sekundentakt.

Gruß, Michael

TobiasBlome
13.01.2009, 21:56
ähhh - ich habe nichts gemacht: nur im Programm und fusebits auf 16MHz umgestellt und es läuft immer noch ;-)

was hab ich denn da vorhin gemacht?

Timer_irq teste ich morgen nochmal...

ps: Prescale = 256 läuft wunderbar :-) (mit 8 und 16MHz)

TobiasBlome
14.01.2009, 15:51
Tja nun funktioniert IRQ auch ;-) Enable Timer1 - vergessen
warum steht das auch nicht in der PWM-Confi drin...