- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: Kleine Frage zu einer Schleife

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473

    Kleine Frage zu einer Schleife

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo

    Eine Frage zu dem kleinen Codeschnipsel hier:
    Port A ist als Eingang, Port B als Ausgang geschaltet. Jeder Pin von Port B ist mit einer LED bestückt. An Port A hängen zwei Taster. Wird ein Taster gedrückt, springt das Programm in die jeweilige s-Schleife, schreibt 0xFF in das Pin-Register und wartet, bis der Taster wieder losgelassen wird.

    Code:
    l0:
    	 sbis PinA, 0
     	rjmp l1
     	rjmp s0
    l1:
     	sbis PinA, 1
     	rjmp l0
     	rjmp s2
    
    
    ;Schleife Taster 1
    s0:
    	ldi R16, 0xFF
    	out PINB, R16
    s1:
    	sbic PinA, 0
    	rjmp s1
    	rjmp l0
    
    
    ;Schleife Taster 2
    s2:
    
    	ldi R16, 0xFF
    	out PINB, R16
    s3:
    	sbic PinA, 1
    	rjmp s3
    	rjmp l0
    Laut Datenblatt soll das Schreiben einer 1 ins Pin-Register zur Folge haben, das der jeweilige Pin getoggelt wird. Dies funktioniert in diesem Programm auch, wenn ich vor dem geposteten Codeschnipsel ein Bitmuster auf den LEDs anzeigen lasse, wird es jedesmal brav invertiert.

    Was mich aber wundert:
    Ich kann eine Schleife nicht zweimal hintereinander ausführen. Wenn ich einen von beiden Tastern drücke, wird das Bitmuster invertiert-so weit, so gut. Wenn ich denselben Taster aber noch einmal drücke, passiert nichts. Ich muß erst den anderen Taster drücken, damit das Bitmuster wieder invertiert wird. Und dann ist es wieder dasselbe, auf nochmaliges Drücken des zweiten Tasters kommt keine Reaktion.
    Beide Tasterschleifen führen diesselbe Aktion aus. Es muß auch jedesmal zum Ausgang l0 zurückgesprungen werden, sonst würde der andere Taster nicht ansprechen.

    Warum wird ein Taster aber nicht zweimal hintereinander ausgewertet?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hallo,
    ich behaupte mal, daß das Problem nicht im geposteten Codeschnipsel liegt. Welcher µC? Welcher Assembler? Wie sind die Tasten am µC angeschlossen? Kurze Skizze mit Pulldowns? wäre hilfreich.

    Gruß
    Searcher

    EDIT. Der Codeschnipsel funktioniert, wenn ein Taster bei Betätigung ein HIGH auf den Eingang legt. Wenn er ein LOW anlegt, scheint mir Dein beschriebenes Verhalten aufzutreten.
    Geändert von Searcher (09.01.2016 um 11:59 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814
    Die Befehle sind soweit ich das sehe Amtel AVR.

    http://www.atmel.com/webdoc/avrassem...r.wb_SBIS.html
    http://www.atmel.com/webdoc/avrassem...r.wb_SBIC.html
    http://www.atmel.com/webdoc/avrassem...r.wb_RJMP.html
    http://www.atmel.com/webdoc/avrassem...er.wb_LDI.html
    http://www.atmel.com/webdoc/avrassem...er.wb_OUT.html

    Code:
    l0:
         sbis PinA, 0 ;wenn gesetzt springe zu s0 (überspringe Jump l1)
         rjmp l1
         rjmp s0
    l1:
         sbis PinA, 1 ;wenn gesetzt springe zu s2 (überspringe Jump l0)
         rjmp l0
         rjmp s2
    
    
    ;Schleife Taster 1
    s0:
        ldi R16, 0xFF
        out PINB, R16
    s1:
        sbic PinA, 0 ;wenn zurückgesetzt springe zu l0 (überspringe jump s1 - was eine Warteschleife ist solange der Taster gedrückt ist)
        rjmp s1 
        rjmp l0
    
    
    ;Schleife Taster 2
    s2:
    
        ldi R16, 0xFF
        out PINB, R16
    s3:
        sbic PinA, 1 ;wenn zurückgesetzt springe zu l0 (überspringe jump s3 - was eine Warteschleife ist solange der Taster gedrückt ist)
        rjmp s3
        rjmp l0
    ich würde zum Testen mal zwichen:
    ldi R16, 0xFF
    und
    out PINB, R16
    eine Zählschleife oder andere Manipulation des Registerwertes einbauen, um zu sehen ob da nicht doch bei jedem Tastendruck was passiert.
    Beim schnellen durchsehen kommt mir der Code von der Logik auch korrekt vor.
    Weshalb ich auch nicht mehr sagen kann als anstelle der orginal Sequenzen s0: und s2: halt einen testcode zu nehmen.
    (eventuell reicht ein LSL und LSR oder ROL/ROR, je nach Bitmuster)
    Die Sprunglogik scheint zu funktionieren.
    Wenn tatsächlich die Schalter gegen Vss schalten und nicht gegen GND sollte es von der Sprunglogik her richtig sein.
    Geändert von i_make_it (09.01.2016 um 13:21 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Oh Mann...Danke Searcher, dein Gedanke war der Richtige.

    Ich hab die Taster tatsächlich gegen GND schalten lassen-und diesen Umstand vergessen.
    Das kommt davon, wenn zwischen Hardwarebau und Programmierung viele Monate liegen.

    Ach ja...es ist natürlich ein AVR gewesen (ATMega644PA, um genau zu sein), und der entsprechende Assembler aus AVR-Studio 4.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Wie kann ich eine Variable mit unterschiedlichen Werten in einer Schleife füllen?
    Von waldi_n im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 31.12.2013, 16:43
  2. >Frage zun Next For schleife
    Von Cybererror im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 22.03.2010, 11:24
  3. Stack beim verlassen einer Schleife...
    Von Klingon77 im Forum Software, Algorithmen und KI
    Antworten: 10
    Letzter Beitrag: 26.04.2009, 11:17
  4. Antworten: 24
    Letzter Beitrag: 30.05.2007, 10:52
  5. Addition in einer For-Schleife
    Von bertl100 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 06.05.2005, 17:08

Berechtigungen

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

LiTime Speicher und Akkus