PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Case Probleme mit Mega 16



MasterMX
05.01.2010, 19: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

Gento
05.01.2010, 20:14
Sub's springt man nicht mit Gosub an.

Gento

PicNick
05.01.2010, 20:15
Weiss nicht. Eins ist aber auf jeden Fall gefährlich:
Deine Sub werken ziemlich lange, d.h. du drückst die Taste ziemlich sicher gerade dann, wenn er in der Sub ist.
Raufzählen tut er aber trotzdem ( weil interrupt)
d.h. er kann 3 überschreiten, ohne dass du es merkst, also wird T nicht auf 1 gesetzt und es spielt sich nix mehr ab.

Besser auf prog 3 zu verzichten, und zu schreiben:


Int0set:
if t < 3 then
T = T + 1
else
T = 1
endif
''''''''''' Waitms 50 '(in einer Interrupt-Routine ist das "pfui" )
Return

MasterMX
05.01.2010, 22:06
Hi,

Danke, das funktioniert.

Nur leider habe ich ein Problem mit dem Taster, manchmal überspringt er einen oder mehrer Cases. Irgendwie ist der nicht entprellt, irgendwo habe ich von einem Keramik Kondi Parallel zum Taster gelesen. Irgendwo anders von einem Tiefpassfilter, darauf habe ich aber nicht wirklich Lust.
Oder kann man auh den Int1 debouncen ? Mit Pins geht das ja aber Int1 habe ich nicht gefunden.

Grüße Jakob

PicNick
06.01.2010, 08:41
Geht genauso. Zu Beginn des Interrupts checkt man einfach, ob der INT1 -Pin immer noch oben (oder unten) ist. Wenn nicht, ignoriert man den restlichern Interrupt. Reicht im Allgemeinen.