taster mit led abfrage

1avr2

Neues Mitglied
21. Jan. 2010
28
0
0
Sprachen
habe ein kleines programm das zwei taster abfraegt und entsprechend led schaltet,
funktioniert leider nur am simulator. hardware kann ich mit grosser wahrscheinlichkeit
ausschliessen, da andere programme funktionieren.
kann jemand einen blick drauf werfen.

lg bernhard.

Code:
; taster_eins led_gruen ein, taster_zwei led_gelb ein
; taster_ein und taster_zwei led_rot ein.

.include "m8def.inc"

;     port d eingabe

    cbi ddrd,0            ; taster_eins
    cbi ddrd,1            ; taster_zwei

    sbi portd,0            ; pullup taster_eins
    sbi portd,1            ; pullup taster_zwei
    

;     port b ausgabe

    sbi ddrb,0            ; led gruen
    sbi ddrb,1            ; led gelb
    sbi ddrb,2            ; led rot

;     abfrage der taster

    loop:
    in r16,pind
    cpi r16,0
    breq led_aus
    cpi r16,1
    breq led_gruen
    cpi r16,2
    breq led_gelb
    cpi r16,3
    breq led_rot



    nop


    led_aus:
    cbi portb,0
    cbi portb,1
    cbi portb,2
    rjmp loop

    led_gruen:
    cbi portb,1
    cbi portb,2
    sbi portb,0
    rjmp loop
    
    led_gelb:
    cbi portb,0
    cbi portb,2
    sbi portb,1
    rjmp loop

    led_rot:
    cbi portb,0
    cbi portb,1
    sbi portb,2
    rjmp loop
 
Hallo Bernhard,

direkt nach loop: fragst du die Taster ab, es gibt hier zwei Probleme:

  1. du möchtest eigentlich ein bestimmtes Bit abfragen, du vergleichst aber den gesamten Port. Pins ab Pin2 sind als Input ohne Pullup geschaltet (Zustand nach Reset) und da kann dann schon mal eine "1" oder "0" erscheinen, der Zustand ist also nicht sicher.
  2. du verwendest Pullups, Taster schalten nach GND, die Signale sind also invertiert. Dies berücksichtigst du in deinem Code nicht.
Richtig wäre es zum Beispiel so:

Code:
    loop:
    in r16,pind
    andi r16, 0b00000011 ; sicherstellen, dass alle Bits ab Bit2 "0" sind
    cpi r16,3  ; 0b00000011 kein taster gedrückt
    breq led_aus
    cpi r16,2  ; 0b00000010  Taste 1 gedrückt
    breq led_gruen
    cpi r16,1  ; 0b00000001 Taste 2 gedrückt
    breq led_gelb
    cpi r16,0  ; 0b00000000 beide Tasten gedrückt
    breq led_rot
ansonsten habe ich keine Fehler gefunden.

Gruß,
Dirk


Dein Code:

Code:
    loop:
    in r16,pind
    cpi r16,0
    breq led_aus
    cpi r16,1
    breq led_gruen
    cpi r16,2
    breq led_gelb
    cpi r16,3
    breq led_rot
 
vielen dank an dirk

funktioniert jetzt fehlerfrei. die zwei entscheidenden punkte habe ich leider übersehen.
nochmals vielen dank an dirk. komme leider nur alle heiligen zeiten zum programmiern wenn es familie und arbeit zulaesst. macht aber trotzdem spass.

lg bernhard
 
Hi
Nun, auf die Falle mit den Tastern auf "0" Signal sind vermutlich schon viele reingefallen. Deshalb verwende ich grundsätzlich eine Ablage mit den gedrehten Bits. Dazu einfach die eingelesenen Werte mit "1" exclusiv verodern..
[avrsam]
Read_IO:
In Temp, Portx
LDI Reg_A, 0b11111111 ; Exclusiv Oder mit "1"
EOR Temp, Reg_A ; dreht die Signallage
And Temp, 0b00001111 ; ungültige Bits ausblenden
STS New_In, Temp ; und in einer Variablen ablegen
RET
[/avrasm]
Anschließend wird New_In benutzt, um daraus Flankenbits aus einer vorher eingelesenen Information zu bilden. Etwa so:
[avrasm]
Set_Flag_To_High:
LDS Temp, New_In
LDS Reg_A, Old_In
EOR Reg_A, Temp ; nur auf "1" geänderte Bits sind "1"
AND Reg_A, Temp ; nun nur die neuen "1"
STS Flg_To_High, Reg_A ; und in einer Variablen ablegen
STS Old_In, Temp ; und die neu eingelesene Information merken
RET
[/avrasm]
Manchmal braucht man auch eine Flanke nach "0", dann darf die neue Information erst nach dieser Auswertung in die Ablage kopiert werden.
Nun ist es ja so, das man nichts machen muß, wenn keine Änderung eingetreten ist, daher der Kehrschluß, ist ein Flakenbit gesetzt, wird eine spezielle Behandlungsroutine aufgerufen:
Chk_FLG_Bits:
LDS Temp, Flg_To_High
ANDI Temp, 0b00000001
BRNE Action_0
LDS Temp, Flg_To_High
ANDI Temp, 0b00000010
BRNE Action_1
LDS Temp, Flg_To_High
ANDI Temp, 0b00000100
BRNE Action_2
LDS Temp, Flg_To_High
ANDI Temp, 0b00001000
BRNE Action_3
RET

Action_0:
...
LDS Temp, Flg_To_High
ANDI Temp, 0b11111110 ; Bit durch löschen Quittieren
STS Flg_To_Hig, Temp
RET

Action_1:
...
LDS Temp, Flg_To_High
ANDI Temp, 0b11111101 ; Bit durch löschen Quittieren
STS Flg_To_Hig, Temp

RET

Action_2:
...
LDS Temp, Flg_To_High
ANDI Temp, 0b11111011 ; Bit durch löschen Quittieren
STS Flg_To_Hig, Temp

RET

Action_3:
...
LDS Temp, Flg_To_High
ANDI Temp, 0b11110111 ; Bit durch löschen Quittieren
STS Flg_To_Hig, Temp

RET
[/avrasm]
Der Vorteil ist einfach erklärt. Willst du die Tastendrücke zählen, brauchst d in der Fankenbeabeitung nur eine Variable hochzählen. Auch eine Eltako-Schaltung ist denkbar einfach. In Kombination mit einer Flankenauswertung nach "0" erfasst du die Dauer des Tastendrucks. Steigende Flanke, Ausgang setzen, fallende Flanke, Ausgang löschen.
Nun viel Spas
Gruß joldmax
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)