Lenox
07.03.2007, 15:59
Wie ein paar von euch schon wissen bin ich so gut wie fertig mit meinem Projekt, aber die letzten beiden Probleme bekomm ich einfach nicht gelöst.
1. Die Programme sollen solange ausgeführt werden bis der Befehl für ein anderes erfolg. (Siehe Wait_and_get Subroutine) Leider funktioniert das mit dem last_ir_command so nicht, warum weiß ich leider nicht.
2. "Programmr" soll nur die rote Led dauerhaft anschalten. (Portd.6)
Problem ist das der Port nicht einfach geschaltet werden kann, da der Timer0 für die RGB PWM ja im Hintergrund läuft.
Hier der Code:
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 40
$crystal = 16000000
$baud = 9600
Waitms 50 'Einschwingzeit
'//////////Ports Konfigurieren\\\\\\\\\\
Config Porta = Output 'M1
Config Portc = Output 'M2
Config Portd.6 = Output 'RGB-Rot
Config Portd.3 = Input 'TSOP
Porta.4 = 1 'Enable1 active = low
Portc.4 = 1
Enable1 Alias Porta.4
Enable2 Alias Portc.4
Portd.6 = 1 'RGB Led ausschalten
Portc.7 = 1
Portc.6 = 1
'//////////Timer konfigurieren, Vorteiler auf 1\\\\\\\\\\
Config Timer0 = Timer , Prescale = 1
'//////////RC5 konfigurieren mit Timer 2\\\\\\\\\\
Config Rc5 = Pind.3 , Timer = 2
'/////////Sub Deklarieren\\\\\\\\\\\\\
Declare Sub Wait_and_get(byval Ms As Byte)
'//////////Definiere den Interrupthandler\\\\\\\\\\
On Ovf0 Tim0_isr
Enable Interrupts
Enable Timer0 'Timer einschalten
Dim R1 As Byte ' In diese Variablen muss man
Dim G1 As Byte ' im Hauptprogram die gewünschten
Dim B1 As Byte ' Ausgabewerte laden
Dim Z As Word 'Zähler
Dim Ri1 As Byte 'Hilfsregister
Dim Gi1 As Byte
Dim Bi1 As Byte
'//////////Variablen für Hauptprogramm\\\\\\\\\\
Dim A As Byte 'Schleifenvariable RGBs
Z = 0
G1 = 0
R1 = 0
B1 = 0
Dim I As Byte 'Schleifenvariable Lauflicht
Dim I2 As Byte 'Schleifenvariable Lauflicht
Dim I3 As Byte 'Schleifenvariable Lauflicht
Dim Freilauf As Byte
Dim Ir_address As Byte
Dim Ir_command As Byte
Dim Last_ir_command As Byte
Last_ir_command = 0
Dim Programm As Byte 'Programmauswahl
Programm = 0 'Erst nix machen
'EEPROM Variablen
'Dim R_save As Eram Byte
'Dim G_save As Eram Byte
'Dim B_save As Eram Byte
Wait 1
'//////////Einstellungen\\\\\\\\\\
Freilauf = 20 'Lauflicht Freilaufzeit
'Normaldurchlauf = 2 'Anzahl der Standarddurchläufe
'//////////Hauptprogramm <Start>\\\\\\\\\\
Waitms 200
Print "Starte Hauptprogramm"
Do
Call Wait_and_get(1) 'bisschen Däumchen drehen und warten bis was gedrückt wird ;)
Loop
'//////////Hauptprogramm <Ende>\\\\\\\\\\
'Programm1: RGB LEDs
Programm1:
'Rot
For A = 0 To 254
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
R1 = R1 - 1
Waitms 1
Next
'Grün
For A = 0 To 254
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
Waitms 1
Next
'Blau
For A = 0 To 254
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
Waitms 1
Next
'Blau/Grün
For A = 0 To 254
B1 = B1 + 1
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
G1 = G1 - 1
Waitms 1
Next
'Blau/Rot
For A = 0 To 254
B1 = B1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
R1 = R1 - 1
Waitms 1
Next
'Grün/Rot
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
Waitms 1
Next
'Grün/Rot/Blau
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
B1 = B1 - 1
Waitms 1
Next
Return
'Programm2: Lauflicht
Programm2:
For I = 0 To 15
Porta = I
Enable1 = 0
Waitms Freilauf
Enable1 = 1
Next I
For I = 0 To 11
Portc = I
Enable2 = 0
Waitms Freilauf
Enable2 = 1
Next I
Call Wait_and_get(0)
Return
'Programm3: Lauflicht2
Programm3:
For I = 0 To 15
Porta = I
Enable1 = 0
Waitms 10
Enable1 = 1
Next I
For I = 0 To 11
Portc = I
Enable2 = 0
Waitms 10
Enable2 = 1
Next I
Call Wait_and_get(0)
Return
Programmr:
'R1 = 255
Disable Timer1
Portd.6 = 0
Waitms 100
Portd.6 = 1
Call Wait_and_get(0)
'R1 = 0
Return
'/////////////////Funktion zum RC5 empfangen und warten\\\\\\\\\\\\\\\
Sub Wait_and_get(byval Ms As Byte)
Getrc5(ir_address , Ir_command) 'Empfangen
'Wenn was empfangen dann reagieren
If Ir_address <> 255 Then
Ir_command = Ir_command And &B01111111 'Togglebit entfernen
'Hier die Codes an die Fernbedienung anpassen
Print "IR Befehl: " + Str(ir_command)
If Ir_command = 255 Then 'wenn nichts emfangen wird,
Ir_command = Last_ir_command 'dann akt. Programm weiter
Else 'ausführen
If Ir_command = 17 Then Gosub Programm1
If Ir_command = 18 Then Gosub Programm2
If Ir_command = 19 Then Gosub Programm3
If Ir_command = 20 Then Gosub Programmr
End If
End If
Waitms Ms 'warten
End Sub
'//////////Interupthandler Timer0 <Start>\\\\\\\\\\
Tim0_isr:
If Z = 0 Then 'Gewünschte Ausgabewerte an
Ri1 = R1 'Hilfsregister übergeben
Gi1 = G1
Bi1 = B1
Z = 255
End If
Z = Z - 1
'PWM Kanäle
'RGB LEDs
If Ri1 > 0 Then
Portd.6 = 0
Else
Portd.6 = 1
End If
Ri1 = Ri1 - 1
If Ri1 = 255 Then Ri1 = 0
If Gi1 > 0 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
Gi1 = Gi1 - 1
If Gi1 = 255 Then Gi1 = 0
If Bi1 > 0 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
Bi1 = Bi1 - 1
If Bi1 = 255 Then Bi1 = 0
Return
'//////////Interupthandler Timer0 <Ende>\\\\\\\\\\
Ich wäre euch sehr dankbar für eure Hilfe da ich mittlerweile echt dran verzweifel ](*,)
1. Die Programme sollen solange ausgeführt werden bis der Befehl für ein anderes erfolg. (Siehe Wait_and_get Subroutine) Leider funktioniert das mit dem last_ir_command so nicht, warum weiß ich leider nicht.
2. "Programmr" soll nur die rote Led dauerhaft anschalten. (Portd.6)
Problem ist das der Port nicht einfach geschaltet werden kann, da der Timer0 für die RGB PWM ja im Hintergrund läuft.
Hier der Code:
$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 40
$crystal = 16000000
$baud = 9600
Waitms 50 'Einschwingzeit
'//////////Ports Konfigurieren\\\\\\\\\\
Config Porta = Output 'M1
Config Portc = Output 'M2
Config Portd.6 = Output 'RGB-Rot
Config Portd.3 = Input 'TSOP
Porta.4 = 1 'Enable1 active = low
Portc.4 = 1
Enable1 Alias Porta.4
Enable2 Alias Portc.4
Portd.6 = 1 'RGB Led ausschalten
Portc.7 = 1
Portc.6 = 1
'//////////Timer konfigurieren, Vorteiler auf 1\\\\\\\\\\
Config Timer0 = Timer , Prescale = 1
'//////////RC5 konfigurieren mit Timer 2\\\\\\\\\\
Config Rc5 = Pind.3 , Timer = 2
'/////////Sub Deklarieren\\\\\\\\\\\\\
Declare Sub Wait_and_get(byval Ms As Byte)
'//////////Definiere den Interrupthandler\\\\\\\\\\
On Ovf0 Tim0_isr
Enable Interrupts
Enable Timer0 'Timer einschalten
Dim R1 As Byte ' In diese Variablen muss man
Dim G1 As Byte ' im Hauptprogram die gewünschten
Dim B1 As Byte ' Ausgabewerte laden
Dim Z As Word 'Zähler
Dim Ri1 As Byte 'Hilfsregister
Dim Gi1 As Byte
Dim Bi1 As Byte
'//////////Variablen für Hauptprogramm\\\\\\\\\\
Dim A As Byte 'Schleifenvariable RGBs
Z = 0
G1 = 0
R1 = 0
B1 = 0
Dim I As Byte 'Schleifenvariable Lauflicht
Dim I2 As Byte 'Schleifenvariable Lauflicht
Dim I3 As Byte 'Schleifenvariable Lauflicht
Dim Freilauf As Byte
Dim Ir_address As Byte
Dim Ir_command As Byte
Dim Last_ir_command As Byte
Last_ir_command = 0
Dim Programm As Byte 'Programmauswahl
Programm = 0 'Erst nix machen
'EEPROM Variablen
'Dim R_save As Eram Byte
'Dim G_save As Eram Byte
'Dim B_save As Eram Byte
Wait 1
'//////////Einstellungen\\\\\\\\\\
Freilauf = 20 'Lauflicht Freilaufzeit
'Normaldurchlauf = 2 'Anzahl der Standarddurchläufe
'//////////Hauptprogramm <Start>\\\\\\\\\\
Waitms 200
Print "Starte Hauptprogramm"
Do
Call Wait_and_get(1) 'bisschen Däumchen drehen und warten bis was gedrückt wird ;)
Loop
'//////////Hauptprogramm <Ende>\\\\\\\\\\
'Programm1: RGB LEDs
Programm1:
'Rot
For A = 0 To 254
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
R1 = R1 - 1
Waitms 1
Next
'Grün
For A = 0 To 254
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
Waitms 1
Next
'Blau
For A = 0 To 254
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
Waitms 1
Next
'Blau/Grün
For A = 0 To 254
B1 = B1 + 1
G1 = G1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
G1 = G1 - 1
Waitms 1
Next
'Blau/Rot
For A = 0 To 254
B1 = B1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
B1 = B1 - 1
R1 = R1 - 1
Waitms 1
Next
'Grün/Rot
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
Waitms 1
Next
'Grün/Rot/Blau
For A = 0 To 254
G1 = G1 + 1
R1 = R1 + 1
B1 = B1 + 1
Waitms 1
Next
Waitms 10
For A = 0 To 254
G1 = G1 - 1
R1 = R1 - 1
B1 = B1 - 1
Waitms 1
Next
Return
'Programm2: Lauflicht
Programm2:
For I = 0 To 15
Porta = I
Enable1 = 0
Waitms Freilauf
Enable1 = 1
Next I
For I = 0 To 11
Portc = I
Enable2 = 0
Waitms Freilauf
Enable2 = 1
Next I
Call Wait_and_get(0)
Return
'Programm3: Lauflicht2
Programm3:
For I = 0 To 15
Porta = I
Enable1 = 0
Waitms 10
Enable1 = 1
Next I
For I = 0 To 11
Portc = I
Enable2 = 0
Waitms 10
Enable2 = 1
Next I
Call Wait_and_get(0)
Return
Programmr:
'R1 = 255
Disable Timer1
Portd.6 = 0
Waitms 100
Portd.6 = 1
Call Wait_and_get(0)
'R1 = 0
Return
'/////////////////Funktion zum RC5 empfangen und warten\\\\\\\\\\\\\\\
Sub Wait_and_get(byval Ms As Byte)
Getrc5(ir_address , Ir_command) 'Empfangen
'Wenn was empfangen dann reagieren
If Ir_address <> 255 Then
Ir_command = Ir_command And &B01111111 'Togglebit entfernen
'Hier die Codes an die Fernbedienung anpassen
Print "IR Befehl: " + Str(ir_command)
If Ir_command = 255 Then 'wenn nichts emfangen wird,
Ir_command = Last_ir_command 'dann akt. Programm weiter
Else 'ausführen
If Ir_command = 17 Then Gosub Programm1
If Ir_command = 18 Then Gosub Programm2
If Ir_command = 19 Then Gosub Programm3
If Ir_command = 20 Then Gosub Programmr
End If
End If
Waitms Ms 'warten
End Sub
'//////////Interupthandler Timer0 <Start>\\\\\\\\\\
Tim0_isr:
If Z = 0 Then 'Gewünschte Ausgabewerte an
Ri1 = R1 'Hilfsregister übergeben
Gi1 = G1
Bi1 = B1
Z = 255
End If
Z = Z - 1
'PWM Kanäle
'RGB LEDs
If Ri1 > 0 Then
Portd.6 = 0
Else
Portd.6 = 1
End If
Ri1 = Ri1 - 1
If Ri1 = 255 Then Ri1 = 0
If Gi1 > 0 Then
Portc.7 = 0
Else
Portc.7 = 1
End If
Gi1 = Gi1 - 1
If Gi1 = 255 Then Gi1 = 0
If Bi1 > 0 Then
Portc.6 = 0
Else
Portc.6 = 1
End If
Bi1 = Bi1 - 1
If Bi1 = 255 Then Bi1 = 0
Return
'//////////Interupthandler Timer0 <Ende>\\\\\\\\\\
Ich wäre euch sehr dankbar für eure Hilfe da ich mittlerweile echt dran verzweifel ](*,)