Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwischen 2 Verschiedenen Programmen umschalten
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
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.
danke für die Antwort!
und wie macht man das Code mäßig?
;)
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 :)
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, 10: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
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...
habe ich gerade ausprobiert.
jetzt macht er immer code2.
lässt sich also nicht umschalten. :(
Warum?
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 ;)
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, 11: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.
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, 18: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.