mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster Softwaretechnisch entprellen


Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: *kopfkratz* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Branch if Bit in I/O-Register is Set

SBIC

Branch if Bit in I/O-Register is Cleared

SBIS

BR

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: *kopfkratz* (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie mache ich eine möglichst lange Warteschleife ohne groß 
Unterprogramme?

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

Warte:

    dec r17
    brne Warte2
    ret

Warte2:

    ldi r18, 0xFF
    rjmp Warte3

Warte3:

    dec r18
    brne Warte3
    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).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prellt noch immer ^^.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na mit Warteschleifen. Warscheinlich stellen sich sogar dem Taster die 
Nackenhaare auf...

doch Gast

Autor: *kopfkratz* (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: *kopfkratz* (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>werde das nachher nochmal testen ^^.

Fang erst mal an das zu verstehen .

MfG Spess

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.
.nolist
.include "tn2313def.inc"
.list
.def  save_sreg         = r16
.def  iwr0              = r17
.def  iwr1              = r18
 
.def  key_old           = r19
.def  key_state         = r20
.def  key_press         = r21
 
.def  leds              = r22
.def  wr0               = r23
 
.equ  key_port          = pind
.equ  led_port          = portb
 
      rjmp   init
.org OVF0addr    ;timer interrupt 24ms
      in     save_sreg, SREG
get8key:                               ;/old      state     iwr1      iwr0
      mov    iwr0, key_old             ;00110011  10101010            00110011
      in     key_old, key_port         ;11110000
      eor    iwr0, key_old             ;                              11000011
      com    key_old                   ;00001111
      mov    iwr1, key_state           ;                    10101010
      or     key_state, iwr0           ;          11101011
      and    iwr0, key_old             ;                              00000011
      eor    key_state, iwr0           ;          11101000
      and    iwr1, iwr0                ;                    00000010
      or     key_press, iwr1           ;store key press detect
;
;      insert other timer functions here
;
      out    SREG, save_sreg
      reti
;-------------------------------------------------------------------------
init:
      ldi    wr0, 0xFF
      out    ddrb, wr0
      ldi    wr0, 1<<CS02 | 1<<CS00    ;divide by 1024 * 256
      out    TCCR0, wr0
      ldi    wr0, 1<<TOIE0             ;enable timer interrupt
      out    TIMSK, wr0
 
      clr    key_old
      clr    key_state
      clr    key_press
      ldi    leds, 0xFF
main: cli
      eor    leds, key_press           ;toggle LEDs
      clr    key_press                 ;clear, if key press action done
      sei
      out    led_port, leds
      rjmp   main
;-------------------------------------------------------------  


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

Autor: Marcel Papst (phpmysqlfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldige die Frage, aber du benutzt schon den AtTiny2313?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Code sind am Tasterport keine Pullup Widerstände eingeschaltet.

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

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcel Papst (phpmysqlfreak)
Datum:

Bewertung
0 lesenswert
nicht 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. ;))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.