PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multiplexer Schaltlogik vereinfachen



Lenox
15.01.2007, 15:58
Tach,
versuche grad die Ansteuerungen eines Multiplexers (für Lauflicht) zu vereinfachen (74HC4514).
Leider funktioniert es aber nicht so wie ich es gern hätte.



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

'Belegung
Config Porta.0 = Output 'an A0
Config Porta.1 = Output 'an A1
Config Porta.2 = Output 'an A2
Config Porta.3 = Output 'an A3

'Defines
A0 Alias Porta.0
A1 Alias Porta.1
A2 Alias Porta.2
A3 Alias Porta.3

'Multiplexer (74HC4514)
Led0 Alias A0 = 0 And A1 = 0 And A2 = 0 And A3 = 0 'an Q0
Led1 Alias A0 = 1 And A1 = 0 And A2 = 0 And A3 = 0 'an Q1
Led2 Alias A0 = 0 And A1 = 1 And A2 = 0 And A3 = 0 'an Q2
Led3 Alias A0 = 1 And A1 = 1 And A2 = 0 And A3 = 0 'an Q3

Led0 = 0
Led1 = 0
Led2 = 0
Led3 = 0

'Hauptprogramm

Do
Led0 = 1
Wait 1
Led0 = 0
Led1 = 1
Wait 1
Led1 = 0
Loop

'usw halt

End


Wisst ihr wie ich das lösen könnte?

Mfg
Stefan

albundy
15.01.2007, 17:22
eventuell so ...


Dim Led As Byte

Do
If Led < 16 Then Incr Led Else Led = 0
Porta.0 = Led.0
Porta.1 = Led.1
Porta.2 = Led.2
Porta.3 = Led.3
Wait 1
Loop

dann kannst du dir die ganzen Definitionen sparen.

Lenox
15.01.2007, 17:46
Sorry, aber das versteh ich nicht ganz.
Ich hab ja am Multiplexer 4 Eingänge mit denen (je nach Bitmuster) ich eine von 16 Ausgängen schalten kann.

Aber ich will nicht jedesmal

A0 = 0
A1 = 0
A2 = 0
A3 = 0

schreiben damit LED1 an geht.

Ich will halt haben, das wenn ich ihm sage

LED1 = 1

er den oberen Ablauf jedesmal automatisch macht.

Lenox
15.01.2007, 19:44
Hab ihn jetzt mal manuell angesteuert.

Do
A0 = 0
A1 = 1
A2 = 0
A3 = 0
Waitms 500
A0 = 1
A1 = 0
A2 = 1
A3 = 1
Waitms 500
Loop

Allerdings hängt sich das Ding öfters auf.
Wenn ich mich über die Schaltung beuge geht es.
Versteh ich nicht.
Ist das ding so emfindlich oder hat das was gegen mich -.-

albundy
15.01.2007, 19:55
[
Sorry, aber das versteh ich nicht ganz.


was verstehst du daran nicht ?

Porta (A0-A3) übernimmt das Bitmuster von der Variablen "LED".
1. Durchlauf: Bitmuster = 0001 / Ausgang Q0 = High (LED0=1)
2. Durchlauf: Bitmuster = 0010 / Ausgang Q1 = High (LED1=1)
3. Durchlauf: Bitmuster = 0011 / Ausgang Q2 = High (LED2=1)
...
16. Durchlauf: Bitmuster = 1111 / Ausgang Q15 = High (LED16=1)


PS:
Wen stellt eigendlich dein Avatar dar ? Sieht fast wie Lenin aus.

Lenox
15.01.2007, 20:09
Stromberg aus ProSieben.
Oky ich teste es gleich mal.

Lenox
15.01.2007, 22:42
Jo geht, auch wenn ich es noch nicht ganz versteh,

Was bewirkt Porta.0 = Led.0? Led zählst du hoch ist kla, d
ann hättest du doch 1.0?
Porta.0 = 1.0 ?!

Sorry blick da noch nicht so durch!

Wie geht es jetzt bei Led.4 weiter?

Enable muss doch auf GND, außer bei Q1 da muss es auf Vcc oder?
Was ist mit Latch enable input, hab das unbenutzt.

Ratber
15.01.2007, 23:32
Der 74HC4514 arbeitet Binär und du rechnest Dezimal.

Das ist der Denkfehler.

Lenox
15.01.2007, 23:39
Ja genau das mein ich ja.
Daher hab ich es auch nicht verstanden.
ich hab doch 4 Eingänge die je low/high sein können.

Aber ich hab jetzt noch immer 2 Probleme.

1. Was mache ich mit LE?

2. Ist das Problem noch immer nicht gelöst.
Jedesmal wenn eine Led angeschaltet werden soll muss ich "per hand" alle 4 Ausgänge setzen.

Mfg
Stefan

Achja, die Ausgänge sollten doch LEDs verkraften können oder?
Find da irgentwie nichts zu.

Ratber
15.01.2007, 23:47
LE schaltet das Bitmuster an den 4 Eingängen aktiv.

Damit verhinderst du zb. zufällige Bitmuster wenn er an nem Bus hängt..

Bei einer Anwendung ist das aber uninteressant.
Kannst ihn dauerhaft Akiv lassen.(Sag ich jetzt ohne ins Datenblatt geschaut zu haben)




Ist das Problem noch immer nicht gelöst.
Jedesmal wenn eine Led angeschaltet werden soll muss ich "per hand" alle 4 Ausgänge setzen.

Verknüf doch einfach eine Variable mit dem ganzen Port.

Dann gibst du nur noch an welche leuchten soll.
Also LED= 5 bringt LED 5 zum Leuchten,LED 16 schaltet LED16 an usw.
Ganz einfach.

Lenox
16.01.2007, 06:22
Hatte ich ja
Led0 Alias A0 = 0 And A1 = 0 And A2 = 0 And A3 = 0

Aber das ging nicht. Einfach:
Led0 = A0 = 0 And A1 = 0 And A2 = 0 And A3 = 0
oder?

Im DB steht bei LE latch enable input (activ high)
E enable input (activ Low)

Dann muss E wohl auf GND sein damit er läuft (geht irgentwie aber auch ohne, nu LEDs sind schwächer, und er hängt sich manchmal auf).
Einfach per Transistor hinterm µC auf GND schalten oder?

Und LE werd ich dann wohl besser jedesmal setzen son läuft das Lauflich ja viel zu unsauber.

Ratber
16.01.2007, 07:22
Also so wie du das da machst geht das nicht.

Nimm mal nur den 74HC4514

An jeden der 16 Ausgänge hängt ne LED.
Latch und Enable lassen wir malö weg.

Bleiben die 4 Eingänge.

Die 4 Bit stellen ja prima 16 Zustände dar also gehts streng Binär zu.

0000 = LED 0 Leuchtet.
0001 = LED 1
0010 = LED 2
0011 = LED 3
..
..
..
..
1101 = LED 13
1110 = LED 14
1111 = LED 15

Dh. die 4 Eingänge kommen an den Controller.


Wenn du jedem Pin eine Variable zuordnest dann mußt du umständlich jede Variable einzeln setzen was nicht sinvoll ist.

Nimm doch einfach den Port befehl.

Aoso die 4 Leitungen zb. an Port B.0 bis 3

Dann ist das Prrogramm recht einfach für ein einfaches Lauflicht.


Config Portd = output
....
...
..
.
Do
For X = 0 to 15
Portd = x
Waitms 200
Next X
Loop

End


Wenn du unbedingt noch Latch nutzen willst dann häng ihn zb. an Portd.4

Das Programfragment dazu kann dann so aussehen.


Config Portd = output
....
...
..
.
Do
For X = 0 to 15
Reset Portd.4
Portd = x
Set Portd.4
Waitms 200
Next X
Loop

End

Schon biste fertig.


Das ist aber nur ein ganz primitives Beispiel.
Es gibt zig möglichkeiten das zu bewerkstelligen.
Du kannst es auch noch mit Alias verknüpfen.
Und wenn du weitere 74HC4514 an die gleichen 4 Pinne hängst und den jeweiligen LE an die noch freien D5-7 verteilst dann kannst du gleich mehrere 74HC4514 an einem Port betreiben.
Oder du setzt die LE's über einen Dekoder an die oberen 4 Bit des Ports und schaffst dir so ein 16x16 Bit langes Lauflicht mit 256 LEDs
usw. usw.

Die Grenze liegt eigentlich nur in deiner Phantasie und bei der Rechenleistung des jeweiligen Controllers.

Schau dir mal ruhig die Hilfe an und such mal nach Pin und Portbefehlen und die vielen Spielmöglichkeiten.

Lenox
16.01.2007, 10:59
Hey,
danke jetzt hab ich es verstanden.
Bin grad in der Schule und kann es deshalb noch nicht testen.

In Bascom funktioniert bei mir die Hilfe irgentwie nicht, ich kann die Themen nicht öffnen. Passiert einfach nichts.

Portd = x
ich dachte man kann immer nur Portd = 0 (low) bzw Portd = 1 (high) machen.

Naja oky ich werd es nachher mal testen und noch was damit rumspielen, danke.

Ratber
16.01.2007, 11:06
n Bascom funktioniert bei mir die Hilfe irgentwie nicht, ich kann die Themen nicht öffnen. Passiert einfach nichts.

Ist auch nicht schade drum.

Zieh dir mal das Handbuch als PDF das ist besser.



Portd = x
ich dachte man kann immer nur Portd = 0 (low) bzw Portd = 1 (high) machen.

Nein,was du meinst ist Portx.y = n
Nur mit Portx = n gibst du auf dem ganzen Port (Also alle 8 Bit) den Zahlenwert aus der dann Binär dargestellt wird.
Logischerweise maximal ein Byte.

Da der Expander in unserem Beispiel an den untersten 4 Bit hängt kann man schön mit 0 bis 15 die LED'S 0 bis 15 leuchten lassen.

Lenox
16.01.2007, 14:55
Achsoo, danke jetzt hab ich es verstanden!
Oky gut. Dann werd ich die Schaltung mal soweit aufbauen, und dann weiterschauen.
Ich muss mir nochmal Interrupts angucken (Programm per IR unterbrechen).
Und Software Pwm, dann müsste ich es eig. hinbekommen.

Lenox
21.01.2007, 20:44
[EDIT] sorry hat sich schon geklärt

Lenox
21.01.2007, 21:55
So, der Code fürs Lauflicht ist fertig.
Aber ich noch bekomme Errors mit den Set/Reset Befehlen.

"Variable can not be used with Set"
bzw
"Variable can not be used with Set"



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Waitms 50 'Einschwingzeit

Config Portd = Output
Config Portc = Output

Portd.4 Alias Enable1 'low = active
Set Enable1
Portc.4 Alias Enable2 'low = active
Set Enable2

Dim I As Integer 'Laufvariable
I = O

Dim Time As Integer
Time = 200 'Lauflicht Intervall


'Hauptprogramm
Print "Starte Hauptprogramm"
Do

Reset Enable1
Print "Multiplexer 1 = an"
Do
For I = 0 To 15
Portd = I
Print I
Waitms Time
Next I
Loop
Set Enable1
Print "Multiplexer 1 = aus"

Reset Enable2
Print "Multiplexer 2 = an"
Do
For I = 0 To 11
Portd = I
Print I
Waitms Time
Next I
Loop
Set Enable2
Print "Multiplexer 2 = aus"

Loop
End

albundy
21.01.2007, 22:39
Portd.4 Alias Enable1 'low = active
Set Enable1
Portc.4 Alias Enable2 'low = active
Set Enable2


ist falsch angewendet.

Enable1 Alias Portd.4 'low = active
Set Enable1
Enable2 Alias Portc.4 'low = active
Set Enable2

so funktioniert es.

Lenox
21.01.2007, 22:43
Ups *schäm*

Danke

Lenox
31.01.2007, 17:10
So Hardware ist fertig (bilder kommen noch), aber funktioniert irgentwie nicht *grml*

Da ich den Fehler nicht finde, hier mal der Schaltplan und der Code (schon ganz simpel gemacht)

http://dastefan.da.funpic.de/AVR/Lauflicht.GIF



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Waitms 50 'Einschwingzeit

Config Porta = Output
Config Portc = Output

Portc.5 = 1 'Elkos Masse
Porta.4 = 0 'Enable1 active = low

Do

Porta.0 = 1
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0

Wait 1

Porta.0 = 0
Porta.1 = 1
Porta.2 = 0
Porta.3 = 0

Wait 1

Porta.0 = 0
Porta.1 = 0
Porta.2 = 1
Porta.3 = 0

Wait 1

Loop


Q1 Led (anstadt Q0) kann ich an/ausschalten (mit Enable) aber der Rest geht garnicht.
Verstehe echt nicht was daran falsch ist, hab auch nochmal die Ausgänge am uC gemessen, alles OK.

Der Multiplexer geht einfach nicht, aber warum?
Auf dem Steckbrett hatte es noch funktioniert!

Mfg

Lenox
31.01.2007, 18:06
So habs hinbekommen, hab einfach mal Wait auf 2 hochgeschraubt, irgentwie verschlucht er imemr ein paar Leds (jedesmal unterschiedlich)



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

Waitms 50 'Einschwingzeit

Config Porta = Output
Config Portc = Output

Portc.5 = 0 'Elkos Masse
Porta.4 = 0 'Enable1 active = low

Dim I As Byte
Print "Start"

Do
For I = 0 To 15
Print "1"
Porta = I
Wait 2
Next I

Loop


Ist der vielleicht defekt? Ich weiß echt nicht was falsch ist, er funktioniert ja, nur bleibt imemr "hängen".

Sicher das LE freibleibt?