PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster Problem



Paulschen97
22.09.2012, 20:55
Hallo Allerseits,

versuche nun schon seit Wochen an meinem selbstgebauten AT Mega 8 Controller Board Taster zu verwenden, nur die wollen einfach nicht.
Die Taster natürlich alle gegen GND geschalten ;)

Mein Quelltext sah dann so aus...

$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Pinb.2 = Input 'Taster 2 (-)'
Config Pinb.3 = Input 'Taster 1 (+)'
Config Portd.7 = Output 'LED rot'
Config Portd.6 = Output 'LED grün'
Config Pinb.4 = Input 'Taster 3 (Enter)'
Config Pinb.5 = Input 'Taster 4 (Clear)'

If Pinb.3 = 1 Then
Portd.6 = 1
Waitms 30
Portd.6 = 0
End If

If Pinb.2 = 1 Then
Portd.7 = 1
Waitms 30
Portd.7 = 0
End If

If Pinb.4 = 1 Then
Portd.6 = 1
Waitms 30
Portd.6 = 0
End If

If Pinb.5 = 1 Then
Portd.7 = 1
Waitms 30
Portd.7 = 0
End If

End

Die Taster sollten lediglich je die passende LED kurz aufblinken lassen wenn man die drückt.

Hättet ihr vielleicht eine Idee, was falsch sein könnte !?

mfg Paulschen97

Kampi
22.09.2012, 21:08
Bei dir fehlt die Do-Loop Schleife.
Dein Programm wird nur 1x durchlaufen und endet dann.
Versuch es mal so:



$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Pinb.2 = Input 'Taster 2 (-)'
Config Pinb.3 = Input 'Taster 1 (+)'
Config Portd.7 = Output 'LED rot'
Config Portd.6 = Output 'LED grün'
Config Pinb.4 = Input 'Taster 3 (Enter)'
Config Pinb.5 = Input 'Taster 4 (Clear)'

Do

If Pinb.3 = 1 Then
Portd.6 = 1
Waitms 30
Portd.6 = 0
End If

If Pinb.2 = 1 Then
Portd.7 = 1
Waitms 30
Portd.7 = 0
End If

If Pinb.4 = 1 Then
Portd.6 = 1
Waitms 30
Portd.6 = 0
End If

If Pinb.5 = 1 Then
Portd.7 = 1
Waitms 30
Portd.7 = 0
End If

Loop
End


Und sollen die LEDs wirklich nach 30ms ausgehen? Weil das siehst du kaum...änder die Zeit einfach mal auf 1 Sekunde ;)

HeXPloreR
22.09.2012, 21:14
Kampi, wo war nochmal die do-loop Schleife?

Kampi
22.09.2012, 21:15
Kampi, wo war nochmal die do-loop Schleife?

-.-
Danke für den Hinweis :D
Das kommt davon wenn man etliche Sachen gleichzeitig macht ^.^
Hab den Text kopiert und wollte ihn gerade umändern als was dazwischen kam :P
Hab es nun editiert und jetzt ist es richtig.

peterfido
22.09.2012, 21:42
Hm. Wenn die Taster nach GND schalten, dann würde ich noch die Pullups einschalten und die Abfrage invertieren.

z.B. so:


$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Taster1 Alias Pinb.3 '+
Taster2 Alias Pinb.2 '-
Taster3 Alias Pinb.4 'Enter
Taster4 Alias Pinb.5 'Clear
Ledrot Alias Portd.7
Ledgruen Alias Portd.6

Config Ledrot = Output 'Standard ist eingang
Config Ledgruen = Output

Set Taster1 'Pullup
Set Taster2 'Pullup
Set Taster3 'Pullup
Set Taster4 'Pullup
' portb=&b00111100 'Oder alle Pullups auf einmal, spart Code


Do

If Taster1 = 0 Then
Set Ledgruen
End If

If Taster2 = 0 Then
Reset Ledgruen
End If

If Taster3 = 0 Then
Set Ledrot
End If

If Taster1 = 0 Then
Reset Ledrot
End If

Loop
End

Sauerbruch
22.09.2012, 22:29
Die PullUp-Widerstände sind in der Tat unumgänglich, da ansonsten die Eingänge bei offenem Schalter frei "in der Luft" hängen, und sich aufgrund ihres sehr hohen Eingangswiderstandes ein völlig unkalkulierbares Gemisch an wilden Störsignalen einfangen. Deshalb müssen sie unbedingt über einen hochohmigen Widerstand auf einen sauberen High-Pegel gezogen werden. Und die haben die Controller gleich eingebaut - man aktiviert sie, indem man die entsprechenden Bits im PORT-Register auf 1 setzt (wie peterfido ja schon beschrieben hat).

Aber in Deinem Code ist auch noch ein kleiner Denkfehler drin:


Die Taster sollten lediglich je die passende LED kurz aufblinken lassen wenn man die drückt.

Das tut Dein Code grundsätzlich auch. Aber was passiert, nachdem die LED 30 ms an war und wieder ausgeschaltet wurde? Der Controller ist bereits nach wenigen Befehlen wieder an dem gleichen Punkt, an dem der Taster abgefragt wird und die LED erneut für 30 ms angeschaltet wird. Bei 4 MHz dürften die LED somit nur wenige Mikrosekunden aus sein, bis sie wieder für 30 ms angeschaltet wird - und das erscheint dem Auge natürlich als ein dauerhaftes Leuchten.

Sauerbruch
25.09.2012, 16:17
In Peterfidos Code-Vorschlag steckt allerdings auch ein "Bug", der möglicherweise für Verwirrung sorgen könnte:






Taster1 Alias Pinb.3 '+
Taster2 Alias Pinb.2 '-
Taster3 Alias Pinb.4 'Enter
Taster4 Alias Pinb.5 'Clear
Ledrot Alias Portd.7
Ledgruen Alias Portd.6

Config Ledrot = Output 'Standard ist eingang
Config Ledgruen = Output

Set Taster1 'Pullup
Set Taster2 'Pullup
Set Taster3 'Pullup
Set Taster4 'Pullup


Pin-Register kann man nicht setzen - man kann sie nur abfragen!

Für Paulschen nochmal im Detail:
Setzen kann man nur die PORT-Register. Ist der Anschluss ein Ausgang, legt man damit den logischen Pegel dieses Ausgangs fest. Ist der Anschluss ein Eingang, schaltet man mit dem PORT-Register den PullUp-Wierstand ein (PORTX.Y = 1) oder aus (PORTX.Y = 0).

peterfido
25.09.2012, 16:39
Stimmt, sorry. Das passiert bei "mal eben schnell". So arbeite ich normal auch nicht. Ich nutze die untere, binäre Schreibweise: portx=&b00001111 für PullUps.

Sauerbruch
25.09.2012, 16:41
Klar - das war natürlich auch nur für den Verfasser des Threads gemeint, um Verwirrung im Frühstadium zu vermeiden :-)