PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M-Unit + 25 LED´s ???



Speed
30.08.2006, 00:41
Hallo,
hat jemand ne Idee wie man mit dem M-Unit (dem Alten)
25 LED´s einzeln ansprechen kann?

FriLu
30.08.2006, 00:57
Hallo,
vlt. mit 74xx573 ( 8 bit Latch )? BytePort 1 als Datenbus, Ports von BytePort2 als latch-enable, ist schneller als Basic-I²C- Bus ( was auch eine Alternative wäre ).
MfG Lutz

Speed
30.08.2006, 12:04
Ich kenn mich mit I2C nicht aus.
könntest du es geanauer beschreiben?

danke

FriLu
30.08.2006, 18:19
Inwieweit hast du Software von der M-Unit V1?
Da sind, glaub ich schon Bsp. dabei.
Kuck auch mal bei http://ccintern.dharlos.de/ rein, dietmar erklärt das ausführlicher, als ich das könnte.
Da gibt's auch einen ASM-Treiber, der die I²C-Ausgabe beschleunigt...
ich weiss ja nicht, wie schnell deine Ausgabe sein soll, sind die LED's "on bord" oder abgesetzt usw.
MfG Lutz

Speed
30.08.2006, 19:23
Inwieweit hast du Software von der M-Unit V1?


Ich hab an Software nur Basic.

Das M-Unit hab ich bei ebay günstig ersteigert.

Was brauch ich denn noch als hardware?

FriLu
31.08.2006, 15:35
Hallo,
also als Software brauchst du CCBasic- eine an die m-unit angepasste Variante, z.b. http://fdos.de/ oder eben das C(onrad) - Original.
Als Hardware eine 232- Schnittstelle als programmieradapter.

Speed
31.08.2006, 19:45
Ich hab das Original Basic von Conrad.

Und das M-Unit
http://img390.imageshack.us/img390/2252/munitba9.jpg
Und den Programmieradapter
http://img408.imageshack.us/img408/3158/programmieradapternr8.jpg


Ich hab gelesen das der I2C-Bus 2 digitale Eingänge braucht:
1 mal I2CDATA und
1 mal I2CTAKT

Das bedeutet das ich dann von den 16 digitalen Ports die ich vorher hatte 2 wegfallen.
Also hab ich jetzt nur noch 14. Um aber die 25 LED´s einzeln zu schalten bauch ich 25 Digital Ports das heißt das mir jetzt noch 11 Ports fehlen. Kann man aus einen I2C-Bus 11 digital Ports machen?

FriLu
31.08.2006, 21:28
Hallo,
die rechte Hälfte vom Bild^^ entspricht dem Programmieradapter von Conrad.
Um 24 LEDs anzusteuern, brauchst du z.b. 3 x PCF8574 (8 bit-Expander), die 25.te dann halt extra. Es gibt viele verschiedene ICs für den I²C, und mir scheint , es werden ständig mehr...
Im Ernst: Durch die notwendige Adressierung der I²C-IC's und serielle Datenübertragung in Basic ist das ziemlich langsam und umständlich. mein Faforit ist daher dieses:

Jeweils 8 LEDs in eine Variable, Variable manipulieren und auf Byteport 1 ausgeben, entspechenden Latchport pulsen- fertig.
MfG Lutz

Speed
01.09.2006, 13:47
Jo Danke schon mal!!!


Sind das die richtigen? (conrad.de) Artikel-Nr.: 151335 - 62

Wie werden die LED´s angesprochen?

FriLu
01.09.2006, 15:03
Hallo,


Sind das die richtigen? (conrad.de) Artikel-Nr.: 151335 - 62

Wie werden die LED´s angesprochen?
1. ja.
zu 2: Da gibt's vieeele Möglichkeiten.
Erstmal definieren, etwa so:



define bus byteport[1]
define latchport byteport[2]
define latch1 port [9]
define latch2 port[10]
define latch3 port[11]
define LED25 port[16] ' bei meinem Schaltplan!!- also anpassen

define LEDgruppe1 byte [1]
define LEDgruppe2 byte [2]
define LEDgruppe3 byte [3]
define LED1 bit [1]
... ' hier LED2- LED23 definieren
define LED24 bit [24]


jetzt kannst du die LEDs einzeln oder in 8er Gruppen ein/ausschalten -erstmal im Speicher- damit die Latches schalten, musst du den wert noch ausgeben:
wenn LED1-8 verändert wurde,
bus = LEDgruppe1
pulse latch1
genauso für die anderen gruppen;
LED25 ist ja direkt angeschlossen, also LED25 = on für "ein" LED25 = off für "aus"
Zum Manipulieren der LEDs ist deine Fantasie gefragt:
a: jede LED einzeln on/off
b: Per schiebebefehl ( Lauflicht )
c: Tabelle vordefinieren und auslesen ( Muster)
d: Formel ausdenken, ergebniss in LEDgruppex speichern ( zufall )
u.s.w.
MfG Lutz

Speed
01.09.2006, 20:35
Jo Danke Danke

Ich werd´s mal ausprobieren.

FriLu
06.10.2006, 20:11
Hallo,
Ich schreib schon mal auf Verdacht; Rest per Tel, siehe PN O:)
puh, musste umdenken- hab zuletzt basic++ benutzt :-k




'************************************************
' Test '573 als Porterweiteung bustest.bas *
' FriLu 06.10.06 *
' CCBasic V2.0 *
' ZUSÄTZLICH zum Schaltplan ein Poti, ca 10k, *
' Wert unkritisch, an ad1 anschliessen *
' dito an ad2 :) *
' oder ad1 erstmal an gnd *
'************************************************
' --- PORTs ---
define bus byteport[1]
define byteport2 byteport[2]
define latch1 port [9]
define latch2 port[10]
define latch3 port[11]

define led25 port[16]

define eingabe ad[1]
define tempo ad[2]


' --- Variable ---
define gruppe1 byte ' led 1 - 8
define gruppe2 byte ' led 9 - 16
define gruppe3 byte ' led 17 - 24

define auswahl byte
define i byte
define speed byte ' :)

'************************************************
' --- Hauptprogramm ---
' --- Init ---
speed = 5
bus = off ' ports als ausgänge
latch1 = off ' und '573 löschen
latch2 = off
latch3 = off
led25 = off
pulse latch1
pulse latch2
pulse latch3

' --- Schleife ---
#HauptLoop
gosub WasMachen
'gosub WieSchnell ' Kommentar entfernen für Geschw-ändern

on auswahl gosub lp1, lp2, lp3, lp4 ' erstmal nur lp1

goto HauptLoop
' --- Ende Schleife ---
'************************************************
' --- Unterprogramme ---
#WasMachen
auswahl= eingabe / 64 ' ergibt 0-3 für on gosub, erweiterbar
' stattdessen auch zufallswert einsetzbar
return
#WieSchnell
speed= (tempo / 32) + 3 ' ergibt 3-10 als pausenwert
return
'************************************************
' --- ab hier Lichtshow ---
#lp1 ' schiebt eine einzelne led=on durch
gruppe1= 1
for i = 0 to 8
bus = gruppe1
pulse latch1
pause speed
gruppe1 = gruppe1 shl 1
next
gruppe2= 1
for i = 0 to 8
bus = gruppe2
pulse latch2
pause speed
gruppe2 = gruppe2 shl 1
next
gruppe3= 1
for i = 0 to 8
bus = gruppe3
pulse latch3
pause speed
gruppe3 = gruppe3 shl 1
next
led25 = on
pause speed
led25 = off
return
'------------- ab hier eigeninitiative
#lp2

return
'-------------
#lp3

return
'-------------
#lp4

return
'************************************************
end
' --- Tabellen ---
' sorry, selbst ist der freak :))



Bis Bald ... Lutz

Speed
07.10.2006, 18:18
Hallo,

Mithilfe deines Programms (danke schonmal) bin ich jetzt schon ein stück weiter (die LED´s leuchten zum teil).

Wie mach ich das, dass zum Beispiel nur LED 8 und 16 an sind?
Also:


#loop
LED8 = on
LED16 = on
Pause 50
LED8 = off
LED16 = off
Pause 50
Goto loop


Laut deinem Bauplan werden auch die Ports 1 bis 8 benutzt, müssen die nicht im Programm definiert werden?

FriLu
07.10.2006, 19:44
Hallo speed,
die Ports 1-8 werden als Byteport[1] angesprochen, einzeln ist nicht notwendig da immer 8 bit ( der gesamte Port ) in die '573er geschrieben werden.
Wenn du die Leds gezielt ein/ausschalten willst, müssen wir den defineteil etwas umschreiben:



' --- Variable ---
define gruppe1 byte [1] ' led 1 - 8
define led1 bit [1]
define led2 bit [2]
define led3 bit [3]
define led4 bit [4]
define led5 bit [5]
define led6 bit [6]
define led7 bit [7]
define led8 bit [8]

define gruppe2 byte [2] ' led 9 - 16
define led9 bit [9]
define led10 bit[10]
define led11 bit[11]
define led12 bit[12]
define led13 bit[13]
define led14 bit[14]
define led15 bit[15]
define led16 bit[16]

define gruppe3 byte [3] ' led 17 - 24
define led17 bit[17]
define led18 bit[18]
define led19 bit[19]
define led20 bit[20]
define led21 bit[21]
define led22 bit[22]
define led23 bit[23]
define led24 bit[24]

define auswahl byte
define i byte
define speed byte ' :)
' statt der "kurzversion" ins prog kopieren,
' so kannst du jede led gezielt ansprechen.
' bit[1] und byte[1] belegen einen teil des RAMs gemeinsam,
' das ist gewollt!
' wenn du jetzt eine ledx ein/oder ausschaltest, tust du das
' nur im Speicher!, zur anzeige musst du die gruppe der ent-
' sprechenden led noch ausgeben, z.b.:
' bus = gruppe1
' pulse latch1
' wenn du eine/mehrere/alle leds1-8 geändert hast.

' alternativ kannst du auch bitbefehle auf die gruppe anwenden:
' x steht für 1,2 oder 3
' die binäre 1 steht für die entsprechende led der gruppe,
' es geht auch mehrere/ alle, im Dezimal oder Hexformat ...
' gruppex = gruppex xor &b00001000
' schaltet >led nr4 der gruppe< UM, ohne änderung der anderen
' gruppex = gruppex or &b00001000
' schaltet >led nr4 der gruppe< EIN, ohne änderung der anderen
' gruppex = gruppex and &b11110111
' schaltet >led nr4 der gruppe< AUS, ohne änderung der anderen

' programmtechnisch gesehen kannst du nichts kaputt machen,
' also ruhig etwas probieren :)

' schau mal, wie man tabellen erstellt/ausliest, schreib ein ( oder
' mehrere ) muster in tabellen und gib es aus. :):)
' P.S. eine Tastatur mit Spracheingabe wär nicht schlecht, ich
' tipp mir hier die Finger wund... :):):)
'************************************************

Übrigens, was heisst " leuchten zum Teil" ?; Die müssen alle!

Speed
08.10.2006, 15:21
Hi,
wie mach ich das, dass die LED´s im Speicher geschaltet werden? (gibt es dafür bestimmte befehle)?

Um LED´s zu schalten kenn ich nur die Befehle On/Off und 1/0.



Übrigens, was heisst " leuchten zum Teil" ?; Die müssen alle!


Einige LED´s leuchten gar nicht, andere „glimmen“ nur leicht und der Rest leuchtet dauerhaft.

FriLu
08.10.2006, 20:11
Hi,
oO, Fehlersuche...
Also erstmal, mein prog ist ein Lauflicht über alle 25 LEDs O:)
Wichtig: dazu muss ad[1] erstmal an Gnd! (oder an den mittelabgriff eines Potis, ein "ende" vom poti an Gnd, das andere an kontrollerbetriebssp., schleifer an Gnd-anschlag)
Betriebsspannung/ Gnd an '573 angeschlossen? ( hatte in einem anderen Thread schon mal jemand vergessen O:) )
Das vom 573er nach dem einschalten die ausgänge zufällige stellungen haben, ist leider normal, das korrigiert das programm, so es denn losläuft...
Was mir sorgen macht ist, das einige LEDs nur glimmen, das ist definitiv ein Fehler :(
das du nach dem übertragen d. Prog/nach anlegen der spannung den startpin kurz auf Gnd ziehen musst, damit das Prog startet weisst du ?
-> kurz reicht, jumper setzen geht auch.
Hmm, mir fällt nichts mehr ein...


zur bitmanipulation:
z. b.: define led8 bit[8] gibt der Speicherstelle bit[8] den namen led8.
die befehle ändern also den inhalt der speicherstelle bit[8]
1.) led8 = on
2.) gruppe1 = gruppe1 or &b10000000
gruppe1 = gruppe1 or &h80
gruppe1 = gruppe1 or 128
3.) looktab tab1, gruppe1, 0
bewirkt also immer, das bit[8] auf 1 gesetzt wird...

table tab1 ' sinnfreies beispiel!
128
tabend


MfG Lutz

Speed
09.10.2006, 14:57
Hi FriLu,
Das Lauflicht geht fast.

Ist es richtig das normalerweise alle LED´s an sind,
sie dann aber nacheinander (per lauflicht) kurz ausgehen sollten?

Wenn AD[1] an GND ist dann leuchten fast alle Lampen auf.
Ich habe davon ein Foto gemacht (nicht gerade die beste Qualität weil es mit einem Handy gemacht wurde)
http://img148.imageshack.us/img148/7875/speedlp3.jpg

Alle LED´s funktionieren aber ! O:)
Und der 573 hat Betriebsspannung und GND.

Wenn ich das Programm starte (mit dem Jumper) dann gehen die LED´s Aus die vorher An wahren und die die An wahren gehen Aus. Aber alles per lauflicht!

Liegt es vielleicht daran das nicht alle Eingänge des 74HCT573 mit dem Programm angesprochen werden?:-k
Der 573 hat doch 8 Eingänge (D0 – D7)
Mit dem Lauflicht Programm werden aber doch nur 2 benutzt

bus byteport[1]
und
byteport2 byteport[2]

Und

latch1 port [9]
latch2 port[10]
latch3 port[11]
hängen an den LE Eingang des Ic´s.

FriLu
09.10.2006, 20:44
Hi, Speed
ich nehme mal an, du hast den Conrad-Editor, da gibts einen simulations-modus.
Unter "ansicht" das Fenster Digitalports aufmachen, evtl auch analogports.
Programm kompilieren, dann kommen 2 buttons mit blauen Pfeilen in der Werkzeugleiste.
Den linken, "ausführen", kannst du leider vergessen, das Prog läuft zu schnell.
Der rechte, "einzelschritt" will jedesmal angeklickt werden (bis zum KRAMPF im Finger), aber man kann schön die befehle und die auswirkungen verfolgen, versuchs mal.
O:) O:) Ich hab' nen Kumpel, dem versuch ich schon seit Jahren den Unterschied zwischen Bits und Bytes beizubiegen, leider nur begrenzter Erfolg O:) O:)
>>Ein Byte besteht aus 8 Bit, demzufolge ein Byteport aus 8 Ports.<<
Bei der Unit: Byteport1 aus ports 1-8, Byteport2 aus port 9-16.
Wie bei den LEDs kannst du auch die ports einzeln definieren, z.b.
define bus1 port[1] ... define bus8 port[8]
Wenn du viel schreiben willst, schreib so:
bus1=on
bus2=off
bus3=off
bus4=off
bus5=off
bus6=off
bus7=off
bus8=off

ich schreib :
bus=1
das ist funktionell das gleiche, erklärung siehe oben. O:)
bei gruppex ists auch so, entweder jede led einzeln oder alle 8 zusammen... (gruppex ist ein aus 8 bits bestehendes Byte)


Wenn ich das Programm starte (mit dem Jumper) dann gehen die LED´s Aus die vorher An wahren und die die An wahren gehen Aus. Aber alles per lauflicht!
Hmm ¿¿ 8-[
Das mit ad1 auf grund hat nur den sinn, das das Prog immer durch den lp1-teil läuft, mehr gibts ja (erstmal) nicht.
Ich hab das ganze nur im simulator probiert, sehe aber keinen fehler :( :-k
::die '573er nennt man auch Latch, die an p9-11 angeschlossenen leitungen sind Latch-Enable, also Latch "ausgewählt"
die ports sind normal off (Latch gesperrt), der pulse befehl schaltet den port kurz auf "on", das daran angeschlossene Latch übernimmt die Daten vom Bus und gibt sie aus, bis zum nächsten puls. siehe auch bus_mit573.jpg.
Ich seh' grad noch:

Ist es richtig das normalerweise alle LED´s an sind,
sie dann aber nacheinander (per lauflicht) kurz ausgehen sollten?
wenn die leds nach+ angeschlossen sind, dann: Ja.
Das Prog gibt ja ein einzelnes ON aus (und 7 mal OFF)
sollte das so sein, geht das einfach zu ändern:
ändere die drei zeilen : bus = latch1 (2,3)
in : bus = not latch1 (2,3), also NOT einfügen, das dreht die "Bits" um :D

so, erstmal Schluss für heute.
MfG Lutz

Speed
12.10.2006, 20:00
Danke für die Hilfe.

Ich werde mal weiter rumprobieren.