PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8x8 Matrix ?



whynot
11.07.2008, 18:02
Hallo,
Ich wollte einen Matrix ansteuern so 5x8 besser 8x8.
Jetz dachte ich mir wenn ichs dem µC einfacher mache müste es leichter zu machen sein.
AtMega8, 2x 4051(8fach multiplexer/dem.) an je drei ports, und daran angeschlossen
jeweils ein ULN2803 und ein UDN2981. INH von den 4051 an OC1A

In meiner Naivität dachte ich ich lege ein Array 64Byte an, oder nen Speicherbereich,
hinterlege dort die Helligkeitswerte und gut.
So nach dem Motto:

Do
For x = 0 to 63
Compare1a = A(x)
PORTD = X
Next
Loop

Ein hübschen blinken ja, gezielte Ansteuerung eher nicht.
Soll eigentlich für einen Bekannten sein, grosses Brett-(Rollenspiel) "Mittelalter" 2-3 qm.
Sollen viele Fackel "brennen", möglichst hübsch halt.
Das was es jetzt macht passt eher zu ner Technoparty :-(

Wäre schön wenn da jemand anregungen oder Ideen in Bascom hätte.
Nach möglichkeit ohne I2C Spezial ICs.

Gruss Achim

PicNick
11.07.2008, 18:51
Indizes gehen bei Bascom von 1 weg, nicht von 0

Ich mißtraue, dass das mit dem Compare so funzt.
1) mach ein Waitms 100 oder so in die Schleife (vor dem Next)

2) Versuch es mal ohne dem compare, setze OC1A direkt auf 0 u. 1
und mach ein nachvollziehbares Muster in das array. ob das ganze überhaupt so passt

whynot
12.07.2008, 00:13
Hallo robert,

also mit 1 und 0 und wait gar kein problem.
Mit 1 und 0 ohne wait ein Problem.
Ich hatte auch erst mit wait getestet ob die Matrix so funktioniert.
Und ohne wait nahm ich an das es ein Softwareproblem ist.

Mit höherer Frequenz fangen auch die ungwewollten LEDs an zu glimmen,
bis es schliesslich bei max. Frequenz eine helle Gläche ist. Bis 1ms verzögerung
erträglich dann fällt es auf. Verschieden Umbauten gemacht

Einen Fet vor den ULN 2803 gesteuert von OC1A.
Den UDN2981 durch Transistoren ersetzt. bzw mit grossem VorWiderstand direkt
von den 4051 Treiben lassen.
Ein zusätzliches Port auf die INH-Eingänge der 4051 zum dunkelschalten während
des setzens der neuen Werte.
Alles ohne erfolg.

Da werde ich wohl noch mal suchen müssen.

PB0 - PB7 Zeilen
PD0 - PD7 Spalten
Und dann auf eins von beiden eine 8fach software PWM.(wenn ich finde wie mans macht)
Währe das eine machbare Sache mit eine mega 8 ?
Ich habe schon das Forum durchsucht aber nichts wirklich passendes gefunden.

Für jeden Tip Dankbar.

Gruss Achim

PicNick
12.07.2008, 12:06
Wenn's schneller wird, überlappt sich die sache, d.h. die stellst über PortD eine Led ein, hast aber noch den compare von der vorigen LED

du müsstest eigentlich:


Do
For x = 0 to 63 ' nächster
PORTD = X ' Auswahl der LED
compare = a(x) ' mehr oder weniger aufrehen
Waitms nn ' etwas leuchten lassen
compare = 0 ' auf jeden Fall abdrehen
Next ' weiter
Loop

whynot
13.07.2008, 22:33
Hallo robert,

Gebastelt, verworfen, geb.... usw. Jetz nur noch ein ULN2803 mit Fet davor.
Den vorherigen Fehler denke ich gefunden zu haben, aber jetzt gehts so.
Ist was bei rausgekommen was für das geforderte den zweck erfüllt,
naja 24 1/2 LEDs die erste will nicht, ist aber bestimmt zu verbessern.
Also 2xmal bauen.

Du kanst ja wenn Du lust hast mal nen Blick drauf werfen und ein paar
Anregungen geben. So von wegen Lerneffekt.


$regfile = "M8def.dat"
$crystal = 16000000
$hwstack = 50
$swstack = 10
$framesize = 40

Ddrb = &B00011111
Ddrc = &B00000001
Ddrd = &B00011111

Portb = &B00000001
Portd = &B00000001

Dim Z As Integer
Dim Z1 As Integer
Dim Z2 As Integer
Dim A(25) As Byte
Dim B(25) As Byte
Dim C As Byte
Dim X As Byte
Dim Y As Byte

Config Adc = Single , Prescaler = Auto
Start Adc
Config Timer0 = Timer , Prescale = 8
Enable Timer0
Enable Interrupts
On Ovf0 Test

Do

Z1 = Getadc(5)
Z2 = Getadc(4) / 20
For Y = 1 To 25
A(y) = Rnd(z2)
Next

Loop

Test:
Portc.0 = 0 'FET
Incr Z : If Z > Z1 Then Z = 0
Incr X : If X => 25 Then X = 0
If B(x) < 1 Then B(x) = 1 : Decr B(x)

Portb = Portb * 2 : If Portb => 32 Then Portd = Portd * 2
If Portb => 32 Then Portb = 1
If Portd => 32 Then Portd = 1

If B(x) > 0 Then Portc.0 = 1 Else Portc.0 = 0
If Z = 0 Then C = Memcopy(a(1) , B(1) , 25)

Return

Ich würde gerne ausser den zwei Potis noch einen Schalter in die Kiste bauen
um Prescale von timer0 über einen Schalter festzulegen. (vor dem Einschalten)
Ich habe Testweise eine Variable ausprobiert, gibt aber eine Fehlermeldung.
Weil dann kann man alles einstellen, von ruhigem Wandbild bis Techno. :-)

Läst sich das irgendwie machen ?


Gruss Achim