PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster als Code



yoyoba
17.06.2009, 15:37
Hallo,

ich habe eine schwierige Frage an euch, ich bin derzeit am basteln und stehe nun vor einem Rätsel, ich habe einen Eingang, welcher ein Null-Signal liefert, dazu habe ich noch 2 Taster, nun ist meine Frage, wie kann ich es programmieren, dass immer wenn der Eingang ein Null Signal liefert ich mit den 2 Tastern einen Code eingeben muss z.B. erst den linken Taster drücke dann nach 2 Sekunden den rechten drücken und dann nochmal nach 3 Sekunden den Rechten und dann am Ausgang ein Signal einer 1 erhalte, hat einer eine Ahnung wie ich soetwas Programmiere?

Ich verwende ein AVR-Board mit Bascom!

MfG

stefan_Z
17.06.2009, 19:07
Was meinst du mit Null-Signal? GND? Hi-Z?
Also wenn es GND ist, dann konfigurierst du den Pin als Input, setzt den internen Pullup und fragst dann mit IF PINx.y (Input geht nur mit PIN, nicht PORT!) ab.
Das mit der verzögerten Tastenabfrage machst du entweder über WAITMS und ne Abfrage oder halt per Timer.

yoyoba
18.06.2009, 10:08
danke für die antwort :) eine frage wäre da noch, wie könnte das den aussehen mit dem waitms oder dem timer, dass er abwartet ob da noch ein high-signal reinkommt?

zu dem null-signal, es is ein null-signal im auto, also zb. von der zündung.


MfG

Yoyoba

Ceos
18.06.2009, 10:26
drück dich mal klarer aus ... ein "signal" hat eine form, eine spannung oder eventuell einen strom

mal ab davon, du nimmst einen timer, stellst ihn auf ctc modus, gibst ihm einen wert der der frequenzentsprechend eine auflösung von sagen wir mal 1ms oder 0.1 oder 0.01ms (also dass der timer nach z.B. 1ms überläuft)

du schaltest den compare interrupt des timer ein, dieser wird bei jedem überlauf einmal aufgerufen, darin inkrementierst du eine zahl (ein int oder ein long wäre gut, damit due genügen überäufe zählen kannst)

du startest den timer aus der hauptschleife mit der bedinung, dass dein "signal" anliegt, und der erste taster gedrückt wurde,

dann legst du dir ein paar if-abragen in den interrupt rein, so von wegen

wenn variable zwischen 800 und 1200(1sek) und taster 2 gedrückt (entprellen kannst du indem du die 2 oder 3 vorhergehenden tasterwerte zwischenspeicherst und wartest das alle 3 werte gedrückt anzeigen) dann setze counten fort, wenn counter > 1200 und kein tastendruck erkannt wurde, brich ab und warte dass das "signal" einmal aus und wieder angeht (neustart) .... du kannst dir beliebig viele if-s mit steigenden counterwerten anlegen und verschiedenen tastern

yoyoba
18.06.2009, 11:27
also es ist so, dass low signal hat 0V, wird aber auch auf 1 geschaltet, nur dann soll über den code etwas geschaltet werden, bei einem low signal soll er wieder einfach über den taster ohne code einschaltbar sein, ich habe nur ein problem damit, ich kriege es nicht hin, dass ich einen code eingebe mit einer bestimmten zeit, deswegen frage ich ob ihr mir ein beispiel geben könntet.


mfg

yoyoba

HeXPloreR
18.06.2009, 11:58
ich glaub nich das damit jemand was anfangen kann
...ansonstten steht die antwort bei ceos´Beitrag...

yoyoba
18.06.2009, 12:21
Also um durch den TÜV zu kommen darf man in seinem Auto keine LED’s leuchten haben während der fahrt. Also muss ich mir etwas programmieren damit der tüv während das auto eingeschaltet ist die LEDs nicht zum laufen bekommt; also einen code, der über taster bedient wird, ist das auto allerdings ausgeschaltet brauche ich keinen code da darf man die LEDs so eingeschaltet haben. Nun möchte ich also meinem microcontroller über die zündung sagen „das auto ist ein/aus“ dies bekomme ich über ein low oder high signal der zündung. Nun ist meine frage wie ich es realisiere, dass der code eingegeben wird. Er soll z.b. so funktionieren, dass ich 1 mal den linken taster betätige und dann 2 mal den rechten und das innerhalb von 5 sekunden, sollte ich länger brauchen um den code einzugeben ist es ungültig und der ausgang bleibt ein low signal. Meine frage war nun wie ich das mit dem code realisieren kann.

Mit freundlichen Grüßen

yoyoba

Andree-HB
18.06.2009, 12:48
...einen beleuchteten Tannenbaum auf dem Armaturenbrett kann man auch per Schalter ausschalten ! ;-)

peterfido
18.06.2009, 13:41
Das sollte eine Lösung sein:



$crystal = 1000000

Disable Interrupts

$regfile = "m16def.dat" 'Atmega 16

$hwstack = 40
$swstack = 40
$framesize = 60


Config Portd.4 = Output 'Ausgang
Config Pind.5 = Input 'Taste 1
Config Pind.6 = Input 'Taste 2
Config Pind.7 = Input 'Zündung


Ausgang Alias Portd.4
Taste1 Alias Pind.5
Taste2 Alias Pind.6
Zundung Alias Pind.7



Portd.5 = 1 'Pullups, sodass Taster nur auf GND ziehen brauchen
Portd.6 = 1
Portd.7 = 0 'Zündung per Pulldown auf GND ziehen und mittel Optokoppler auf High, wenn Zündung an


Dim Code As Byte
Dim Tickcount As Long 'Lauzeit in 10 mSek Schritten

Config Timer0 = Timer , Prescale = 64 '1 mhz

On Timer0 Timer_irq

Const Timervorgabe = 100 '1 mhz

Enable Timer0
Enable Interrupts


Do
If Zundung = 0 Then
Code = 0
Tickcount = 0
Else

If Tickcount < 500 Then '5 Sekunden
If Code = 0 And Taste1 = 0 And Taste2 = 1 Then Code = 1 'Taste 1 gedrückt
If Code = 0 And Taste1 = 1 And Taste2 = 0 Then Tickcount = 500 'falscher Code
If Code = 1 And Taste1 = 1 And Taste2 = 1 Then Code = 2 'keine Taste gedrückt
If Code = 2 And Taste1 = 1 And Taste2 = 0 Then Code = 3 'Taste 2 gedrückt
If Code = 2 And Taste1 = 0 And Taste2 = 1 Then Tickcount = 500 'falscher Code
If Code = 3 And Taste1 = 1 And Taste2 = 1 Then Code = 4 'keine Taste gedrückt
If Code = 4 And Taste1 = 1 And Taste2 = 0 Then Code = 5 'Taste 2 gedrückt
If Code = 4 And Taste1 = 0 And Taste2 = 1 Then Tickcount = 500 'falscher Code
If Code = 5 And Taste1 = 1 And Taste2 = 1 Then Code = 6 'keine Taste gedrückt
End If
End If
If Zundung = 0 Or Code = 6 Then
Set Ausgang
Else
Reset Ausgang
End If
Loop

End




Timer_irq:
Timer0 = Timervorgabe
Tickcount = Tickcount + 1
If Tickcount = 2147483647 Then Tickcount = 0 'sollte es eigentlich nie zu kommen

Return

yoyoba
18.06.2009, 17:52
Vielen Vielen Dank :)

yoyoba
20.06.2009, 10:38
eine frage:

läuft der tickcount direkt los wenn das auto an is bei diesem code?


If Tickcount < 500 Then '5 Sekunden
If Code = 0 And Taste1 = 0 And Taste2 = 1 Then Code = 1 'Taste 1 gedrückt
If Code = 0 And Taste1 = 1 And Taste2 = 0 Then Tickcount = 500 'falscher Code

oder erst wenn die erste taste gedrückt wurde?

mfg