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 GeKĂŒ - 25.03.2009 20:19)
 Als Antwort auf Re: Tiptastensteuerung für LEDs und PWM von Andreas - 25.03.2009 14:35
Hallo,
z.B.
#start
Timer=0          'setzt Timerzeit auf 0 (glaube das dies geht)
#start1
pwm1 tmp                                   ' Datenzuweisung PWM-Port1
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
if timer< 100 then goto #start1 ' Timer=100 ca 2000 ms=2 Sekunden
allleds_a = 0
allleds_b = 0
blank = 0
goto start                                 ' RĂŒcksprung zum Start

Gruß, GeKĂŒ


**********



> Hallo Gerhard,
>
> vielen Dank fĂŒr Deine anschauliche ErklĂ€rung. Ich denk mal ich habs jetzt so weit verinnerlicht. Du hast vollkommen recht, dass die doppelte Unterroutine die zwangslĂ€ufig mit der #anzeige enden muss die return-zeilen in #rauf und in #runter erspart. Ich habe das mal so angepaßt.
>
> Nun habe ich auch, denk ich, das meiste fertig. Problematisch erscheint mir noch die FunktionalitĂ€t des PWM (ist die von RenĂ© Stadler). Ich habe sie fĂŒr meine Zwecke angepaßt, nur habe ich ein VerstĂ€ndnisproblem.
>
> Wenn im #init die Variable pwm gesetzt und im #start zugewiesen wird, lÀuft der PWM dann alleine weiter, auch wenn das Hauptptogramm auf Eingabe wartet bzw. durch die Subroutinen Wartezeiten eingebaut sind?
>
> Und noch ein Schönheitsfehler: Nach BetĂ€tigen einer der Tasten werden zwei Pausen eingelegt, die die LEDs fĂŒr diese Zeit eingeschaltet lassen. Danach verlöschen die LEDs. Idealerweise soll aber auch in der Wartezeit eine TastenbetĂ€tigung möglich sein. Geht das ?
>
> ' --- Betriebssystem konfigurieren ------------------------------------------
> include "om06.inc"        ' Definitionen fuer Betriebssystem
> pullupa = &b00111101      ' Schaltet die internen Pull-Up-WiderstĂ€nde von
>                           ' Port1 und Port2 aus
> ' ---------------------------------------------------------------------------
>
> option openmini
> RunOnError = on            ' bei Fehler Programm neu starten
> define pwm1 port DA[1]       ' 1. PWM Ausgang
> define pwm2 port DA[2]       ' 2. PWM Ausgang eventuell genutzt
> 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 zusaetzlich den PORTB.
> define Led6 port [11]
> define Led7 port [12]
> define Led8 port [13]
> define Taste1 port [14]       '  Taste höher
> define Taste2 port [15]       '  Taste niedriger
> 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 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
> '          |______________|
> '
>
> ' --- Definition der Variablen ----------------------------------------------
> pwm = 128
> define a Byte[1]          ' ZĂ€hlervariable
> a = 0
> define tmp byte           ' Hilfsvariable fĂŒr PWM
> tmp = 0
> define allleds_a byteport[1]               ' Sammelfestlegung aller LEDs an Port a
> define allleds_b byteport[2]               ' Sammelfestlegung aller LEDs an Port b
> allleds_a = 0                              ' alle LEDs an Ports A ausschalten
> allleds_b = 0                              ' alle LEDs an Ports B ausschalten
>
> ' ---------------------------------------------------------------------------
>
> #init
> if Taste1 = on then gosub error             ' Abfrage der Taste rauf auf Kontakt
> if Taste2 = on then gosub error             ' Abfrage der Taste runter auf Kontakt
>
> ' ---------------------------------------------------------------------------
>
> #start
> pwm1 tmp                                   ' Datenzuweisung PWM-Port1
> 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
> goto anzeige         ' springt in das Unterprogramm Anzeige
>
> #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
> goto anzeige         ' springt in das Unterprogramm Anzeige
>
> #anzeige
> if a = 1 then led1 = on
> if a = 1 then tmp = 0
> if a = 2 then led2 = on
> if a = 2 then tmp = 36
> if a = 3 then led3 = on
> if a = 3 then tmp = 72
> if a = 4 then led4 = on
> if a = 4 then tmp = 108
> if a = 5 then led5 = on
> if a = 5 then tmp = 144
> if a = 6 then led6 = on
> if a = 6 then tmp = 180
> if a = 7 then led7 = on
> if a = 7 then tmp = 216
> if a = 8 then led8 = on
> if a = 8 then tmp = 250
> pause 50               ' 1 Sekunde Pause vor dem RĂŒcksprung
> return                 ' RĂŒcksprung in das Hauptprogramm start
>
> ' ---------------------------------------------------------------------------
>
> #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
> return                 ' RĂŒcksprung zum init Progammteil
>
> ' ---------------------------------------------------------------------------
> ' --- 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
> ' ---------------------------------------------------------------------------
>
> danke
>
> Andreas
>
> > Hallo,
> > nach jedem Gosub-Aufruf, wird die Programmadresse des nĂ€chsten Befehls auf einen Stapelspeicher gegeben. Nach einem Return-Aufruf wird immer die letzte Adresse vom Stapelspeicher genommen und verwendet. Deshalb sind Programmierzeilen, bei denen ein Gosub-Aufruf unmittelbar von einem Return-Befehl gefolgt wird unnötig, da der Gosub-Aufruf notwendigerweise auf ein Return stĂ¶ĂŸt.
> > Dein Beispiel:
> > #Main
> > ...Programmzeilen
> > Gosub Pr0
> > GOTO Main
> >
> > #Pr0
> > .... Programmzeilen
> > Gosub Pr1
> > ... hier sind keine weiteren Programmzeilen
> > RETurn
> >
> > #Pr1
> > ...Programmzeilen
> > Return
> >
> > kannst Du also umschreiben zu:
> > #Main
> > ...Programmzeilen
> > Gosub Pr0
> > GOTO Main
> >
> > #Pr0
> > .... Programmzeilen
> > Goto Pr1
> >
> > #Pr1
> > ...Programmzeilen
> > Return
> >
> > 3 Vorteile: Du sparst Programmspeicher, Programm ist schneller, der Gosub/Return-Stapelspeicher ist endlich...
> >
> > Gruß, GeKĂŒ
> >
> >
> > > 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

Bisherige Antworten:

Re: Tiptastensteuerung für LEDs und PWM (von Andreas - 31.03.2009 14:54)
Re: Tiptastensteuerung für LEDs und PWM (von Andreas - 25.03.2009 21:28)
    Re: Tiptastensteuerung für LEDs und PWM (von Andreas - 2.04.2009 9:28)
    Re: Tiptastensteuerung für LEDs und PWM (von Andreas - 27.03.2009 15:36)
        Re: Tiptastensteuerung für LEDs und PWM (von Andreas - 30.03.2009 19:45)
            Re: Tiptastensteuerung für LEDs und PWM (von Andreas - 6.04.2009 22:04)