Also pack ich einfach mal in jede ISR und jede Call ein RET(I) rein?
Ich hab grad mein Programm etwas verständlicher geschrieben (kommentiert)
Vielleicht versteht man es jetzt
EDITCode:'#################################### '# Projekt IR gesteuertes LED Licht # '# Copyright 2007 by Stefan Reible # '#################################### $regfile = "m16def.dat" $framesize = 32 $swstack = 32 $hwstack = 40 $crystal = 16000000 $baud = 9600 Waitms 50 'Einschwingzeit '//////////Ports Konfigurieren\\\\\\\\\\ Config Porta = Output 'Multiplexer1 Config Portc = Output 'Multiplexer2 Config Portd.4 = Output 'RGB-Blau Config Portd.5 = Output 'RGB-Grüen 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.4 = 1 'RGB Led ausschalten Portd.5 = 1 Portd.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 gewnschten Dim B1 As Byte ' Ausgabewerte laden Dim Z As Word 'Zaehler Dim Ri1 As Byte 'Hilfsregister Dim Gi1 As Byte Dim Bi1 As Byte '//////////Variablen fr Hauptprogramm\\\\\\\\\\ Dim A As Byte 'Schleifenvariable RGBs Z = 0 G1 = 0 R1 = 0 B1 = 0 Dim I As Byte 'Schleifenvariable Lauflicht Dim Ir_address As Byte 'Geraet Dim Ir_command As Byte 'Befehl Dim Freilauf As Integer '//////////Einstellungen\\\\\\\\\\ Freilauf = 10 'Lauflicht Freilaufzeit '//////////Hauptprogramm <Start>\\\\\\\\\\ Waitms 200 Print "Starte Hauptprogramm" Standby: R1 = 0 G1 = 0 B1 = 0 Enable1 = 1 Enable2 = 1 Do Call Wait_and_get(5) 'Daumchen drehen und auf Befehl warten Loop '//////////Hauptprogramm <Ende>\\\\\\\\\\ '//////////Programme <Start>\\\\\\\\\\ 'Programm1: RGB LEDs Programm1: Enable1 = 1 Enable2 = 1 Do 'Rot For A = 0 To 254 Incr R1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr R1 Waitms 1 Next Call Wait_and_get(0) 'Grn For A = 0 To 254 Incr G1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr G1 Waitms 1 Next Call Wait_and_get(0) 'Blau For A = 0 To 254 Incr B1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr B1 Waitms 1 Next Call Wait_and_get(0) 'Blau/Grn For A = 0 To 254 Incr B1 Incr G1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr B1 Decr G1 Waitms 1 Next Call Wait_and_get(0) 'Blau/Rot For A = 0 To 254 Incr B1 Incr R1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr B1 Decr R1 Waitms 1 Next Call Wait_and_get(0) 'Grn/Rot For A = 0 To 254 Incr G1 Incr R1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr G1 Decr R1 Waitms 1 Next Call Wait_and_get(0) 'Grn/Rot/Blau For A = 0 To 254 Incr G1 Incr R1 Incr B1 Waitms 1 Next Waitms 10 For A = 0 To 254 Decr G1 Decr R1 Decr B1 Waitms 1 Next Loop 'Ende Rgb Fadern 'Programm2: Lauflicht Programm2: R1 = 0 G1 = 0 B1 = 0 Enable1 = 1 Enable2 = 1 Do For I = 0 To 15 Porta = I Call Wait_and_get(0) Enable1 = 0 Waitms Freilauf Enable1 = 1 Next I For I = 0 To 11 Portc = I Call Wait_and_get(0) Enable2 = 0 Waitms Freilauf Enable2 = 1 Next I Loop 'ende des 2. programms 'Programm3: Lauflicht2 Programm3: R1 = 0 G1 = 0 B1 = 0 Enable1 = 1 Enable2 = 1 Do For I = 0 To 15 Porta = I Enable1 = 0 Call Wait_and_get(0) Enable1 = 1 Next I For I = 0 To 11 Portc = I Enable2 = 0 Call Wait_and_get(0) Enable2 = 1 Next I Loop 'ende lauflicht 2 'Dauer Dauer: Do Enable1 = 0 For I = 0 To 15 Porta = I Waitus 1 Next I Enable1 = 1 Enable2 = 0 For I = 0 To 12 Portc = I Waitus 1 Next I Enable2 = 1 'Call Wait_and_get(0) Loop 'Dauer '//////////Standlicht <Start>\\\\\\\\\\ Programm_rot: R1 = 255 G1 = 0 B1 = 0 Enable1 = 1 Enable2 = 1 Do Call Wait_and_get(5) Loop Programm_gruen: R1 = 0 G1 = 0 B1 = 255 Enable1 = 1 Enable2 = 1 Do Call Wait_and_get(5) Loop Programm_gelb: R1 = 255 G1 = 0 B1 = 255 Enable1 = 1 Enable2 = 1 Do Call Wait_and_get(5) Loop Programm_blau: R1 = 0 G1 = 255 B1 = 0 Enable1 = 1 Enable2 = 1 Do Call Wait_and_get(5) Loop Programm_pink: R1 = 255 G1 = 255 B1 = 0 Enable1 = 1 Enable2 = 1 Do Call Wait_and_get(5) Loop '//////////Standlicht <Ende>\\\\\\\\\\ '/////////////////Funktion zum RC5 empfangen und warten <Start>\\\\\\\\\\\\\\\ 'Sub zum empfangen und warten Sub Wait_and_get(byval Ms As Integer) Getrc5(ir_address , Ir_command) 'Empfangen 'Wenn was empfangen dann reagieren If Ir_address = 0 Then Ir_command = Ir_command And &B01111111 'entfernt das togglebit If Ir_command <> 0 Then Print Ir_command 'IR befehl Printen If Ir_command = 17 Then Goto Programm1 'RGB Fadern If Ir_command = 18 Then Goto Programm2 If Ir_command = 19 Then Goto Programm3 If Ir_command = 37 Then Freilauf = Freilauf + 10 'Lauflicht langsamer If Ir_command = 36 And Freilauf > 9 Then Freilauf = Freilauf -10 'Lauflicht schneller If Ir_command = 38 Then Goto Programm_rot If Ir_command = 44 Then Goto Programm_gruen If Ir_command = 46 Then Goto Programm_gelb If Ir_command = 51 Then Goto Programm_blau If Ir_command = 47 Then Goto Programm_pink If Ir_command = 21 Then Goto Dauer If Ir_command = 32 Then Goto Standby End If Waitms Ms 'warten End Sub '/////////////////Funktion zum RC5 empfangen und warten <Ende>\\\\\\\\\\\\\\\ '//////////Interupthandler Timer0 <Start>\\\\\\\\\\ Tim0_isr: If Z = 0 Then 'Gewnschte Ausgabewerte an Ri1 = R1 'Hilfsregister bergeben Gi1 = G1 Bi1 = B1 Z = 255 End If Z = Z - 1 'PWM Kanaele 'RGB LEDs If Ri1 > 0 Then Portd.6 = 0 Else Portd.6 = 1 End If Decr Ri1 If Ri1 = 255 Then Ri1 = 0 If Gi1 > 0 Then Portd.5 = 0 Else Portd.5 = 1 End If Decr Gi1 If Gi1 = 255 Then Gi1 = 0 If Bi1 > 0 Then Portd.4 = 0 Else Portd.4 = 1 End If Decr Bi1 If Bi1 = 255 Then Bi1 = 0 Return '//////////Interupthandler Timer0 <Ende>\\\\\\\\\\
Aus der ISR geht ich nicht raus.
Nur aus der Funktion (mit Goto)






Zitieren


Lesezeichen