Taster Softwaretechnisch entprellen

Gast #2062787
Lesenswert?

Peter Diener schrieb:
> @*kopfkratz*: Das ist ja noch lange keine funktionsfähige Entprellung.
>
> Die Frage bezog sich ja auf etwas, das man einfach nur per
>
> Assemblerbefehl aktivieren muss.

Mit diesen beiden Befehlen kann aber schon angefangen werden.
So das die Flanken erkannt werden.

Sonst ein Tip:

Löst immer wieder eine Diskussion aus, aber sie funktioniert gut.

http://www.mikrocontroller.net/articles/Entprellung

BR
OP #2062788
Lesenswert?

Das Problem hier ist das ich keine Lust habe bei jedem Tasterdruck 
welcher eig. einen sbic auslösen soll ein Unterprogramm zu schreiben und 
dann aufzurufen, welches einen Befehl hat, auf eine Warteschleife 
hinweist und dann wieder zurück geht.

(Wie geht eig. eine Normgerechte Warteschleife, ich mach das bisher 
imemr so das ich ein Register mit z.B. 0xFF beschreibe und dann in der 
Warteschleife dec Register, brne Warteschleife.)

Ahh das ist alles in C ... <- @ kopfkratz
OP #2062807
Lesenswert?

Wie mache ich eine möglichst lange Warteschleife ohne groß 
Unterprogramme?

Ich habe momentan diese hier:
1
    ldi r17, 0xFF
2
    rcall Warte
3

4
Warte:
5

6
    dec r17
7
    brne Warte2
8
    ret
9

10
Warte2:
11

12
    ldi r18, 0xFF
13
    rjmp Warte3
14

15
Warte3:
16

17
    dec r18
18
    brne Warte3
19
    rjmp Warte

und die ist noch immer leicht zu kurz ...


Zudem währe interessant wie ich ein Unterprogramm aufrufen kann wenn ein 
Register einen bestimmten Wert wie z.B. 0b0111111 hat (b.z.w. die 
D-Pins).
#2062817
Lesenswert?

Michael Dierken schrieb:
> Das Problem hier ist das ich keine Lust habe bei jedem Tasterdruck
> welcher eig. einen sbic auslösen soll ein Unterprogramm zu schreiben und
> dann aufzurufen, welches einen Befehl hat, auf eine Warteschleife
> hinweist und dann wieder zurück geht.

Dann musst du deinen Code eben besser organisieren.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten
Gast #2062908
Lesenswert?

Karl heinz Buchegger schrieb:
> Michael Dierken schrieb:
>> Prellt noch immer ^^.
>
> Aha.
>
> Und? Ist jetzt fröhliches Rästelraten angesagt, wie du deine Entprellung
> realisiert hast bzw. wie dein Programm überhaupt aussieht?

Das nicht nett von Dir...

Poste doch Dein Code einfach, vielleicht muss man dann nicht ständid in 
die Glaskugel schauen.
Meine ist gerade in der Werkstatt.

BR
OP #2062971
Lesenswert?

Den Code gibts grad nichtmehr ^^... Bin hier die ganze Zeit am 
rumkritzeln. Kann dir aber sagen wie er aussah.

Zuerst Eingänge Ausgänge konfiguriert, Eingänge mit Pull-Up.

Dann hat er sobald man ein fallen der Flanke von High auf Low hat ein 
Unterprogramm aufgerufen, wo er zuerst das Register (zu anfangs 
unbeschrieben) um 1 erhöt hat. Dieses hat er dann per out PORTB, r17 an 
8 LED`s weitergegeben.
Als nächstes kahm eine Warteschleife wie obe angegeben. Dann ein 
Unterprogramm welches in das Hauptprogramm geht sobald kein Taster mehr 
betätigt wird.
#2063066
Lesenswert?

Michael Dierken schrieb:
> Den Code gibts grad nichtmehr ^^... Bin hier die ganze Zeit am
> rumkritzeln. Kann dir aber sagen wie er aussah.

Soll ich dir erzählen, wie mein Warp-Antrieb aussieht?
Aber mir gehts wie dir. Er funktioniert einfach nicht.

> Als nächstes kahm eine Warteschleife wie obe angegeben.

Igitt.
Noch mehr, als dir einen Link zu einer erprobten Entprellung zu geben 
kann man wohl kaum tun.
Gast #2063137
Lesenswert?

Michael Dierken schrieb:
> Werde mir das Programm nochmal anschauen... Wenn ich das komplett
> einfüge erkennt der AVR noch immer bei einmal Tasten mehrere Tastzyklen.

Dann sind Deine Abfragen einfach falsch.
Du darfst das Programm erst rennen lassen wenn Du den Taster los lässt.
Also erst bei der abfallenden Flanke.
Das erreicht man mit den schon von mir geposteten Befehlen.

BR
#2063148
Lesenswert?

*kopfkratz* schrieb:
> Michael Dierken schrieb:
>> Werde mir das Programm nochmal anschauen... Wenn ich das komplett
>> einfüge erkennt der AVR noch immer bei einmal Tasten mehrere Tastzyklen.
>
> Dann sind Deine Abfragen einfach falsch.

Kann sein. Ohne Programm schwer zu entscheiden.

> Du darfst das Programm erst rennen lassen wenn Du den Taster los lässt.

Weißt du etwas, was der Rest des Forums nicht weiß?

> Also erst bei der abfallenden Flanke.

Kann man so machen, muss man aber nicht.
Ob man beim Loslassen eine abfallende Flanke bekommt, hängt jetzt in 
erster Linie davon ab, wie die Taster verschaltet sind.


> Das erreicht man mit den schon von mir geposteten Befehlen.

Deine "Befehle" haben mit Entprellung so rein gar nichts zu tun.
Der von dir gepostete Link zum Entprellung Artikel hingegen ist ein 100% 
Treffer.
OP #2063309
Lesenswert?

Der Code ist 1:1 von dem Link kopiert.

Ich habe daher das es ging nachträglich nurnoch die Register geändert, 
was aber nichts geändert hat.
1
.nolist
2
.include "tn2313def.inc"
3
.list
4
.def  save_sreg         = r16
5
.def  iwr0              = r17
6
.def  iwr1              = r18
7
 
8
.def  key_old           = r19
9
.def  key_state         = r20
10
.def  key_press         = r21
11
 
12
.def  leds              = r22
13
.def  wr0               = r23
14
 
15
.equ  key_port          = pind
16
.equ  led_port          = portb
17
 
18
      rjmp   init
19
.org OVF0addr    ;timer interrupt 24ms
20
      in     save_sreg, SREG
21
get8key:                               ;/old      state     iwr1      iwr0
22
      mov    iwr0, key_old             ;00110011  10101010            00110011
23
      in     key_old, key_port         ;11110000
24
      eor    iwr0, key_old             ;                              11000011
25
      com    key_old                   ;00001111
26
      mov    iwr1, key_state           ;                    10101010
27
      or     key_state, iwr0           ;          11101011
28
      and    iwr0, key_old             ;                              00000011
29
      eor    key_state, iwr0           ;          11101000
30
      and    iwr1, iwr0                ;                    00000010
31
      or     key_press, iwr1           ;store key press detect
32
;
33
;      insert other timer functions here
34
;
35
      out    SREG, save_sreg
36
      reti
37
;-------------------------------------------------------------------------
38
init:
39
      ldi    wr0, 0xFF
40
      out    ddrb, wr0
41
      ldi    wr0, 1<<CS02 | 1<<CS00    ;divide by 1024 * 256
42
      out    TCCR0, wr0
43
      ldi    wr0, 1<<TOIE0             ;enable timer interrupt
44
      out    TIMSK, wr0
45
 
46
      clr    key_old
47
      clr    key_state
48
      clr    key_press
49
      ldi    leds, 0xFF
50
main: cli
51
      eor    leds, key_press           ;toggle LEDs
52
      clr    key_press                 ;clear, if key press action done
53
      sei
54
      out    led_port, leds
55
      rjmp   main
56
;-------------------------------------------------------------

Quelle: http://www.mikrocontroller.net/articles/Entprellung
OP #2063332
Lesenswert?

Ha Klasse .. das mit den Pull-Up Widerständen wars ^^.
Habe das auf meinem Board so geschaltet das die Taster auf Masse ziehen.



Den ATtiny hatte ich noch rumliegen ... Werde mir aber bei gelegenheit 
nen ATMega8 holen um besser dem Tutorial folgen zu können .. bisher ging 
das imemr mit umschreiben der Ports.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren