
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
wenn ich das mit goto und gosub richtig verstanden habe, dann ist goto eine unbedingte Sprunganweisung ohne RĂŒckkehr nach beendigung des angesprungenen Unterprogramms. Gosub ist ein Sprungroutine, die durch return beendet wird. Korrigiert mich bitte falls ich das falsch auffasse. Von daher ist kĂŒrzer also nicht besser. Ich habe mal weiter getipselt: Beim Einschalten werden beide Tasten auf "offen" gerpĂŒft. Wenn eine Taste geschlossen ist, blinken alle LEDs. Und das so lange, bis der Kontakt offen ist. Dann startet das Hauptprogramm. Funktion ist nun: mit BetĂ€tigen einer Taste werden die beiden Ă€uersten LEDs ein wenig eingeschaltet (Orientierung). Je nachdem, welche Taste betĂ€tigt wird, wird der ZĂ€hler eins erhöht oder erniedrigt. Nach einer Verzögerung verlischt die Anzeige und wartet auf neue Eingabe. Maximale ZĂ€hlerzahl ist 7 - also 8 LEDs. Wenn es so funktioniert muss als nĂ€chstens ein PWM integriert werden. Dazu umĂŒssen aus den Werten der Variable a Ansteuerwerte gebildet und der PWM damit angesteuert werden. Aber Eins nach dem Anderen. option openmini RunOnError = on ' bei Fehler Programm neu starten define seriell port [1] ' serielle Schnittstelle define Led1 port [2] define Led2 port [4] define Led3 port [5] define Led4 port [6] define Led5 port [9] ' Die Open-Mini besitzt wie die Open-Micro define Led6 port [10] ' den PORTA und zusaetzlich den PORTB. define Led7 port [11] define Led8 port [12] define Taste1 port [13] ' Taste höher define Taste2 port [14] ' Taste niedriger define PWM port DA[15] ' PWM-Ausgang pwm = 128 define blank port [16] ' zum halbhell/dunkelsteuern der Ă€uĂersten LEDs ' Die Pinbelegung der ' Open-Mini (QY4) ' _____ _____ ' | \__/ | ' [ VDD GND ] VDD = 4.6 bis 5.5 Volt ' | | ' blank [ PTB7 PTB0 ] LED 5 ' | | ' PWM [ PTB6 PTB1 ] LED 6 ' | | ' LED 4 [ PTA5 PTA0 ] seriell ' | | ' LED 3 [ PTA4 PTA1 ] LED 1 ' | | ' Taste1 [ PTB5 PTB2 ] LED 7 ' | | ' Taste2 [ PTB4 PTB3 ] LED 8 ' | | ' LED 2 [ PTA3 PTA2 ] host/run ' |______________| ' define a Byte[1] a = 0 define allleds_a byteport[1] define allleds_b byteport[2] allleds_a = 0 ' alle LEDs an Ports A aus allleds_b = 0 ' alle LEDs an Ports B aus #init if Taste1 = on then goto error ' Abfrage der Taste rauf auf Kontakt if Taste2 = on then goto error ' Abfrage der Taste runter auf Kontakt #start if Taste1 = (not Taste1) then gosub rauf ' Taste rauf erhöht ZĂ€hler um 1 if Taste2 = (not Taste2) then gosub runter ' Taste runter verringert ZĂ€hler um 1 pause 100 ' 2 Sekunden Pause vor dem Abschalten der LEDs allleds_a = 0 allleds_b = 0 blank = 0 goto start ' RĂŒcksprung zum Start #rauf blank = on ' schaltet die beiden Ă€uĂersten LEDs auf halbe Helligkeit pause 2 ' Schalterentprellung if a = 7 then Return ' Wenn der ZĂ€hler = 7 ist wird das Unterprogramm verlassen a = a + 1 ' Erhöhung des ZĂ€hlers um 1 gosub anzeige ' springt in das Unterprogramm Anzeige return ' RĂŒcksprung zum Hauptprogramm Start #runter blank = on ' schaltet die beiden Ă€uĂersten LEDs auf halbe Helligkeit pause 2 ' Schalterentprellung if a = 0 then Return ' Wenn der ZĂ€hler = 0 ist wird das Unterprogramm verlassen a = a - 1 ' Verringerung des ZĂ€hlers um 1 gosub anzeige ' springt in das Unterprogramm Anzeige return ' RĂŒcksprung zum Hauptprogramm Start #anzeige if a = 1 then led1 = on if a = 2 then led2 = on if a = 3 then led3 = on if a = 4 then led4 = on if a = 5 then led5 = on if a = 6 then led6 = on if a = 7 then led7 = on if a = 8 then led8 = on pause 50 ' 1 Sekunde Pause vor dem RĂŒcksprung return ' RĂŒcksprung in das Unterprogramm rauf oder runter #error allleds_a = on allleds_b = on pause 12 ' 1/4 Sekunde Pause allleds_a = 0 allleds_b = 0 pause 12 ' 1/4 Sekunde Pause vor dem RĂŒcksprung goto init > Hallo, > kĂŒrzer so: > > #start > > > > if Taste1 = (not Taste1) then gosub rauf ' Taste rauf erhöht ZĂ€hler um 1 > > if Taste2 = (not Taste2) then gosub runter ' Taste runter verringert ZĂ€hler um 1 > > goto start > > > > #rauf > > pause 2 ' Schalterentprellung > > if a = 8 then Return ' Wenn der ZĂ€hler = 8 ist wird das Unterprogramm verlassen > > a = a + 1 > > goto anzeige ' springt in das Unterprogramm Anzeige > > > > > #runter > > pause 2 ' Schalterentprellung > > if a = 0 then Return ' Wenn der ZĂ€hler = 0 ist wird das Unterprogramm verlassen > > a = a - 1 > > goto anzeige > > > > > #anzeige > > if a = 1 then led1 = on > > if a = 2 then led2 = on > > if a = 3 then led3 = on > > if a = 4 then led4 = on > > if a = 5 then led5 = on > > if a = 6 then led6 = on > > if a = 7 then led7 = on > > if a = 8 then led8 = on > > return ' Springt hinter das aufrufende Gosub > Gruss, GeKĂŒ > ********* > > Hoppla, das ging ja schnell. Vielen Dank Euch beiden. > > > > Also ich habe das mal kurz eingebaut und jetzt nur den Tiptastenteil noch mal eingefĂŒgt. Der Unterschied zwischen gosub und goto ist mir schon gelĂ€ufig. Bei dem wenigen gotos hĂ€tte es vermutlich aber auch funktioniert. Der RĂŒcksprung aus der #anzeige hingegen ist mit return elegant. > > > > Braucht das Hauptprogramm eine "NichtdrĂŒckfunktion" nicht? Also interpretiere ich das jetzt so - start -> if then rauf -> ist nicht eingetreten -> if then runter -> ist nicht eingetreten -> goto start -> alles von vorn. Richtig? > > > > Den ZĂ€hlerumfang habe ich auf die 8 vorhandenen LEDs begrenzt. Es sollen ja auch nur maximal 8 Schritte sein. > > Am Programmstart soll dann letztlich noch eine kurze ĂberprĂŒfung der beiden Tasten erfolgen, damit es nicht zu unkontrolliertem hochlaufen kommt. Das dĂŒrfte mit einer kleine Abfrage sicher keine Problem sein z.B. if Taste1 = on then gosub error . Und in der Unterroutine dann meinetwegen ein Blinken aller LEDs. > > Andreas > > > > p.s. ich schau öfter rein, falls jemand was dazu schreibt |
| Antwort schreiben |