Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


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 - 6.04.2009 22:04)
 Als Antwort auf Re: Tiptastensteuerung für LEDs und PWM von Andreas - 30.03.2009 19:45
Andreas nutzt:  Open-Micro, Open-Mini
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

Bisherige Antworten: