
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Nun habe ich etliche Stunden mit dem Testobjekt verbracht und immer noch funktioniert ein entscheidender Teil nicht. Das ist die Tastaturabfrage. Es ist so ziemlich egal, was ich da reinprogrammiere, den OM scheint es ĂŒberhaupt nicht zu interessieren. Dieser kleine Test funktioniert. Taste drĂŒcken = LED einschalten: #start LED1 = Taster1 goto start Damit ist also klar, dass der Port richtig definiert ist. Aber Zeilen wie : if Taste1 = on then goto rauf oder if not Taste1 then goto rauf oder if Taste1 = (not Taste1) then goto rauf oder WHILE Taste 'fĂŒhre die Schleife aus, solange Taste nicht gedrĂŒckt Led2=ON PAUSE 10 Led2=OFF PAUSE 10 WEND bewirken gar nichts. Es wird keinerlei Tastendruck erfaĂt. (Taster schaltet gegen plus und Widerstand liegt nach Masse) auch die komplexere Flankenabfrage scheitert offenbar an dieser if then Abfrage. Testweise habe ich den Bezeichner Taste1 nochmal durch eine Variable ersetzt und dann die Abfrage mit der Variable gemacht: h = Tasterauf if h = on then goto setz1 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke1 = 0 ' FlankenBit off setzen goto initend ' Reset Ein-Flanke (bei NichtbetĂ€tigung der Taste) #setz1 if Flanke1 = on then goto error ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) goto init Hier ist erstaunlicherweise einmalig die Tastenabfrage existent. Also ist bei Programstart die Taste gedrĂŒckt, wird offenbar diese Abfrage gemacht. Nach loslassen der Taste ist das aber vorbei, wobei ich vermute, dass das Programm dann an der nĂ€chsten Stelle einer Tastenabfrage hĂ€ngt. Ich habe mir verschiedene andere Projekte angeschaut, wie es dort gelöst ist. Aber nirgends konnte ich eine tatsĂ€chliche Vergleichbarkeit finden. Da wird anscheinend auch getrickst, weil es irgendwie nicht funktioniert (z.B. ĂŒber AD-Port). Was könnte denn mein Fehler in Denken sein? Ich sehe momentan eigentlich keinen Fehler - nur funktionieren tut es auch nicht. Zum Timer: Das Problem ist gelöst. Eine direkte Abfrage des Timer geht nicht. Das geht nur mit einer Addition zum momentanen Timerwert. for t = 0 to 5 ' ZĂ€hler fĂŒr 6 DurchlĂ€ufe ergibt zusammen 30 Sekunden x = timer ' setzt Timerzeit auf 0, Timer zĂ€hlt automatisch hoch y = timer ' setzt Ende-Timerzeit auf 0, Timer zĂ€hlt automatisch hoch #schleife led1 = on ' LED einschalten if timer = x + 5 then led2 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 10 then led3 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 15 then led4 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 20 then led5 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 25 then led6 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 30 then led7 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 35 then led8 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 40 then led1 = off ' LED ausschalten if timer = x + 40 then led2 = off ' LED ausschalten if timer = x + 40 then led3 = off ' LED ausschalten if timer = x + 40 then led4 = off ' LED ausschalten if timer = x + 40 then led5 = off ' LED ausschalten if timer = x + 40 then led6 = off ' LED ausschalten if timer = x + 40 then led7 = off ' LED ausschalten if timer = x + 40 then led8 = off ' LED ausschalten if timer = x + 50 then x = Timer ' 0,2 Sekunden vergangen dann Sprung zu start1 if timer = y + 250 then goto weiter ' prĂŒfen ob alle DurchlĂ€ufe absolviert sind goto schleife if t = 5 then goto start1 ' nach Ablauf der Schleifen RĂŒcksprung zum start1 next Das ergibt in diesem Fall ein immer wieder hochlaufende LED-Kette. Und es gibt noch einen HeimtĂŒcker. Die Definition define allleds_a byteport[1] ' Sammelfestlegung aller LEDs an Port a define allleds_b byteport[2] ' Sammelfestlegung aller LEDs an Port b ist nicht wie in der Bezeichnug steht eine Sammlung aller LEDs, sondern es sind alle Ports damit betroffen. Das heiĂt, dass auch die Taster- und PWM-Port mit angesteuert werden. Damit kriegt man unschöne Fehler rein. Der VollstĂ€ndigkeit halber der ganze Programmablauf: pullupa = 0 pullupb = 0 ClockDis = on ' --------------------------------------------------------------------------- RunOnErr = on ' bei Fehler Programm neu starten define PWM_Port port[1] ' 1. PWM Ausgang define spannung AD[2] ' Spannungskontrollport define Led1 port[4] define Led2 port[5] define Led3 port[6] define Led4 port[9] ' Die Open-Mini besitzt wie die Open-Micro define Led5 port[10] ' den PORTA und zusĂ€tzlich den PORTB. define Led6 port[11] define Led7 port[12] define Led8 port[13] define Tasterauf port[14] ' Taste höher define Tasterunter port[15] ' Taste niedriger define blank port[16] ' zum halbhell/dunkelsteuern der Ă€uĂersten LEDs define Bit81_88 byte[11]' byte 11 (statische Bits 81 bis 88) define Flanke1 Bit[81] ' Flankenbit Taste rauf define Flanke2 Bit[82] ' Flankenbit Taste runter define taste1 Bit[87] ' Tastenbit Taste rauf define taste2 Bit[88] ' Tastenbit Taste runter define tmp byte ' Hilfsvariable fĂŒr PWM define a byte ' ZĂ€hlervariable define h byte ' Tastenvariable define l byte ' Tastenvariable define t byte ' ZĂ€hlervariable Start-Timer define x byte ' Timervariable define y byte ' ZĂ€hlervariable Ende-Timer define z byte ' Timervariable Ende ' Die Pinbelegung der ' Open-Mini (QY4) ' _____ _____ ' | \__/ | ' [ VDD GND ] VDD = 4.6 bis 5.5 Volt ' | | ' blank [ PTB7 PTB0 ] LED 4 ' | | ' LED 8 [ PTB6 PTB1 ] LED 5 ' | | ' LED 3 [ PTA5 PTA0 ] PWM1 ' | | ' LED 2 [ PTA4 PTA1 ] PWM2 ' | | ' Taste1 [ PTB5 PTB2 ] LED 6 ' | | ' Taste2 [ PTB4 PTB3 ] LED 7 ' | | ' LED 1 [ PTA3 PTA2 ] host/run ' |______________| ' ' ---Initialisierung--------------------------------------------------------- #init tmp = 0 a = 0 h = 0 ' Variable fĂŒr rauftaste l = 0 ' Variable fĂŒr runtertaste t = 0 x = 0 ' Variable fĂŒr Timer y = 0 ' Variable fĂŒr Ende-Timer z = 0 ' Variable fĂŒr Ende-Timer Taste h = Tasterauf l = Tasterunter if h = on then goto setz1 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke1 = 0 ' FlankenBit off setzen if l = on then goto setz2 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke2 = 0 ' FlankenBit off setzen goto initend ' Reset Ein-Flanke (bei NichtbetĂ€tigung der Taste) #setz1 if Flanke1 = on then goto error ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) goto init #setz2 if Flanke2 = on then goto error ' Ein-Flanke gesetzt? Ja, dann Ende Flanke2 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) goto init #initend 'weiter gehts ' ---Hauptprogramm----------------------------------------------------------- #start if spannung < 175 then goto unterspannung ' PrĂŒfung auf Unterspannung der Batterie <11 Volt if h = on then goto setz3 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke1 = 0 ' FlankenBit off setzen if l = on then goto setz4 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke2 = 0 ' FlankenBit off setzen goto start1 ' Reset Ein-Flanke (bei NichtbetĂ€tigung der Taste) #setz3 if Flanke1 = on then goto vorheizen ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) goto start #setz4 if Flanke2 = on then goto vorheizen ' Ein-Flanke gesetzt? Ja, dann Ende Flanke2 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) goto start ' RĂŒcksprung zu start #start1 if spannung < 175 then goto unterspannung ' PrĂŒfung auf Unterspannung der Batterie <11 Volt bei Fehler der Lichtmaschine x = timer ' setzt Timerzeit auf 0, Timer zĂ€hlt automatisch hoch #start2 if h = on then goto rauf ' Taste rauf erhöht ZĂ€hler um 1 if l = on then goto runter ' Taste runter verringert ZĂ€hler um 1 if timer = x + 200 then goto start2 ' ca 4 Sekunden Pause vor dem Abschalten der LEDs - TastenbetĂ€tigung ist möglich led1 = 0 ' alle LEDs ausschalten led2 = 0 ' alle LEDs ausschalten led3 = 0 ' alle LEDs ausschalten led4 = 0 ' alle LEDs ausschalten led5 = 0 ' alle LEDs ausschalten led6 = 0 ' alle LEDs ausschalten led7 = 0 ' alle LEDs ausschalten led8 = 0 ' alle LEDs ausschalten blank = 0 ' Grenz-LEDs ausschalten goto start1 ' RĂŒcksprung zum Start ' ---Unterprogramme--------------------------------------------------------- #vorheizen ' signalisiert durch hochlaufende LEDs pwm1_ein ' PWM-Routine Port1 einschalten tmp = 250 ' Verbraucher mit 100% vorheizen pwm1 tmp ' Datenzuweisung fĂŒr PWM for t = 0 to 5 ' ZĂ€hler fĂŒr 6 DurchlĂ€ufe ergibt zusammen 30 Sekunden x = timer ' setzt Timerzeit auf 0, Timer zĂ€hlt automatisch hoch y = timer ' setzt Ende-Timerzeit auf 0, Timer zĂ€hlt automatisch hoch #schleife blank = on ' Grenz-LEDs einschalten led1 = on ' LED einschalten if timer = x + 5 then led2 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 10 then led3 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 15 then led4 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 20 then led5 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 25 then led6 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 30 then led7 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 35 then led8 = on ' nĂ€chste LED nach 0,1 Sekunden if timer = x + 40 then led1 = off ' LED ausschalten if timer = x + 40 then led2 = off ' LED ausschalten if timer = x + 40 then led3 = off ' LED ausschalten if timer = x + 40 then led4 = off ' LED ausschalten if timer = x + 40 then led5 = off ' LED ausschalten if timer = x + 40 then led6 = off ' LED ausschalten if timer = x + 40 then led7 = off ' LED ausschalten if timer = x + 40 then led8 = off ' LED ausschalten if timer = x + 40 then blank = off ' Grenz-LEDs ausschalten if timer = x + 50 then x = Timer ' 0,2 Sekunden vergangen dann Sprung zu start1 if timer = y + 250 then goto weiter ' prĂŒfen ob alle DurchlĂ€ufe absolviert sind goto schleife #weiter if t = 5 then tmp = 36 ' Sollwert PWM auf 14% setzen pwm1 tmp if t = 5 then goto start1 ' nach Ablauf der Schleifen RĂŒcksprung zum start1 next ' nĂ€chster Schritt #rauf blank = on ' schaltet die beiden Ă€uĂersten LEDs auf halbe Helligkeit if not Taste1 then goto setz7 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke1 = 0 ' Reset Ein-Flanke (bei NichtbetĂ€tigung der Taste) goto anzeige ' Sprung zum Ende und zur Anzeige #setz7 if Flanke1 = on then goto anzeige ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) if a = 7 then goto start1 ' Wenn der ZĂ€hler = 7 ist wird das Unterprogramm verlassen a = a + 1 ' Erhöhung des ZĂ€hlers um 1 goto anzeige #runter blank = on ' schaltet die beiden Ă€uĂersten LEDs auf halbe Helligkeit if not Taste2 then goto setz8 ' Taste gedrĂŒckt? Ja, dann setze EIN-Flanke Flanke2 = 0 ' Reset Ein-Flanke (bei NicthbetĂ€tigung der Taste) goto anzeige #setz8 if Flanke2 = on then goto anzeige ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre fĂŒr weiteres Setzen) if a = 7 then goto start1 ' Wenn der ZĂ€hler = 7 ist wird das Unterprogramm verlassen a = a + 1 ' Erhöhung des ZĂ€hlers um 1 goto anzeige #anzeige ' signalisiert durch jeweils leuchtende LED if a = 1 then led1 = on ' LED1 an if a = 1 then tmp = 0 ' PWM Port 0% if a = 2 then led2 = on ' LED2 an if a = 2 then tmp = 36 ' PWM Port 14% if a = 3 then led3 = on ' LED3 an if a = 3 then tmp = 72 ' PWM Port 29% if a = 4 then led4 = on ' LED4 an if a = 4 then tmp = 108 ' PWM Port 43% if a = 5 then led5 = on ' LED5 an if a = 5 then tmp = 144 ' PWM Port 58% if a = 6 then led6 = on ' LED6 an if a = 6 then tmp = 180 ' PWM Port 72% if a = 7 then led7 = on ' LED7 an if a = 7 then tmp = 216 ' PWM Port 86% if a = 8 then led8 = on ' LED8 an if a = 8 then tmp = 250 ' PWM Port 100% pwm1 tmp ' Datenzuweisung PWM-Port1 goto start1 ' RĂŒcksprung in das Hauptprogramm start1 #error ' signalisiert durch LED 4 und 5 blinkend blank = on ' Grenz-LEDs an led4 = on ' LED4 einschalten led5 = on ' LED5 einschalten pause 12 ' 1/4 Sekunde Pause blank = 0 ' Grenz-LEDs aus led4 = 0 ' LED4 ausschalten led5 = 0 ' LED5 ausschalten pause 12 ' 1/4 Sekunde Pause vor dem RĂŒcksprung goto init ' RĂŒcksprung zu init #unterspannung ' signalisiert durch schnell blinkende LED 1 und 8 pwm1_aus ' PWM-Routine Port1 ausschalten blank = on ' Grenz-LEDs an led1 = on ' LED1 an led8 = on ' LED8 an pause 6 ' 1/8 Sekunde Pause blank = 0 ' Grenz-LEDs aus led1 = 0 ' LED1 aus led8 = 0 ' LED8 aus pause 6 ' 1/8 Sekunde Pause vor dem RĂŒcksprung goto start ' RĂŒcksprung zum start end ' Programmende |
| Antwort schreiben |