PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Loop unterbrechen



bomberman_z
02.11.2008, 19:00
Hallo alle zusammen!
Ich hab jetzt endlich mein erstes Projekt (fast) fertig, selbst zusammen gelötet und programmiert!
Es ist eine RGB Led an einem Attiny2313.
Naja ich hab mir jetzt folgendes gedacht nachdem ich ein Taster eingelötet habe. Und zwar möchte ich mit dem Taster verschiedene Modi durchgehen.
Das klappt solang ganz gut bis mein Loop kommt, der die RGB komplett komplett durchfaden soll.
Die ersten 6 Modi sind normale/zusammengesetzte Farben.
Wie schaff ich es jetzt, dass der wenn der in dem Loop ist der alle Farben druchfaded jeden Moment abfragt, ob die Taste gedrückt wurde und dann in den nächsten Modi (hier: alle LED's aus) sprint???

Mein bisheriger Code:


$regfile = "attiny2313.dat"
$crystal = 8000000
$baud = 9600

Dim R As Byte
Dim G As Byte
Dim B As Byte
Dim Pwmwert As Byte
Dim Modus As Integer
Declare Sub Ledcalling

Config Portd.6 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Pind.4 = Input
Portd.4 = 1

Const On = 1
Const Off = 0

Config Timer0 = Timer , Prescale = 1

Start Timer0

On Timer0 Pwmroutine
Enable Timer0
Enable Interrupts

Led1 Alias Portd.6
Led2 Alias Portb.1
Led3 Alias Portb.0

Modus = 1

Do

Debounce Pind.4 , 0 , On_taster1 , Sub

Loop

On_taster1:

If Modus = 8 Then
Modus = 0
End If

If Modus = 0 Then
R = 0
G = 0
B = 0
End If


If Modus = 1 Then
R = 255
G = 0
B = 0
End If

If Modus = 2 Then
R = 0
G = 255
B = 0
End If

If Modus = 3 Then
R = 0
G = 0
B = 255
End If

If Modus = 4 Then
R = 255
G = 255
B = 0
End If

If Modus = 5 Then
R = 255
G = 0
B = 255
End If

If Modus = 6 Then
R = 0
G = 255
B = 255
End If

If Modus = 7 Then
R = 255
G = 0
B = 0
Call Ledcalling
End If

Modus = Modus + 1

Return


Pwmroutine:
If R > Pwmwert Then
Led1 = 1
Else
Led1 = 0
End If

If G > Pwmwert Then
Led2 = 1
Else
Led2 = 0
End If

If B > Pwmwert Then
Led3 = 1
Else
Led3 = 0
End If

Incr Pwmwert
If Pwmwert > 255 Then Pwmwert = 0
Return

Sub Ledcalling

Do
Do
Waitms 8
G = G + 1
Loop Until G = 255
Waitms 2040
Do
Waitms 8
R = R - 1
Loop Until R = 0
Waitms 2040
Do
Waitms 8
B = B + 1
Loop Until B = 255
Waitms 2040
Do
Waitms 8
G = G - 1
Loop Until G = 0
Waitms 2040
Do
Waitms 8
R = R + 1
Loop Until R = 255
Waitms 2040
Do
Waitms 8
B = B - 1
Loop Until B = 0
Waitms 2040
Loop
End Sub

End


Ich hoffe mir kann einer von euch Profis helfen ;)

Viele Grüße

Furtion
02.11.2008, 20:20
Hi,

du kanst entweder die Taste auf ein Interrupt legen, der in eine Routine
springt wenn der Taster gedrückt wurde. Oder du legst in jede Do...Loop
eine Abfrage, die dann aus der Do...Loop springt.
Also: If Taster = 0 then Exit Do

bomberman_z
02.11.2008, 21:29
Ah das "Exit Do" hab ich gesucht.
Also könnt ich im Prinzip in jedem Do..Loop abfragen ob der Taster gedrückt ist und wenn ja dann springt der aus dem loop.
Ich probiers aus und berichte dann obs geklappt hat.
Vielen dank für die Hilfe.