PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie programmiere ich einen Taster auf 2 befehle



Naxos
24.04.2006, 12:41
ich möchte ein eingangs Taster so programmieren dass wenn ich einmal drücke ein befehl ausgeführt wird und wenn ich zwei mal schnell hintereinander drücke ein anderer Befehl ausgelst wird
¨
Das ganze ist das ich mit nur einem taster ein motor steuern kann also links und rechts.


schon mal danke für die tipps

Chris19
24.04.2006, 13:36
Also ich bin zwar ein Newb was Programmierung angeht ,würde es aber mit einer Zählschleife versuchen. Quasi nach dem ersten Tastendruck an PORTX springt er in eine Zählschleife und warte eine Endliche Zeit auf den zweiten Tastendruck. Es brauch sich dabei ja nur um ne grobe Sekunde handeln.

Einen Sourcecode hab ich dafür leider nicht...sorry . Wie schon gesagt..ich bin noch Noob ;-)


Gruß

Chris19

BiGF00T
24.04.2006, 14:17
hört sich nicht schwer an. einfach nach dem ersten tastendruck timer losrennen lassen (für timer findet man quellcode irgendwo bestimmt) und vielleicht noch ne variable setzen. nach ablauf des timers einfach den befehl für 1x ausführen und wenn der taster gedrückt wird, aber die variable schon gesetzt ist, dann den 2x befehl ausführen.
kannst du programmieren oder langt eine grobe beschreibung der funktion?

EDIT: ups, is ja das Bascom forum... da kann ich garantiert nicht mit source dienen aber schau einfach mal nach, wie man nen timer setzt in bascom. der rest ist nur noch abfragen, ob der timer schon abgelaufen ist und taster abfrage.

EDIT2:
https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer
ich denke, das einzig wichtige ist, dass das warten nicht den Programmablauf unterbricht, sonst wird ja auch der Taster nicht abgefragt während der Wartephase. Weiss nicht, ob man da mit interrupts was tolles machen sollte oder einfach ne Schleife ne gewisse Anzahl von Durchgängen durchlaufen, in der man dann immer den Taster überprüft und wenn er nochmal kam dann zum 2x-Befehl springt und wenn nicht halt hinter der Schleife dann den 1x-Befehl.

spaceduck
25.04.2006, 16:49
@BiGFOOT

Ist zwar OT aber weißt Du eigentlich was die 2 Schriftzeichen da bei Dir bedeuten?

Grüße...

Naxos
25.04.2006, 21:30
ich habe da mal ein code geschrieben aber irgend wie funktioniert er nicht richtig.


Config Portc.2 = Output
Config Portc.3 = Output
Config Pinc.0 = Input
Config Timer0 = Timer , Prescale = 8
Portc.0 = 1



Do
If Pinc.0 = 0 Then
Enable Timer0 : If Pinc.0 = 0 Then
On Timer0 Licht
Portc.3 = 1




Loop
End

Licht:
Portc.2 = 1

Return

weiss einner wie er richtig sein sollte

danke

BiGF00T
25.04.2006, 22:28
@BiGFOOT

Ist zwar OT aber weißt Du eigentlich was die 2 Schriftzeichen da bei Dir bedeuten?

Grüße...
Klar, das ist Gaga (wie die Ente macht ;))
Da Chinesen meistens als Spitzname bei sich einfach das 2. Zeichen verdoppeln, wurde, nachdem keiner meinen Namen aussprechen konnte, einfach gargar (2. Silbe meines Namens, R war schwer, also gaga)) genommen... Hab mich erst gewehrt weil gaga hier ein bissle nen komischen Beigeschmack hat aber jetzt bin ich aber stolz und zufrieden damit ;P Spaceducks machen wahrscheinlich auch 嘎嘎 wie ihre Artgenossen auf der Erde...

EDIT: 你看懂了我的名字吧? (mein Chinesisch is nicht wirklich gut aber wenn ich paar Zeichen hab, dann hab ich zumindest mal im Wörterbuch nachgeschaut was sie bedeuten. Zum überleben in China langts grad...)

deuterius
26.04.2006, 00:02
In Bascom gibt es die Funktion "waitms", die den Programablauf für eine bestimmte Zeit in Millisekunden anhält. Also z. B. "Waitms 10" für eine Pause von einer Hundertstelsekunde.

Ich würde nun den Port mit dem Taster abfragen. Falls dieser gedrückt ist, wird eine kurze Zeit gewartet und der Taster nochmals abgefragt. Jetzt kann je nach Ergebnis der gewünschte Befehl ausgeführt werden.

Natürlich verschwendet der Prozessor so etwas Zeit, falls dies aber nicht stört finde ich das eine einfache Lösung.

(Es bleibt noch zu sagen, dass die Funktion waitms kein hoch genaues Timing erlaubt, das ist aber völlig irrelevant in dieser Anwendung.)

spaceduck
26.04.2006, 01:34
@BiGFOOT,

Hihi, find ich cool. Hätte jetzt echt nicht gedacht das Du chinesisch kannst.
Können ja sicher die wenigsten hier. Die Bedeutung stimmt sogar! ;-)

Naxos
26.04.2006, 07:24
danke für die antwort könnte mir jemand ein Beispiel proggen das ich es noch ganz verstehe währe echt nett


danke

Exodus
26.04.2006, 10:16
Was für einen uc Hast du denn? ATxxxxxxx???

MFG
Mike

Naxos
26.04.2006, 12:20
atmega8 habe ich

Exodus
26.04.2006, 13:01
Wo soll die eingabe erfolgen?? Welche PIN? PINB, PINC oder PIND?? Und welches bit soll angesprochen werden?

mfg
Mike

Exodus
26.04.2006, 13:52
ach ja noch was! Mach es in Assembler! ist leichter!
Wenn du es in assembler machen willst kann ich dir vielleicht helfen, weil ich sowiso öfters mit assembler arbeite!

MFG
Mike

sephi23
26.04.2006, 14:51
EDIT: 你看懂了我的名字吧? (mein Chinesisch is nicht wirklich gut aber wenn ich paar Zeichen hab, dann hab ich zumindest mal im Wörterbuch nachgeschaut was sie bedeuten. Zum überleben in China langts grad...)

klar habe ich verstanden^^.

BiGF00T
26.04.2006, 15:13
ach ja noch was! Mach es in Assembler! ist leichter!
Wenn du es in assembler machen willst kann ich dir vielleicht helfen, weil ich sowiso öfters mit assembler arbeite!

MFG
Mike
Hmm... Ob jemand gleich in Assembler loslegen will, der grad in Basic rummacht... Wobei es auch wirklich ned sooo schwer is. Wenn ich es testen könnte, würde ich schnell was zusammenschrauben aber ich habe weder Bascom, noch habe ich seit qbasic-Zeiten irgendwas in der Art gemacht...
Glaube aber trotzdem, dass basic oder C am Anfang zumindest viel übersichtlicher und einfacher zu verstehen sind. Nachdem man das Prinzip in einer der Sprachen dann verstanden hat, kann man es meist eh in allen anwenden.

@sephi23: 你去什么地方都有很多个中国人。(stimmt das?)
Egal wo man hingeht, es gibt immer viele Chinesen da.
Meist isses sogar ein ganzer Haufen :)
Bist du einer davon oder kannst du nur Chinesisch oder hast du das gebabelfisht?

Naxos
26.04.2006, 21:59
am port c währe gut und die pins 0 1 2


könntest du es im bascom machen da ich kein assembler kann und ich erst gerade angefangen habe mit progen und nicht die sprache wechseln möchte

Exodus
27.04.2006, 08:43
Bascom kann ich leider nicht! Mach ma so! Ich probiers in Assembler und schicke dir dass Programm! OK?

MFG
Mike

vajk
27.04.2006, 11:20
Also mal meine Vorgehensweise als IDEE - allerdings komme ich aus der Zeh-Welt, also keine Ahung was Basic da hergibt.

Timer Interrupt alle 2 ms - Timerfunktion:

Wenn Taster gedrückt, dann hierbei Variable hochzählen
danach auswerten:
wenn Schwellwert I erreicht (z.b 200 entsp. 100 ms Tastendrücken), Flag setzen
nach Schwellert Ia erreicht und Flag I gesetzt und kein Tastendruck mehr, dann wars ein kurzer Tastendruck - entsp. Flag setzen *)

wenn Schwellwert II erreicht (z.b. 500 entsp. 1 s tastendrücken), dann langer Tastendruck erreicht - entsp. Flag setzen *)

*)die Flags werden außerhalb der Timerfunktion ausgewertet und wieder gelöscht

Hat auch den Vorteil, daß man nebenbei die Taste entprellt ...

Wer keinen langen Tastendruck aber doppelmeldung will, muß einfach nur nach Flag Ia den Zähler zurücksetzen

Ich nutze die lange Tastenerkennung um z.B. Einstellungen zu speichern (so wie beim Autoradio) .. das spart ja/nein gefrage

Zähler muß auch gelöscht werden, wenn Schwellerte nicht erreicht werden. Hierzu zweiten Zähler verwenden ...

Hoffe die Idee kommt an ...

Die Vorgehensweise hat auch den Vorteil, daß kein Ausbremsen des uC stattfindet wie z.b. wenn man wait befehle einbaut - diese sollte man auch nie in Interruptroutinen verwenden ! Meine Meinung.

Hop it helps,
Vajk

Exodus
27.04.2006, 11:27
Hi VAJK!
Kann dass so stimmen?

#include <m8def.inc>

ldi R16, 0xff ;In R16 Wert 0xff laden
ldi R17, 0x01 ;In R17 Wert 0x01 laden
ldi R24, 0x02 ;In R24 Wert 0x02 laden
ldi R21, 255 ;In R21 Wert 255 laden
ldi R23, 0b00000010 ;In R23 Wert 0b0000010 laden
ldi R24, 0b00000100 ;In R24 Wert 0b00000100 laden

Start:
in R18, PINC ;Schreibe in R18, PINC
cpse R17, R18 ;Vergleiche R17 mit R18. Wenn gleich nächsten Schritt (rjmp Start) überspringen
rjmp Start ;Springe zu Start

Einmal:
out PORTC, R23 ;Ausgabe an PORTC, R23
in R18, PINC ;Schreibe in R18 PINC
cpse R17, R18 ;Vergleiche R17 mit R18. Wenn gleich nächsten Schritt (rjmp Einmal) übersrpingen
rjmp Einmal ;Springe zu Einmal
cbi PINC, 0x00 ;Alle Bit´s in PINC löschen
rjmp Zeitschleife ;Springe zu Zeitschleife

Zweimal:

out PORTC, R24 ;Ausgabe an PORTC, R24
in R18, PINC ;Schreibe in R18, PINC
cpse R17, R18 ;Vergleiche R17 mit R18. Wenn gleich nächsten Schritt (rjmp zweimal) überspringen
rjmp Zweimal ;Springe zu Zweimal
rjmp Einmal

Zeitschleife:
inc R20 ;erhöhe R20 um 1
cpse R20, R21 ;Vergleiche R20 mit R21
rjmp Zeit ;Springe zu Zeit
inc R22 ;erhöhe R22 um 1

Zeit:
sbrs R22, 0x05 ;Vergleiche R22 mit 0x05. Wenn gleich nächsten Schritt (rjmp Abfrage) überspringen
rjmp Abfrage ;Springe zu Abfrage
cbr R22, 0x20 ;Lösche alles in R22
rjmp Einmal ;Springe zu Einmal

Abfrage:
in R18, PINC ;Schreibe in R18, PINC
cpse R17, R18 ;Vergleioche R17 mit R18. Wenn gleich nächsten Schritt (rjmp Zeitschleife) überspringen
rjmp Zeitschleife ;Springe zu Zeitschleife
cbi PINC, 0x00 ;In PINC alle Bit´s löschen
cbr R18, 0x01 ;Lösche alles in R18
rjmp Zweimal ;Springe zu Zweimal

Naxos
27.04.2006, 12:29
danke viel mal jetzt müsste ich das nür noch irgend wie für bascom ändern aber wie?

sephi23
28.04.2006, 09:48
@sephi23: 你去什么地方都有很多个中国人。(stimmt das?)
Egal wo man hingeht, es gibt immer viele Chinesen da.
Meist isses sogar ein ganzer Haufen :)
Bist du einer davon oder kannst du nur Chinesisch oder hast du das gebabelfisht?

och, hier in der Abteilung bin ich der einzige, aber du hast schon recht wir sind sehr viel^^

Hanni
28.04.2006, 18:31
Hi VAJK!
Kann dass so stimmen?


eher nicht ...

fehlen die ISR Sprungvektoren
Woher weiss der µC was Ein- und Ausgang ist ?
die Kommentare sind zum Großteil eher unnötig, da das entsprechende Mnemonic selbsterklärend ist .... Beispiel:


ldi R16, 0xff ;In R16 Wert 0xff laden
ldi R17, 0x01 ;In R17 Wert 0x01 laden
ldi R24, 0x02 ;In R24 Wert 0x02 laden

Es bleibt die Frage offen, wieso du dieses oder jenes in das entsprechende Register lädst ....
ist es für die lesbarkeit im allgemeinem besser sich für die Register Aliase zu definieren ....
Warteschleifen sind zwar generell möglich, allerdings würde ich für diese Aufgaben einen Timer nutzen ... zumal der µC in der "Wartezeit" dann noch andere Dinge erledigen kann.


Grüße,

da Hanni.

Naxos
01.05.2006, 09:29
währe freundlich wenn mir das noch jemand im bascom schreiben könnte

Hanni
01.05.2006, 13:41
Hmm ... wieso versuchst du es nicht erst mal selber ?

Ich denke mal, wenn du nen Lösungsansatz hast (einen selbsterarbeiteten), wird man dir eher helfen.

BiGF00T
01.05.2006, 14:13
Hmm ... wieso versuchst du es nicht erst mal selber ?

Ich denke mal, wenn du nen Lösungsansatz hast (einen selbsterarbeiteten), wird man dir eher helfen.
Naja, ich glaube, er hatte schonmal einen eine Seite zuvor.
Leider habe ich keinerlei Ahnung von Bascom. Wenn man mir sagt, wie man in basic einen Eingang abfragt, wie man einen Timer startet, dann würde es vielleicht gehen.
Ich stellte mir das ganze etwa so vor: (sollte jemand Fehler finden, bitte sagen...)
EDIT: fixed... Ich hoffe es stimmt so ungefähr...
http://images4.pictiger.com/thumbs/a7/d964c6627aebe4f047ac8da46332f2a7.th.png (http://server4.pictiger.com/img/270368/picture-hosting/blah.php)
Ans Ende dann vielleicht nochmal ein GOTO ASDF, um wieder dahin zu kommen, wo der Taster dann abgefragt wird...
kA, ob das tut aber wenn dus mal in Basic umsetzt, sollte es nicht soo schwer sein. Einfach mal 2 LEDs an 2 Ausgänge, Taster an nen Eingang und dann probieren. Die einzelnen Befehle sollten ned arg schwer sein.

Exodus
02.05.2006, 08:26
Was sind "ISR Sprungvektoren"?

BiGF00T
02.05.2006, 09:28
Wahrscheinlich waren Interruptvektoren gemeint, die an die Adresse der ISR zeigen wenn ich mich noch recht erinnere...
Vielleicht willst du nur auf einen falsch verwendeten Begriff hinweisen? Keine Ahnung wie es richtig heißt, ich kenne es als Interruptvektor. Tritt ein Interrupt auf, wird ab dem Interruptvektor begonnen und dort steht dann die Adresse der ISR. (richtig?) Da gehts dann halt ab bis IRET oder sowas kommt.
Aber bringt das jemanden weiter, der eine Basic-Frage gestellt hat?

Naxos
03.05.2006, 20:16
irgend wie ist das schwieriger als ich gedacht habe, hat da gar keiner ein beispiel?