- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Programme per Taster anwählen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178

    Programme per Taster anwählen

    Anzeige

    Praxistest und DIY Projekte
    Ich möchte gerne mit einem Taster zwischen 3 verschiedenen Lauflichtern wechseln können blos irgentwie Funktioniert das nicht so ganz. Das problem liegt denke ich daran, dass er jedes Unterprogramm nur einmal durchläuft und dann gleich wieder in die Hauptschleife spingt oder?

    Code:
    '###################################################
    '#Lauflichtsteuerung mit 3 Verschiedenen Programmen#
    '###################################################
    
    
    $regfile = M8def.dat
    $crystal = 3686400
    
    Ddrd = &B11100000                                           'PD7, PD6, PD5 als Ausgänge festlegen, rest Eingang
    Portd = &B00001100                                          'PullUps von PD2, PD3 Aktivieren
    
    Dim Zler As Byte
    Dim Pr1_3 As Byte
    
    On Timer1 Ontimer1
    Config Timer1 = Timer , Prescale = 64                       'Timertakt = Crystal / 64
    Enable Timer1                                               'Timer1 einschalten
    Enable Interrupts                                           'Interrupts Global einschalten
    Const Timervorgabe = 36736                                  'Hat mir rnAVR so berechnet
    
    
    '###Deklarationen###
    
    Led_gr Alias Portd.7                                        'LED Grün
    Led_ge Alias Portd.6                                        'LED Gelb
    Led_ro Alias Portd.5                                        'LED Rot
    Prwata Alias Pind.3                                         'Programmwahltaster
    
    Declare Sub Pr_1
    Declare Sub Pr_2
    Declare Sub Pr_3
    
    
    '###Hauptschleife###
    
    Do
    Debounce Prwata , 0 , Pr_wechsel , Sub                      'Programmwahltaster entprellen und zu Pr_wechsel springen
    Loop
    
    '###OnTimer1###
    
    Ontimer1:
    Timer1 = Timervorgabe
    If Zler = 10 Then                                           'Wenn Zler = 9 dann...
    Zler = 1                                                    '...Zler = 0
    End If
    Incr Zler                                                   'Zler + 1
    
    Return
    
    
    
    
    
    '###Unterprogramme###
    
    Pr_wechsel:
    
    Pr1_3 = 0
    
    If Pr1_3 = 0 Then                                           'Wenn Pr1_3 = 0 dann...
     Gosub Pr_1
    End If                                                      '...zum Sub PR_1 springen
    
    If Pr1_3 = 1 Then                                           'Wenn Pr1_3 = 1 dann...
     Gosub Pr_2                                                 '...zum sub PR_2 springen
    End If
    
    if Pr1_3 = 2 Then
     Gosub Pr_3
    End If
    
    If Pr1_3 = 3 Then                                           'Wenn Pr1_3 = 2 dann...
     Pr1_3 = 0                                                  '...Pr1_3 = 0
    End If
    
    Incr Pr1_3                                                  'Pr1_3 + 1
    
    Return
    
    '----------------
    
    Pr_1:
    
    Lauflicht 1
    
    
    '---------------
    
    Pr_2:
    
    Lauflicht 2
    
    '---------------
    
    Pr_3:
    
    lauflicht 3

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Ich kenne mich mit Bascom zwar nicht aus,
    aber wenn Du im Unterprogramm Pr_Wechsel von vorneherein Pr1_3 auf 0 setzt, kann es eigentlich nicht funktionieren, oder?

    askazo

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    36
    Beiträge
    1.614
    das ist richtig, deine vermutung ^^ du musst am besten noch ne aktualisierungsvariable einsetzen, das du in pr_wechsel auf die jeweilige tasterposition setzt und dann immer abfragst, welche tasterposition grad dran ist, und die dann ausführst, wenn nen anderer taster gedrückt wurde, wird die variable ja umgeschrieben, und das nächste programm wird ausgeführt, ist das so verständlich?
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    ähm, dass ist leider nicht verständlich für mich

    ich habe nun mal am ende von jedem unterprogramm folgendes eingefügt, damit er so lange im unterprogramm bleibt bis ein anderes Programm angewählt wird.

    pr_1:

    lauflicht

    If Pr1_3 = 0 Then
    Gosub Pr_1
    Else
    Return
    End If

    pr_2:

    lauflicht

    If Pr1_3 = 1 Then
    Gosub Pr_2
    Else
    Return
    End If


    pr_3:

    If Pr1_3 = 2 Then
    Gosub Pr_3
    Else
    Return
    End If



    Funktioniert aber trotzdem irgentwie nicht.


    EDIT: Hier mal der Code wie er immoment aussieht:

    Code:
    '###################################################
    '#Lauflichtsteuerung mit 2 Verschiedenen Programmen#
    '###################################################
    
    
    $regfile = M8def.dat
    $crystal = 3686400
    
    Ddrd = &B11100000                                           'PD7, PD6, PD5 als Ausgänge festlegen, rest Eingang
    Portd = &B00001100                                          'PullUps von PD2, PD3 Aktivieren
    
    Dim Zler As Byte
    Dim Pr1_3 As Byte
    
    
    On Timer1 Ontimer1
    Config Timer1 = Timer , Prescale = 64                       'Timertakt = Crystal / 64
    Enable Timer1                                               'Timer1 einschalten
    Enable Interrupts                                           'Interrupts Global einschalten
    Const Timervorgabe = 36736                                  'Hat mir rnAVR so berechnet
    
    
    '###Deklarationen###
    
    Led_gr Alias Portd.7                                        'LED Grün
    Led_ge Alias Portd.6                                        'LED Gelb
    Led_ro Alias Portd.5                                        'LED Rot
    Prwata Alias Pind.3                                         'Programmwahltaster
    
    Declare Sub Pr_1
    Declare Sub Pr_2
    Declare Sub Pr_3
    
    
    '###Hauptschleife###
    
    Do
    Debounce Prwata , 0 , Pr_wechsel , Sub                      'Programmwahltaster entprellen und zu Pr_wechsel springen
    Loop
    
    '###OnTimer1###
    
    Ontimer1:
    Timer1 = Timervorgabe
    If Zler = 10 Then                                           'Wenn Zler = 9 dann...
    Zler = 1                                                    '...Zler = 0
    End If
    Incr Zler                                                   'Zler + 1
    
    Return
    
    
    
    
    
    '###Unterprogramme###
    
    Pr_wechsel:
    
    Incr Pr1_3                                                  'Pr1_3 um einen erhöhen
    
    
    If Pr1_3 = 0 Then                                           'Wenn Pr1_3 = 0 dann...
     Gosub Pr_1                                                 '...zum sub PR_1 springen
    End If
    
    If Pr1_3 = 1 Then                                           'Wenn Pr1_3 = 0 dann...
     Gosub Pr_2                                                 '...zum sub PR_1 springen
    End If
    
    If Pr1_3 = 2 Then                                           'Wenn Pr1_3 = 0 dann...
     Gosub Pr_3                                                 '...zum sub PR_1 springen
    
    If Pr1_3 >= 3 Then                                          'Wenn pr1_3 = 3 dann..
     Pr1_3 = 0                                                  'pr1_3 = 0
    End If
    
    
    Return
    
    
    '----------------
    
    Pr_1:
    
    If Zler = 1 Then
     Led_ro = 1
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Zler = 2 Then
     Led_ro = 0
     Led_gr = 0
     Led_ge = 1
    End If
    
    If Zler = 3 Then
     Led_ro = 1
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Zler = 4 Then
     Led_ro = 0
     Led_gr = 0
     Led_ge = 1
    End If
    
    If Zler = 5 Then
     Led_ro = 1
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Zler = 6 Then
     Led_ro = 0
     Led_gr = 0
     Led_ge = 1
    End If
    
    If Zler = 7 Then
     Led_ro = 1
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Zler = 8 Then
     Led_ro = 0
     Led_gr = 0
     Led_ge = 1
    End If
    
    If Pr1_3 = 0 Then                                           'Wenn Pr1_3 = 0 dann...
    Gosub Pr_1                                                  '...zum Sub PR_1 gehen...
    Else                                                        '...sonst...
    Return                                                      '...return
    End If
    
    
    
    
    
    '---------------
    
    Pr_2:
    
    
    If Zler = 1 Then
     Led_ro = 1
     Led_gr = 0
     Led_ge = 0
    End If
    
    If Zler = 2 Then
     Led_ro = 0
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Zler = 3 Then
     Led_ro = 0
     Led_gr = 0
     Led_ge = 1
    End If
    
    If Zler = 4 Then
     Led_ro = 1
     Led_gr = 0
     Led_ge = 0
    End If
    
    If Zler = 5 Then
     Led_ro = 0
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Zler = 6 Then
     Led_ro = 0
     Led_gr = 0
     Led_ge = 1
    End If
    
    If Zler = 7 Then
     Led_ro = 1
     Led_gr = 0
     Led_ge = 0
    End If
    
    If Zler = 8 Then
     Led_ro = 0
     Led_gr = 1
     Led_ge = 0
    End If
    
    If Pr1_3 = 1 Then                                           'Wenn Pr1_3 = 0 dann...
    Gosub Pr_2                                                  '...zum Sub PR_2 gehen...
    Else                                                        '...sonst...
    Return                                                      '...return
    
    
    End If

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    36
    Beiträge
    1.614
    ach du scheiße, falsch verstanden, ich muss jetz weg, können wir das morgen machen?
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    ja, schreib einfach wenn du zeit hast

    Vielleicht noch jemand anders ne idee? irgentwas an meinem vorhaben unklar?

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    36
    Beiträge
    1.614
    ich kann nich so ganz klar denken und muss jetzt weg, müssen wir morgen machen, ich hatte dich falsch verstanden
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Du kannst ja den externen INT benutzen.
    In der ISR legst du fest, in welches Unterprogramm gesprungen werden soll.
    Die einzelnen Unterprogramm selbst sind dann eine Endlosschleife, die so lange durchläuft bis der INT ein anderes Programm auswählt.
    Das hat auch den Vorteil, das du in ein anderes Programm springen kannst, wenn eines noch abläuft. Ansonsten wäre es ja immer nur dann möglich, wenn ein Unterprogramm grade am Ende ist.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    @Hardstyleroxx


    Da ist einiges zu tun.
    Ich hätte es ganz anders gemacht aber da hat jeder seinen eigenen Stil also versuch ich es mit ner Korrektur.:


    Zum einen die Variable "Pr1_3" im Unterprogramm "Pr_wechsel"

    Du erhöhst um eins.
    Prüfst aber erst welche Subroutine angesprungen wird und erst zuletzt ob die Variable überläuft.
    In letzterem Falle passiert da garnix.

    Der Passus der Prüfung muß nach oben also erst prüfen dann springen (Wie beiden Fallschirmspringern)


    Dann in den Unterroutinen (zb. "Pr_1") am Ende gibst bei einer "Nichtänderung" ein weiteres "Gosub" ind das gleiche unterprogramm.
    So läuft dir der schnell Stack über.
    Da gehöhrt also ein "Goto" hin also :

    If Pr1_3 = 0 Then
    Goto Pr_1
    Else


    Ja und den Timer hast du zwar angelegt und mit einer Subroutine bedacht aber ich sehe nirgens einen Sprung in diese Routine.
    Ohne Einsprung kann das auch nicht klappen.
    Das solltest du in die Hauptroutine noch einbauen '-)



    Und zuletzt:

    Du springst nur beim Tastendruck einmal in die Subroutinen und das wars dann.
    Geht so nicht.




    Ich würde wie schon erwähnt wurde den Taster auf einen Interrupt legen damit das Programm "Jederzeit" reagieren kann aber das hat erstmal Zeit bis das Programm erstmal richtig läuft.




    Mehr will ich jetzt nicht machen.

    X-Ryder hat ja angeboten dir zu helfen und Zwei Leute sind einer zuviel also will ich mich nicht weiter einmischen.
    Gruß
    Ratber

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    36
    Beiträge
    1.614
    ich nehme an, das der timer geplant aber noch nicht benutzt wurde, genauso wie die lauflicht-unterprogramme

    in den lauflicht unterprogrammen gehört noch ein return hin, und die goto-methode ist leicht unsauber, wenn ich das mal so formulieren darf

    das mit meiner hilfe und deinem rückzug iss ja sehr edel von dir, aber warum hilfst du ihm dann nicht mit deinen großen fachkenntnissen...

    ausserdem sagst du überhaupt gar nichts zu seinem eigentlichen problem...

    am besten würde es natürlich wirklich mit taster auf interrupt sein, dann kannste in den unterprogrammen einfach do-loops verwenden, ansonsten gibts aber auch noch ne möglichkeit, das anders zu machen, ich schreib dir mal gleich nen programm, dann kannste mir sagen ob du das verstehst
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests