MasterMX
05.01.2010, 20:12
Hi leute,
Ich hab da so meine Probleme mit Cases.
Ich möchte eine RGB Lampe über einen Taster in verschiedenen Programmen laufen lassen.
Dazu hab ich mir ein Taster an den Int1 vom mega 16 angeschlossen.
Wenn ich das Programm auf mein AVR brenne funktioniert alles:
$regfile = "m16def.dat"
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 1a
Config Portd.5 = Output
Config Int1 = Falling
Enable Interrupts
Enable Int1
On Int1 Int0set
Dim T As Word
Declare Sub Progr1
Declare Sub Progr2
Declare Sub Progr3
Declare Sub Progr4
Declare Sub Progr5
Declare Sub Progr6
Do
Select Case T
Case 1
Gosub Progr1
Case 2
Gosub Progr2
Case 3
Gosub Progr3
Case 4
Gosub Progr4
Case 5
Gosub Progr5
Case 6
Gosub Progr6
End Select
Loop
Int0set:
T = T + 1
Waitms 50
Return
Progr1:
Cls
Lcd "case 1"
Cursor Off
Waitms 10
Return
Progr2:
Cls
Lcd "case 2"
Cursor Off
Waitms 10
Return
Progr3:
Cls
Lcd "case 3"
Cursor Off
Waitms 10
Return
Progr4:
Cls
Lcd "case 4"
Cursor Off
Waitms 10
Return
Progr5:
Cls
Lcd "case 5"
Cursor Off
Waitms 10
Return
Progr6:
T = 1
Wenn ich das programm brenne funktioniert die erste SUB aber beim nächsten klick funktionierT nichts mehr:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 1a
Config Portd.5 = Output
Config Int1 = Falling
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer0 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Ddrb.3 = 1
Start Adc
Enable Interrupts
Enable Int1
Enable Timer2
Enable Timer0
On Int1 Int0set
Dim T As Word
Dim W As Word
Dim R As Word
Dim G As Word
Dim B As Word
Declare Sub Progr1
Declare Sub Progr2
Declare Sub Progr3
Cls
Lcd "Wait for INT1"
Do
Select Case T
Case 1
Gosub Progr1
Case 2
Gosub Progr2
Case 3
Gosub Progr3
End Select
Waitms 10
Loop
End
Int0set:
T = T + 1
Waitms 50
Return
Sub Progr1:
For R = 0 To 255 Step 1
W = Getadc(0) / 50
Ocr1a = R
Waitms W
Next
For R = 255 To 0 Step -1
W = Getadc(0) / 50
Ocr1a = R
Waitms W
Next
' Return
End Sub
Sub Progr2:
For G = 0 To 255 Step 1
W = Getadc(0) / 50
Ocr1b = G
Waitms W
Next
For G = 255 To 0 Step -1
W = Getadc(0) / 50
Ocr1b = G
Waitms W
Next
End Sub
Progr3:
T = 1
Return
wenn ich sub progr2 so schreibe :
Sub Progr2:
Cls
Lcd "case 2"
Cursor Off
Waitms 10
Return
end sub
gehts weider wie gewünscht.
Bin ich blind oder ist der atmel überfordert ?
Grüße Jakob
Ich hab da so meine Probleme mit Cases.
Ich möchte eine RGB Lampe über einen Taster in verschiedenen Programmen laufen lassen.
Dazu hab ich mir ein Taster an den Int1 vom mega 16 angeschlossen.
Wenn ich das Programm auf mein AVR brenne funktioniert alles:
$regfile = "m16def.dat"
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 1a
Config Portd.5 = Output
Config Int1 = Falling
Enable Interrupts
Enable Int1
On Int1 Int0set
Dim T As Word
Declare Sub Progr1
Declare Sub Progr2
Declare Sub Progr3
Declare Sub Progr4
Declare Sub Progr5
Declare Sub Progr6
Do
Select Case T
Case 1
Gosub Progr1
Case 2
Gosub Progr2
Case 3
Gosub Progr3
Case 4
Gosub Progr4
Case 5
Gosub Progr5
Case 6
Gosub Progr6
End Select
Loop
Int0set:
T = T + 1
Waitms 50
Return
Progr1:
Cls
Lcd "case 1"
Cursor Off
Waitms 10
Return
Progr2:
Cls
Lcd "case 2"
Cursor Off
Waitms 10
Return
Progr3:
Cls
Lcd "case 3"
Cursor Off
Waitms 10
Return
Progr4:
Cls
Lcd "case 4"
Cursor Off
Waitms 10
Return
Progr5:
Cls
Lcd "case 5"
Cursor Off
Waitms 10
Return
Progr6:
T = 1
Wenn ich das programm brenne funktioniert die erste SUB aber beim nächsten klick funktionierT nichts mehr:
$regfile = "m16def.dat"
$crystal = 1000000
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 1a
Config Portd.5 = Output
Config Int1 = Falling
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer0 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Ddrb.3 = 1
Start Adc
Enable Interrupts
Enable Int1
Enable Timer2
Enable Timer0
On Int1 Int0set
Dim T As Word
Dim W As Word
Dim R As Word
Dim G As Word
Dim B As Word
Declare Sub Progr1
Declare Sub Progr2
Declare Sub Progr3
Cls
Lcd "Wait for INT1"
Do
Select Case T
Case 1
Gosub Progr1
Case 2
Gosub Progr2
Case 3
Gosub Progr3
End Select
Waitms 10
Loop
End
Int0set:
T = T + 1
Waitms 50
Return
Sub Progr1:
For R = 0 To 255 Step 1
W = Getadc(0) / 50
Ocr1a = R
Waitms W
Next
For R = 255 To 0 Step -1
W = Getadc(0) / 50
Ocr1a = R
Waitms W
Next
' Return
End Sub
Sub Progr2:
For G = 0 To 255 Step 1
W = Getadc(0) / 50
Ocr1b = G
Waitms W
Next
For G = 255 To 0 Step -1
W = Getadc(0) / 50
Ocr1b = G
Waitms W
Next
End Sub
Progr3:
T = 1
Return
wenn ich sub progr2 so schreibe :
Sub Progr2:
Cls
Lcd "case 2"
Cursor Off
Waitms 10
Return
end sub
gehts weider wie gewünscht.
Bin ich blind oder ist der atmel überfordert ?
Grüße Jakob