PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwischen 2 Verschiedenen Programmen umschalten



Dj_Beat
09.11.2007, 05:46
Hallo!
ich habe noch ein Problem.
und zwar soll in der Schaltung ein Schalter eingebaut werden, mit dem man 2 Verschiedene Programme umschalten kann.
ich habe mir erst sowas gedacht:

Config Pind.0 = Input
Umschalter Alias Pind.0

If Umschalter =1 then
Do
'programm für Gray-code Geber
waitms 500
loop
end if
If Umschalter =0 then
Do
'programm für BCD
Waitms 500
Loop
End if
and

Es funktioniert so leider nicht.
µC ist ein Mega16 mit lcd dran.

Kann mir einer sagen, was ich falsch gemacht habe?
Danke

Jaecko
09.11.2007, 05:51
Problem an der Sache ist, dass das Programm, wenns mal in einer der Do-Loop-Schleifen ist, dort auch nicht mehr rauskommt.
Wenn der Umschalter 1 ist, wird das Programm für den BCD-Code gestartet. Wird der Umschalter auf 0 gesetzt, wird der BCD-Teil weiter ausgeführt, da er ja die Zeile "If Umschalter = 0..." nie erreicht.

Abhilfe wäre z.B. wenn du vor "If Umschalter = 1..." eine Sprungmarke machst (z.B. Restart: ) und in jeder Do-Loop schleife nen Vergleich; Wenn sich der Umschalter ändert, dann GOTO Restart.

Evtl gibts ja noch ne bessere Möglichkeit, aber so würds ich grad machen.

Dj_Beat
09.11.2007, 05:59
danke für die Antwort!
und wie macht man das Code mäßig?
;)

Skragan
09.11.2007, 08:03
Du könntest bei den jeweiligen LOOP-Befehlen ein UNTIL einfügen, also bei der oberen Schleife LOOP UNTIL UMSCHALTER=0 und bei der unteren Schleife =1, das sollte auch funktionieren. Alternativ fragst Du einfach den Zustand von Umschalter innerhalb beider Schleifen ab (IF Umschalter=1 goto label (in Schleife2). Oder Du baust nur eine Schleife und machst nur eine IF THEN ELSE Abfrage, in welcher Du die beiden Programmteile unterbringst:

do
IF umschalter=1 then
code1
else
code2
endif
loop

Viele Wege führen nach Rom :)

Dj_Beat
09.11.2007, 08:46
Danke für die tolle idee.
Der Compiler will aber nicht.
Was ist bei mir falsch?





Initlcd

Cls
Cursor Off

Dim Gray As Word
Dim Lobyte As Word
Dim Hibyte As Word
Config Pind.4 = Input
Umschalter Alias Pind.4
Dim Zahl As Byte
Dim Zahl1 As Byte
Dim Zahl2 As Byte
Dim Code1 As Word
Dim Code2 As Word

Do
IF umschalter=1 then
Code1
else
Code2
End If
Loop

Code1
Do

Locate 1 , 1
Lcd "P.G.Tester(GRAY)"
Locate 4 , 1
Lcd "Ausbildung EGS05"

Locate 2 , 5
Lcd "*-"
Locate 2 , 10
Lcd "-*"
Locate 3 , 3
Lcd "------------"


Do

Lobyte = Pina
Hibyte = Pinc
Hibyte = Hibyte And &B0000000000001111

Rotate Hibyte , Left , 8

Gray = Lobyte + Hibyte

Gray = Gray2bin(gray)



Locate 2 , 7
Lcd Gray

Waitms 200
Locate 2 , 7
Lcd " "




Code2

Do

Locate 1 , 1
Lcd "P.G.Tester(BCD)"
Locate 4 , 1
Lcd "Ausbildung EGS05"


Locate 2 , 5
Lcd "*-"
Locate 2 , 10
Lcd "-*"
Locate 3 , 3
Lcd "------------"

Do

Zahl = Pina
Zahl = Zahl And &B00001111
Locate 2 , 9
Lcd Zahl

Zahl1 = Pind
Zahl1 = Zahl1 And &B00001111
Locate 2 , 8
Lcd Zahl1

Zahl2 = Pinc
Zahl2 = Zahl2 And &B00001111
Locate 2 , 7
Lcd Zahl2

Waitms 150
Locate 2 , 7
Lcd " -"

Loop
Loop
End

radebeul
09.11.2007, 09:01
Was sollen pina, pinc, pind ?
Ansonsten kannst Du es wie folgt machen:

Initlcd

Cls
Cursor Off

Dim Gray As Word
Dim Lobyte As Word
Dim Hibyte As Word
Config Pind.4 = Input
Umschalter Alias Pind.4
Dim Zahl As Byte
Dim Zahl1 As Byte
Dim Zahl2 As Byte
Dim Code1 As Word
Dim Code2 As Word

Do
If Umschalter = 1 Then
Gosub Code1
Else
Gosub Code2
End If

Loop

Code1:
Locate 1 , 1
Lcd "P.G.Tester(GRAY)"
Locate 4 , 1
Lcd "Ausbildung EGS05"

Locate 2 , 5
Lcd "*-"
Locate 2 , 10
Lcd "-*"
Locate 3 , 3
Lcd "------------"

Lobyte = Pina
Hibyte = Pinc
Hibyte = Hibyte And &B0000000000001111

Rotate Hibyte , Left , 8

Gray = Lobyte + Hibyte

Gray = Gray2bin(gray)



Locate 2 , 7
Lcd Gray

Waitms 200
Locate 2 , 7
Lcd " "

Return


Code2:

Locate 1 , 1
Lcd "P.G.Tester(BCD)"
Locate 4 , 1
Lcd "Ausbildung EGS05"


Locate 2 , 5
Lcd "*-"
Locate 2 , 10
Lcd "-*"
Locate 3 , 3
Lcd "------------"

Zahl = Pina
Zahl = Zahl And &B00001111
Locate 2 , 9
Lcd Zahl

Zahl1 = Pind
Zahl1 = Zahl1 And &B00001111
Locate 2 , 8
Lcd Zahl1

Zahl2 = Pinc
Zahl2 = Zahl2 And &B00001111
Locate 2 , 7
Lcd Zahl2

Waitms 150
Locate 2 , 7
Lcd " -"

Return


End

Skragan
09.11.2007, 09:03
Nein, Deine Schleifen sind total verquer:

Der Programmteil muss ohne do / loop in die If-then Schleife. Habe gerad enicht mehr Zeit, mache ich nacher...

Dj_Beat
09.11.2007, 09:07
habe ich gerade ausprobiert.
jetzt macht er immer code2.
lässt sich also nicht umschalten. :(
Warum?

Dj_Beat
09.11.2007, 09:09
Nein, Deine Schleifen sind total verquer:

Der Programmteil muss ohne do / loop in die If-then Schleife. Habe gerad enicht mehr Zeit, mache ich nacher...
ich habe noch eine Stunde Zeit, dann kommt mein Meister ;)

Skragan
09.11.2007, 10:26
so wie radebeul es geschrieben hat, muss es funktionieren. Aber ehrlich gesagt blicke ich durch den Rest des Codes nicht durch :)

radebeul
09.11.2007, 10:29
Wie hast Du den Umschalter angeschlossen?
Ich hoffe, Du hast ihn wie einen Taster gegen GND geschaltet. Dann muss es funktionieren, weil gedrückter Taster (Umschalter) ergibt 0 (Sprung nach code2), nicht gedrückter Taster ergibt 1 (Sprung nach code1).
Wenn er nur zur sub code2 verzweigt, dann sieht Dein Eingang Pind.4 keine 1, sondern nur 0.

Dj_Beat
09.11.2007, 12:48
ich danke euch sehr!
habe es so gelöst:



$regfile = "m16def.dat"
$crystal = 1000000

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Initlcd

Cls
Cursor Off

Dim Gray As Word
Dim Lobyte As Word
Dim Hibyte As Word
Config Pind.4 = Input
Umschalter Alias Pind.4
Config Pind.5 = Input
Pegel Alias Pind.5
Dim Zahl As Byte
Dim Zahl1 As Byte
Dim Zahl2 As Byte
Dim Code1 As Byte
Dim Code2 As Byte
Dim Programm As Byte
Dim Testen As Byte
Dim Umschalter As Word

Testen:
Do
If Pegel = 1 Then
Gosub Programm
Else
Locate 1 , 1
Lcd "PegelGeberTester"

Locate 3 , 1
Lcd "!!!KEIN GEBER!!!"
Waitms 600
Cls
Wait 1


End If
Loop


Programm:
Code1:

Do
Locate 1 , 1
Lcd "P.G.Tester(GRAY)"
Locate 4 , 1
Lcd "Ausbildung EGS05"

Locate 2 , 5
Lcd "*-"
Locate 2 , 10
Lcd "-*"
Locate 3 , 3
Lcd "------------"


Do

Lobyte = Pina
Hibyte = Pinc
Hibyte = Hibyte And &B0000000000001111

Rotate Hibyte , Left , 8

Gray = Lobyte + Hibyte

Gray = Gray2bin(gray)



Locate 2 , 7
Lcd Gray

Waitms 250
Locate 2 , 7
Lcd " "
If Umschalter = 1 Then
Gosub Code2
Else
Loop




Code2:


Do
Locate 1 , 1
Lcd "P.G.Tester (BCD)"
Locate 4 , 1
Lcd "Ausbildung EGS05"


Locate 2 , 5
Lcd "*-"
Locate 2 , 10
Lcd "-*"
Locate 3 , 3
Lcd "------------"


Do

Zahl = Pina
Zahl = Zahl And &B00001111
Locate 2 , 9
Lcd Zahl

Zahl1 = Pind
Zahl1 = Zahl1 And &B00001111
Locate 2 , 8
Lcd Zahl1

Zahl2 = Pinc
Zahl2 = Zahl2 And &B00001111
Locate 2 , 7
Lcd Zahl2

Waitms 250
Locate 2 , 7
Lcd " -"




If Umschalter = 0 Then
Gosub Code1
Else
Loop
End If
End If
Loop

Loop
End

Sauerbruch
10.11.2007, 17:01
...ich mal wieder! :-b

Und - hat´s funktioniert?

´n paar kleine Tips:

Wenn Du "Umschalter alias Pind.4" schreibst, brauchst Du "Dim Umschalter as..." nicht mehr. Dem Namen "Umschalter" ist dann automatisch das Bit Pind.4 zugeordnet. Wenn Du Umschalter zusätzlich als Word dimensionierst, verschenkst Du volle 15 Bits (1 Word = 2 Byte = 16 Bit!), die ziemlich umsonst freigehalten werden.

Gleiches gilt für Code1, Code2, Programm und Testen: Solche "Labels" muss man nicht dimensionieren. Du kannst sie einfach so in den Code reinschreiben.






If Umschalter = 0 Then
Gosub Code1
Else
Loop
End If
End If

- hat der Compiler da nicht gemeckert? Normalerweise muss für jedes "if" genau (!) ein "End if" kommen. Miene Bascom-Version motzt zumindestens immer sofort, wenn das Verhätnis nicht genau 1:1 ist.
Wenn Du für beide "if"-Fälle nur genau einen befehl hast, kann das auch in eine Zeile, dann barucht´s gar kein "end if":

If Umschalter = 0 then gosub Code1 else loop

Gruß & Co.,

Daniel