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.
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
Hallo, Branch if Bit in I/O-Register is Set SBIC Branch if Bit in I/O-Register is Cleared SBIS BR
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.
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
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
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.
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).
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
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?
Na mit Warteschleifen. Warscheinlich stellen sich sogar dem Taster die Nackenhaare auf... doch Gast
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
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.
Wer Warteschleifen als Entprellen bezeichnet, der glaubt auch noch, daß die Kinder der Klapperstorch bringt. Peter
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.
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.
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
*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.
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 ^^.
Hi
>werde das nachher nochmal testen ^^.
Fang erst mal an das zu verstehen .
MfG Spess
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.
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
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
Entschuldige die Frage, aber du benutzt schon den AtTiny2313?
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 | .... |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.