Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Tiptastensteuerung für LEDs und PWM Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Andreas - 2.04.2009 9:28)
 Als Antwort auf Re: Tiptastensteuerung für LEDs und PWM von Andreas - 25.03.2009 21:28
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

Bisherige Antworten: