PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit LED´s an Output Matrix und einem Taster



MrQu
16.10.2005, 17:12
Ein Hallo an Euch *:-)*

Habe ein Problem mit meinen LED´s!
Ich habe 6 LED´s an einer 2 x 3 Matrix angeschlossen und möchte damit ich die einzelnen LED´s besser/einfacher ansteuern kann jede LED in einer Var. speichern.

Matrix Anschlüsse:
LED 1 = PB2 "0" + PB6 "1"
LED 2 = PB2 "0" + PB5 "1"
LED 3 = PB2 "0" + PB4 "1"
LED 4 = PB3 "0" + PB4 "1"
LED 5 = PB3 "0" + PB5 "1"
LED 6 = PB3 "0" + PB6 "1"

Wie muß ich so eine Var. speichern/anlegen damit ich die Passenden Ausgänge in der Var. hinterlegt habe?

Damit ich im Programm sagen kann z. B. LED 2 "on" und die passenden Portleitungen werden automatisch auf den richtigen Pegel gesetzt.

---

Dann habe ich noch ein kleines Problem mit einem Taster der abgefragt werden soll.
Ich möchte einen Taster immer wieder bei jedem Programablauf einmal abfragen ob dieser gedräckt wurde oder nicht.

Jetzt mein Problem dieser Taster steuert einen Zähler, eine Var wird hochgezählt, jetzt ist der Controller aber zu schnell für einen Finger. d. h. wenn ich den taster einmal drücken will damit sich der zähler um 1 erhöht, der Controller zählt aber z.B. 30 da man die Taste ja so schnell garnicht los lassen kann.
Gibts für das Problem nicht einen Spez. Befehl in BASCOM?


Danke im vorraus

Gruß Manuel

PicNick
16.10.2005, 17:43
Das ist etwas kniffeliger, als man auf den ersten Blick meinen möchte.
Beispiel LED 2:
Aufdrehen: PB2 = 0, PB5 = 1
Wenn jetzt z,B. auch LED 6 leuchten soll
PB3 = 0, PB6 = 1
jetzt geht aber auch gleichzeitig LED 5 an:
LED 2: PB2 = 0, PB5 = 1
LED 6: PB3 = 0, PB6 = 1
also auch
LED 5: PB3 = 0, PB5 = 1

Deswegen macht man sowas auch gemultiplext, d.h. ersteinmal läßt man nur die LEDs 1-3 leuchten, und dann LEDs 4-6

MrQu
16.10.2005, 17:51
Hallo @PicNick,

Danke für die schnelle Nachricht.
Das Problem mit dem multiplexen hab ich im Programm schon gelöst, mir fehlt nur wie ich Ports in einer Var speichere.

Die Portvar. "z.b. LED2" wird über einen Timer immer nur ganz kurz einmal pro Programmdurchlauf angesprochen und dann wieder auf 0 gesetzt und das wird nacheinander mit jeder Portvar. gemacht.
d.h. im programm selber läuchtet immer nur eine LED aber fürs Auge die entsprechenden gleichzeitig.

Gruß MrQu

PicNick
16.10.2005, 18:28
Ach so, d.h es leuchtet exklusiv immer nur eine, soso.

Na, dann mach dir LEDS on/off ein Byte mit "1" for ON und "0" für off


CONST LED_1 = 1
CONST LED_2 = 2
CONST LED_3 = 3
CONST LED_4 = 4
CONST LED_5 = 5
CONST LED_6 = 6

dim leds as byte ' LED -Status

dim scan as byte ' zum refreshen
dim Row as byte ' zum refreshen
dim col as byte ' zum refreshen
'---------------------------------------------
Initialize
col = 64 ' column &B01000000
row = 8 ' row &B00001000
scan = 1

'---------------------------------------------
im Programm setzen/löschen

leds.LED_1 = 1 ' led 1 ON
leds.LED_3 = 1 ' led 3 ON
leds.LED_1 = 0 ' led 1 OFF

'-----------------------------------------------
Refresh: (Timer)
if leds.scan = 1 then
PORTB = col OR row ' LED on ?
else
PORTB = 0 ' LED off
end if
incr scan ' next
if scan = 7 then ' loop ?
scan = 1
col = 64
else
if scan > 3 then
row = 4
shift col, right, 1
else
row = 8
shift col, left, 1
end if
end if


Geht sicher auch eleganter, aber im Prinzip sollt' das gehen

PicNick
16.10.2005, 18:44
Spezieller Befehl: "DEBOUNCE", der bleibt aber ein paar mS stecken.

MrQu
16.10.2005, 18:53
Danke!

Ähhh, moment so gut bin ich noch nicht.

Das Script blich ich nicht ganz.

Da hab ich gleich mal eine Frage.
Ich habe das Buch von "Claus Kühnel" das ist zwar so weit ganz OK aber irgendwie unlogisch geschrieben. Gibts da ein besseres Buch in dem die einzelnen BASCOM Befehle schritt für schritt beschrieben werden.???
Oder was zum runterladen???

PicNick
16.10.2005, 19:13
Buch kann ich dir nix empfehlen, wie ich angefangen habe, sind Komputer noch mit Dampf gegangen.
Ich schau mir gerne fremde Programme an, versuch' zu begreifen und dann in eigene Gedanken zu fassen. "Schritt für Schritt" ist so ne sache, welche Schritte in welche Richtung ?

Das Script: 2 Teile: ein byte "LEDS", wo die Bits 1-6 die Leds repräsentieren. Bei "1" solls leuchten, bei "0" nicht. diese Bits werden irgendwo im Programm gesetzt.
Unabhängig im Timer eine Routine, die immer gleichmäßig hintereinander diese Bits abfragt. Ist ein "1", setzt er in PortB die passenden Pins, bei null eben nicht. Bei jedem Interrrupt dreht er eine LED auf (oder nicht) und läßt sie bis zum nächsten leuchten. und das halt im Kreis