Forum: Mikrocontroller und Digitale Elektronik Taster Softwaretechnisch entprellen


von Michael D. (etzen_michi)


Lesenswert?

Wollte mal fragen ob es einen Befehl gibt (Assembler) welcher einen 
Eingäng nach einem Pegel wechsel für eine bestimmte Zeit sperrt und 
diesem somit entprellt.

Z.b. wenn an PD0 ein Taster gegen Masse liegt und die Pull-Up aktiviert 
sind.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Beim AVR gibt es dafür keine Hardwarefunktion, die man direkt per 
Assemblerbefehl ansprechen kann. Es gibt aber ein paar wenige andere 
Prozessoren, die das können.

Grüße,

Peter

von *kopfkratz* (Gast)


Lesenswert?

Hallo,

Branch if Bit in I/O-Register is Set

SBIC

Branch if Bit in I/O-Register is Cleared

SBIS

BR

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Wenn ich mich richtig erinnere, war das der AVR32 (bzw. einige davon), 
der einen GPIO Glitch Filter hat.

@*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.

von *kopfkratz* (Gast)


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

von Michael D. (etzen_michi)


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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Dann würde ich einen Timer aufsetzen, der im Interrupt alle notwendigen 
Eingänge entprellt und in ein paar Register die entprellten Werte 
schreibt. Der Rest geht dann wie vorher mit sbic usw., nur, dass dort 
dann nicht die Portregister, sondern die mit den entprellten Werten 
stehen.

von Michael D. (etzen_michi)


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).

von Karl H. (kbuchegg)


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

von Michael D. (etzen_michi)


Lesenswert?

Prellt noch immer ^^.

von Karl H. (kbuchegg)


Lesenswert?

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?

von nicht Gast (Gast)


Lesenswert?

Na mit Warteschleifen. Warscheinlich stellen sich sogar dem Taster die 
Nackenhaare auf...

doch Gast

von *kopfkratz* (Gast)


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

von Michael D. (etzen_michi)


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.

von Peter D. (peda)


Lesenswert?

Wer Warteschleifen als Entprellen bezeichnet, der glaubt auch noch, daß 
die Kinder der Klapperstorch bringt.


Peter

von Karl H. (kbuchegg)


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.

von Michael D. (etzen_michi)


Lesenswert?

Karl heinz Buchegger schrieb:
> Igitt.
>
> Noch mehr, als dir einen Link zu einer erprobten Entprellung zu geben
>
> kann man wohl kaum tun.

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

von *kopfkratz* (Gast)


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

von Karl H. (kbuchegg)


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.

von Michael D. (etzen_michi)


Lesenswert?

Grad nochmal den Link angeschaut und muss mich Entschuldigen ...

Habe vorhin zu schnell angefangen schnell runter zu scrollen da dort 
alles in C war und habe dabei den Assembler Code übersehen ... werde das 
nachher nochmal testen ^^.

von spess53 (Gast)


Lesenswert?

Hi

>werde das nachher nochmal testen ^^.

Fang erst mal an das zu verstehen .

MfG Spess

von Michael D. (etzen_michi)


Lesenswert?

Prog Kopiert, LED`s blinken ohne erkennbares Muster. Simuliert, nichts 
blinkt.

Was mach ich nur falsch????


Brauche das um im AVR Tutorial die verknüpfungen (und, oder u.s.w.) zu 
lernen. Um per Taster die Zahlen die Addiert oder bearbeitet werden 
sollen einzustellen müssten diese entprellt werden.

von Karl H. (kbuchegg)


Lesenswert?

Michael Dierken schrieb:
> Prog Kopiert, LED`s blinken ohne erkennbares Muster. Simuliert, nichts
> blinkt.
>
> Was mach ich nur falsch????

In erster Linie, dass du immer nur sagst "geht nicht" und nie deinen 
Code zeigst

von Michael D. (etzen_michi)


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

von M. P. (phpmysqlfreak)


Lesenswert?

Entschuldige die Frage, aber du benutzt schon den AtTiny2313?

von Karl H. (kbuchegg)


Lesenswert?

In dem Code sind am Tasterport keine Pullup Widerstände eingeschaltet.

Wie sind deine Taster verdrahtet? Brauchst du µC-interne Pullups?
1
      ....
2
init:
3
      ldi    wr0, 0xFF
4
      out    ddrb, wr0
5
      out    portd, wr0   ; pullup einschalten
6
      ....

von Michael D. (etzen_michi)


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.

von M. P. (phpmysqlfreak)


Lesenswert?

Für meine Anwendungsgebiete reichten bisher beide Controller aus. Eine 
einzige Umstellung war die Verwendung der USI-Schnittstelle des Tiny als 
I2C. Beim Mega8 ist es gleich eingebunden. (Wenn ich mich recht 
entsinne. ;))

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.