![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Es ist vollbracht. Das Programm läuft nun fehlerfrei und wie gewünscht. define allleds_a byteport[1] ' Sammelfestlegung aller LEDs an Port a define allleds_b byteport[2] ' Sammelfestlegung aller LEDs an Por ist keine so gute Idee gewesen. Damit wurden alle Ports auf Ausgang geschaltet und die Eingänge waren wirkungslos. (vielen Dank an André). Der Rest waren teilweise Reihenfolgesortierungen im Ablauf bei den Abfragen und ein hardwareseitig verkehrt verdrahteter Anschlussport. LED-Port auf Taste und umgekehrt. Vielen Dank noch mal für die Unterstützung bei diesem nicht ganz einfachen Projekt Andreas und für die, die das Programm interessiert, der komplette Code ' --------------------------------------------------------------------------- ' ' Heizgriffsteuerung für Motorräder o.ä. Anwendungen V 1.0 von A. Rutenberg ' ' --------------------------------------------------------------------------- ' Die ganze Schaltung besteht im Wesentlichen aus zwei Tasten und einer 10er LED-Zeile und einer ' MOS-FET-Stufe. Für die LEDs sind Treiber eingebaut. ' ' --- Betriebssystem konfigurieren ------------------------------------------ include "om.def" ' Definitionen fuer Betriebssystem option openmini 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[15] define Tasterauf port[13]' Taste höher define Tasterunter port[14]' 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 t byte ' Zählervariable define x byte ' Timervariable define y byte ' Zählervariable Ende-Timer ' 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 ' | | ' Tasterauf [ PTB5 PTB2 ] LED 6 ' | | ' Tasterunter[ PTB4 PTB3 ] LED 7 ' | | ' LED 1 [ PTA3 PTA2 ] host/run ' |______________| ' ' ---Initialisierung--------------------------------------------------------- #init tmp = 0 a = 1 t = 0 ' Variable für Zähler x = 0 ' Variable für Timer y = 0 ' Variable für Ende-Timer if Tasterauf then goto setz1 ' Taste gedrückt? Ja, dann setze EIN-Flanke Flanke1 = 0 ' FlankenBit off setzen if Tasterunter 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 then goto error ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre für weiteres Setzen) goto init #setz2 if Flanke2 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 ' Beginn mit Prüfung auf Unterspannung und nachfolgendem Vorheizen der Griffe if spannung < 175 then goto unterspannung ' Prüfung auf Unterspannung der Batterie <11 Volt if Tasterauf then goto setz3 ' Taste gedrückt? Ja, dann setze EIN-Flanke Flanke1 = 0 ' FlankenBit off setzen if Tasterunter then goto setz4 ' Taste gedrückt? Ja, dann setze EIN-Flanke Flanke2 = 0 ' FlankenBit off setzen goto start ' Reset Ein-Flanke (bei Nichtbetätigung der Taste) #setz3 if Flanke1 then goto vorheizen ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre für weiteres Setzen) goto start #setz4 if Flanke2 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 ' Startpunkt des laufenden Programms x = Timer ' setzt x auf Timerabfrage (Timer zählt automatisch hoch) #start2 if spannung < 175 then goto unterspannung1 ' Prüfung Unterspannung <11 Volt Lichtmaschine if Tasterauf then goto rauf Flanke1 = 0 if Tasterunter then goto runter Flanke2 = 0 if Timer = (x + 200) then goto start3 ' 4 Sekunden bis off der LEDs - Tastenbetätigung ist möglich goto start2 #start3 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 über 30 Sekunden 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 if Timer = x then 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 #weiter if t = 5 then tmp = 72 ' Sollwert PWM auf 29% setzen pwm1 tmp a = 3 if t = 5 then goto start1 ' nach Ablauf der Schleifen Rücksprung zum start1 next ' nächster Schritt #rauf ' erhöhen der Tastendruck-Zählers um 1 bis zum Maximum if Flanke1 then goto rauf1 ' Ein-Flanke gesetzt? Ja, dann Ende Flanke1 = on ' Setze Ein-Flanke (Sperre für weiteres Setzen) if a = 8 then goto start1 ' Wenn der Zähler = 8 ist wird das Unterprogramm verlassen a = a + 1 ' Erhöhung des Zählers um 1 #rauf1 goto anzeige #runter ' erniedrigen des Tastendruck-Zählers um 1 bis Minimum if Flanke2 then goto runter1 ' Taste gedrückt? Ja, dann setze EIN-Flanke Flanke2 = on ' Reset Ein-Flanke (bei Nicthbetätigung der Taste) if a = 1 then goto start1 ' Wenn der Zähler = 0 ist wird das Unterprogramm verlassen a = a - 1 ' Erniedrigung des Zählers um 1 #runter1 goto anzeige #anzeige ' signalisiert durch jeweils leuchtende LED blank = on ' schaltet die beiden äußersten LEDs auf halbe Helligkeit if a = 1 then led1 = on ' LED1 an if a = 1 then tmp = 0 ' PWM Port 0% if a = 1 then led2 = 0 ' wenn LED 1 on ist, dann kann LED2 nicht on sein if a = 2 then led2 = on ' LED2 an if a = 2 then tmp = 36 ' PWM Port 14% if a = 2 then led1 = 0 ' wenn LED 2 on ist, dann kann LED1 nicht on sein if a = 2 then led3 = 0 ' wenn LED 2 on ist, dann kann LED3 nicht on sein if a = 3 then led3 = on ' LED3 an if a = 3 then tmp = 72 ' PWM Port 29% if a = 3 then led2 = 0 ' wenn LED 3 on ist, dann kann LED2 nicht on sein if a = 3 then led4 = 0 ' wenn LED 3 on ist, dann kann LED4 nicht on sein if a = 4 then led4 = on ' LED4 an if a = 4 then tmp = 108 ' PWM Port 43% if a = 4 then led3 = 0 ' wenn LED 4 on ist, dann kann LED3 nicht on sein if a = 4 then led5 = 0 ' wenn LED 4 on ist, dann kann LED5 nicht on sein if a = 5 then led5 = on ' LED5 an if a = 5 then tmp = 144 ' PWM Port 58% if a = 5 then led4 = 0 ' wenn LED 5 on ist, dann kann LED4 nicht on sein if a = 5 then led6 = 0 ' wenn LED 5 on ist, dann kann LED6 nicht on sein if a = 6 then led6 = on ' LED6 an if a = 6 then tmp = 180 ' PWM Port 72% if a = 6 then led5 = 0 ' wenn LED 6 on ist, dann kann LED5 nicht on sein if a = 6 then led7 = 0 ' wenn LED 6 on ist, dann kann LED7 nicht on sein if a = 7 then led7 = on ' LED7 an if a = 7 then tmp = 216 ' PWM Port 86% if a = 7 then led6 = 0 ' wenn LED 7 on ist, dann kann LED6 nicht on sein if a = 7 then led8 = 0 ' wenn LED 7 on ist, dann kann LED8 nicht on sein if a = 8 then led8 = on ' LED8 an if a = 8 then tmp = 250 ' PWM Port 100% if a = 8 then led7 = 0 ' wenn LED 8 on ist, dann kann LED7 nicht on sein 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 #unterspannung1 ' signalisiert durch schnell blinkende LED 1 und 8 a = 1 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 anzeige ' Rücksprung zur anzeige end ' Programmende ' --------------------------------------------------------------------------- ' --- PWM-Routinen für Port1 ------------------------------------------------ ' --------------------------------------------------------------------------- TABLE pwm1_ein byte ' PWM Port1 einschalten &h12 &h06 &h1a &h20 &h18 &h20 &h3f &h26 &h3f &h27 &ha6 &h1a &hb7 &h25 &h1b &h20 &h81 TABEND ' --------------------------------------------------------------------------- TABLE pwm1 byte ' PWM Port1 setzten - Uebergabe als Argument &h12 &h06 &had &h13 &ha1 &hfa &h25 &h03 &h10 &h25 &h81 &h5f &h48 &h59 &h48 &h59 &hbf &h26 &hb7 &h27 &h11 &h25 &h81 &hae &h01 &h83 TABEND ' --------------------------------------------------------------------------- TABLE pwm1_aus byte ' PWM Port1 ausschalten &h12 &h06 &h1a &h20 &h18 &h20 &h3f &h25 &h1b &h20 &h81 TABEND ' -------------------------------------------------------------------------- |
Antwort schreiben |