- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Anfängerfrage, Taster als Schalter

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

    LiFePo4 Akku selber bauen - Video
    Sorry hier is der Code:

    Code:
    $regfile = M8def.dat
    $crystal = 3638400
    
    Ddrd = &B11100000
    Portd = &B00001100
    
    Declare Sub An
    Declare Sub Aus
    Declare Sub Prg1
    Declare Sub Prg2
    
    
    Dim T1 As Bit
    Dim T2 As Bit
    
    
    
    Do
    
    Debounce Pind.2 , 0 , An , Sub
    Debounce Pind.3 , 0 , Aus , Sub
    
    If T1 = 1 Then
    Gosub Prg1
    End If
    
    If T2 = 1 Then
    Gosub Prg2
    End If
    
    Loop
    End
    
    
    
    An:
    Toggle T1
    Return
    
    Aus:
    Toggle T2
    Return
    
    Prg1:
    
     Portd.5 = 1
     Waitms 100
     Portd.5 = 0
     Portd.6 = 1
     Waitms 100
     Portd.6 = 0
     Portd.7 = 1
     Waitms 100
     Portd.7 = 0
    
     Return
    
    
    Prg2:
     Portd.5 = 1
     Waitms 400
     Portd.5 = 0
     Portd.6 = 1
     Waitms 400
     Portd.6 = 0
     Portd.7 = 1
     Waitms 400
     Portd.7 = 0
    
     Return
    Nun habe ich leider das Problem, dass ich die Programme nicht mehr sauber abschalten kann. Is ja auch logisch, da er das Programm erst ganz abarbeiten möchte bevor er stoppt. Also muss man genau im richtigen moment stoppen. Jemand ne idee wie ich das lösen kann?

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Einen externen Interrupt verwenden.

    Aber wie ich schon gesagt habe, wenn du von der Programmierung noch nicht soviel Ahnung hast und dir ein fertiger Code mehr helfen würde, muss man den genauen Ablauf des Programms kennen.

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Der Code ist mein komplettes programm, es geht halt bei mir immoment nur darum die Grundfunktionen kennenzulernen (LED an LED aus, taster usw.)

    Die Funktion vom geposteten Code:

    Portd.5 & Portd.6 sind LEDs
    Pind.2 & Pind.3 sind Taster

    Prg1: Leds blinken abwechselnd "Schnell"
    Prg2: Leds blinken abwechselnd "Langsam"

    Wenn ich Taster1 drücke soll prg1 laufen bis ich den selber Taster nochmal drücke. Das selbe gillt für Taster2 (Blos das dann halt prg2 läuft). Wenn nun prg1 läuft und ich Taster2 drücke soll prg1 aufhören und prg2 anfangen und umgekehrt.

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Dann musst du INT0 und INT1 verwenden. Den Syntax findest du in der Hilfe zum Thema Interrupt.

    Ein INT unterbricht das laufende Programm und führt das Programm in der SUB zun INT aus.
    In deinem Fall könnte da das togglen stehen.

    Ich glaube du hast mich etwas falsch verstanden. Als ich davon sprach das man den genauen Ablauf des Programmes kennen müsste, meinte ich damit, den Funktionsablauf. Was soll wann pasieren.
    Es bringt ja nicht viel, einen fertigen Code zu sehen, der offentsichtlich Fehler beinhaltet und man frage wo der Fehler ist.
    Die, die den Fehler suchen sollen, müssen ja ganz genau wissen, was eigentlich passieren sollte.
    Und ganz genau heisst auch wirklich ganz genau. Dazu gehört dann ggf. welche Funktionen oder Taster Vorrang haben sollen und vieles mehr.

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Es muss aber doch noch eine andere Lösung geben um ein laufendes "programm" zu unterbrechen als int0 und int1. Was ist denn wenn ich z.B an 8 eingängen Taster habe und die sollen alle eine unterbrechende Funktion haben?

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Das ganze ist kein PC!

    Wenn du schreibst waitms 300, dann wartet er auch wirklich 300ms und schaut nicht nebenbei was andere Schalter noch so machen. Der läuft sein Programm Schritt für Schritt von oben bis unten ab und verzeigt auf Anweisung ab und zu mal.

    Und selbst der PC (außer Intel's HT im Ansatz) macht das so! Da haben die Steckkarten auch alle einen Interrupt der dann weiteres anfordert.

    Bei 8 Tastern könnte man alle Taster zusätzlich mit Dioden von einander entkoppelt auf einen INT legen. Und in der SUB des INT wird dann abgefragt, welcher Taster tatsächlich gedrückt wurde.

    Sonst geht es nur, wenn die Taster dauerhaft abgefragt werden. Aber dann ist keine Zeit mehr da um das restliche Programm auszuführen.
    Es geht nunmal nur mit Interrupts das Programm zu verlassen.

    Aber wenn du sagst, "es muss", musst du ja auch wissen wie :P

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    ok ich geb mich geschlagen, dann muss ich halt anfangen mit interrupts zu arbeiten.

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2005
    Ort
    Niederdorfelden / Hessen
    Alter
    56
    Beiträge
    368
    Hi hardstyleroxx,

    sorry, aber hier Interrupts zu verwenden ist eine Verschwendung.

    Die Funktion die Du haben willst ist die eines RS-Flip-Flop's.
    ACHTUNG - In den folgenden Zeilen fehlen mit Sicherheit Semikola u.s.w. es sollte jedoch klar sein, was gemeint ist. 'Merker' ist eine Bitvariable, mit der der Schalterzustand zwischengespeichert wird. Unter Subroutine sind die Zeilen abgelegt, die Du beim Einschalten abarbeiten willst.

    If Pind 1.0 = 1 then 'Wenn der Einschalttaster betätigt wird Merker setzen
    Merker = 1
    If Pind 1.1 = 1 then 'Wenn der Ausschalttaster betätigt wird Merker löschen
    Merker = 0

    If merker 0 1 then 'Wenn Merker gesetzt ist in Subroutine verzweigen
    gosub Subroutine

    : Subroutine
    hier steht der Code für die Subroutine

    End Of Programm

    Grüße Klaus
    Eine verrückte Idee ist besser als keine

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    If Pind 1.0 = 1
    Diese Zeile wird doch aber nur dann abgearbeitet, wenn das Programm grade an dieser Stelle ist.
    Wenn das Programm an der Stelle ist wo ein anderer Pin abgefragt wird, wird der erste(zitierte) nicht erkannt.
    Somit ist es doch nicht möglich, das eine blinken zu unterbrechen und sofort zum nächsten zu wechseln.

    Ich lass mich auch gerne belehren. Bin heute morgen früh aufgestanden und grade erst nach Hause gekommen. Mag sein das ich estwas unkonzentriert gelesen habe.

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2005
    Ort
    Niederdorfelden / Hessen
    Alter
    56
    Beiträge
    368
    Hi Marco78,

    Ich sehe gerade, das ich zwei Zeilen vergessen habe.

    Richtig wäre :
    Code:
    : Anfang    'Anfang der Endlosschleife
    If Pind 1.0 = 1 then  'Wenn der Einschalttaster betätigt wird -> Merker setzen
    Merker = 1
    If Pind 1.1 = 1 then  'Wenn der Ausschalttaster betätigt wird -> Merker löschen
    Merker = 0
    
    If merker = 1 then  'Wenn Merker gesetzt ist -> in Subroutine verzweigen
    gosub Subroutine
    
    Goto Anfang    'Rücksprung zum Anfang
    
    : Subroutine
    hier steht der Code für die Subroutine
    
    End Of Programm
    Sinn und Zweck des Ganzen ist folgender.
    Zwischen ':Anfang' und 'Goto Anfang' ist der Programmcode, der die Abfrage der Taster vornimmt. In diesem Fall ist es eine Endlosschleife, die sehr schnell abgearbeitet wird, bis ...

    ... die Bitvariable 'Merker' gesetzt ist. Wenn der Merker gesetzt ist wird in die Subroutine verzweigt. In der Subroutine muss jetzt gewährleistet werden, daß diese so schnell wie möglich abgearbeitet wird. Das ist zwingend notwendig, damit die Taster so oft wie möglich abgefragt werden können. Waitbefehle sollten so klein wie möglich gewählt werden. Die Kombination eines kurzen Waitbefehles mit einem Zähler führt zu einem langen Wartezeitraum. Mit dem 'Select Case' - Befehl kann der Zählerstand und damit die abgelaufene Zeit in der Subroutine verwendet werden. Das hat jetzt aber nichts mehr mit dem Tasterproblem zu tun.

    Grüße Klaus
    Eine verrückte Idee ist besser als keine

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test