Kampi, wo war nochmal die do-loop Schleife?
Kampi, wo war nochmal die do-loop Schleife?
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hm. Wenn die Taster nach GND schalten, dann würde ich noch die Pullups einschalten und die Abfrage invertieren.
z.B. so:
Code:$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
Wenn das Herz involviert ist, steht die Logik außen vor! \/
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:
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.Die Taster sollten lediglich je die passende LED kurz aufblinken lassen wenn man die drückt.
In Peterfidos Code-Vorschlag steckt allerdings auch ein "Bug", der möglicherweise für Verwirrung sorgen könnte:
Pin-Register kann man nicht setzen - man kann sie nur abfragen!Code: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
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).
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.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Klar - das war natürlich auch nur für den Verfasser des Threads gemeint, um Verwirrung im Frühstadium zu vermeiden![]()
Lesezeichen