ich habe noch ein Frage zum Multiplexen. Mit welcher Frequenz läuft nun der Cube bzw. wie lange braucht es bis ein Bild entsteht? Habe schon alles im www durchsucht aber finde keine passende erklärung dafür
Der Cube läuft mit 16 MHz vom Quarz, dann ist der Timer0 aktiviert und mit Vorteiler = 8 eingestellt. Dann ergibt das bei mir 16 MHz / prescale=8 / 8 Ebenen = 250KHz. Aber das kann ja gar nicht stimmen...
Ich habe vor, den gesamten Aufbau des Cubes zu dokumentieren... nun sitze ich an dem Programmablaufplan. Ich habe so einen noch nie erstellt... kannst du da mal ein Blick drüber werfen?
Danke dir erstmal für deine ausführlichen Antworten!
Na die "richtigen Stellen" sind halt, wenn man von vorne auf den Cube schaut, das Muster anliegt was auch eingegeben wurde Das die LEDs aus der richtigen, also gewollten Perspektive leuchten, kriege ich schon ausgetüftelt denke ich... was mich allerdings stutzig macht ist, wie du es auch schon gesehen hast, dass nicht nur das "L", sondern auch "E" und "D" nicht richtig zu erkennen sind. Beim "L" kommt eher ein "T" raus... also stimmt irgendwas mit der Spaltenadressierung nicht. Ich weiß aber noch nicht was... weißt du vielleicht wieso das so ist?
Und wie kann ich weitere "Bilder" wie z.B beim 3x3x3 Cube in den Code einbauen? Oder ist nun mit den 3 Pattern das Limit erreicht? Weil nur die werden ja hier abgerufen und wiederholt ausgegeben.
So, nun ist alles in dem Timer-ISR. Die 3 Pattern habe ich mit derselben Bitkombination jeweils bis 64 erweitert. "Clear_all" geht dementsprechend auch bis 64. Wie du schon vermutet hast, geht das bei Bascom nicht, dass ein Array bei 0 losgeht. Also habe ich "Incr Byteadress" eingefügt.
Der Cube leuchtet jetzt! Nur leider nicht ganz so wie er soll... Irgendwie ist die Adressierung verschoben und die Buchstaben "LED" sieht man jetzt von der Draufsicht... woran liegt das? Eigentlich soll er doch die jeweiligen 8 Bits aus den Pattern an den richtigen Stellen anzeigen. Hier ein kurzes Video von der Draufsicht. Vorne ist bei dem Cube auf der "rechten" Seite, wo die Platinen liegen. Irgendwie hat Youtube das Video gedreht...
Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
Und so sieht zur Zeit das Programm aus:
Code
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40
Dim Ebene As Byte
Ebene = 0
Dim Ebenenbit As Byte
Dim Buffer(64) As Byte
Dim Byteadress As Byte
Config Portb = Output 'Ebenen
Config Portc = Output 'Spalten
Config Porta = Output 'Latches LE
Config Timer0 = Timer , Prescale = 8 'Frequenz für Multiplexing runterteilen
On Timer0 Multiplex
Enable Timer0
Enable Interrupts
Gosub Clear_all 'Lösche Matrix
Looping:
Gosub Show_pattern_1 'Stelle "Irgendwas" dar
Wait 1
Gosub Show_pattern_2 'Stelle "Irgendwas" dar
Wait 1
Gosub Show_pattern_3 'Stelle "Irgendwas" dar
Wait 1
Gosub Clear_all 'Lösche Matrix
Goto Looping
'-----------------------------------------------------------------------
Multiplex:
Portc = 0 'Spaltentreiber abschalten
Incr Ebene 'Ebene hochzählen
If Ebene = 8 Then Ebene = 0 'Überlauf abfangen
Portb = Ebene 'Ebenentreiber umschalten
Portb.3 = 1 ' Latch-Ausgang aus
Byteadress = Ebene * 8 ' Nummer des ersten Bytes in der aktuellen Ebene
Incr Byteadress
Porta = 0 ' alle Latch-Strobes deaktivieren
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
PortA.7 = 1
Porta.7 = 0 ' Puls erzeugen, damit das Latch 1 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
PortA.6 = 1
Porta.6 = 0 ' Puls erzeugen, damit das Latch 2 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
PortA.5 = 1
Porta.5 = 0 ' Puls erzeugen, damit das Latch 3 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.4 = 1
Porta.4 = 0 ' Puls erzeugen, damit das Latch 4 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.3 = 1
Porta.3 = 0 ' Puls erzeugen, damit das Latch 5 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.2 = 1
Porta.2 = 0 ' Puls erzeugen, damit das Latch 6 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.1 = 1
Porta.1 = 0 ' Puls erzeugen, damit das Latch 7 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.0 = 1
Porta.0 = 0 ' Puls erzeugen, damit das Latch 8 die Daten übernimmt
Portb.3 = 0 ' Latch-Ausgang an
Return
'------------------------------------------------------------------------
Show_pattern_1:
Buffer(1) = &B00000011
Buffer(2) = &B00000011
Buffer(3) = &B00000011
Buffer(4) = &B00000011
Buffer(5) = &B00000011
Buffer(6) = &B00000011
Buffer(7) = &B11111111
Buffer(8) = &B11111111
...
...
Buffer(63) = &B11111111
Buffer(64) = &B11111111
Return
Show_pattern_2:
Buffer(1) = &B11111111
Buffer(2) = &B11111111
Buffer(3) = &B00000011
Buffer(4) = &B00111111
Buffer(5) = &B00111111
Buffer(6) = &B00000011
Buffer(7) = &B11111111
Buffer(8) = &B11111111
...
...
Buffer(63) = &B11111111
Buffer(64) = &B11111111
Return
Show_pattern_3:
Buffer(1) = &B00011111
Buffer(2) = &B01111111
Buffer(3) = &B11100011
Buffer(4) = &B11000011
Buffer(5) = &B11000011
Buffer(6) = &B11100011
Buffer(7) = &B01111111
Buffer(8) = &B00011111
...
...
Buffer(63) = &B01111111
Buffer(64) = &B00011111
Return
Clear_all:
Buffer(1) = 0
Buffer(2) = 0
Buffer(3) = 0
Buffer(4) = 0
Buffer(5) = 0
Buffer(6) = 0
Buffer(7) = 0
Buffer(8) = 0
...
...
Buffer(63) = 0
Buffer(64) = 0
Return
Hallo Pesi! Erst einmal möchte ich mich für deine Mühe bedanken! Ich habe versucht den Code zusammenzuschreiben... Beim Block "Multiplex" habe ich Ebene und Spalte den dazugehörigen Ausgängen als Kommentar beigeschrieben. Kann es sein das die in deinem Beispiel-Code verdreht sind?
In der Zeile 102 und 105 schreibt Bascom beim Prüfen der Syntax: "Invalid datatype" ?! Was mache ich falsch? Und bei den Pattern muss ich wahrscheinlich auch 8 anstatt 3 auflisten, oder?
Code
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40
Dim Ebene As Byte
Ebene = 0
Dim Ebenenbit As Byte
Dim Buffer(64) As Byte
Config Portb = Output 'Ebenen
Config Portc = Output 'Spalten
Config Porta = Output 'Latches LE
Config Timer0 = Timer , Prescale = 8 'Frequenz für Multiplexing runterteilen
On Timer0 Multiplex
Enable Timer0
Enable Interrupts
Gosub Clear_all 'Lösche Matrix
Looping:
Gosub Show_pattern_1 'Stelle "Irgendwas" dar
Wait 1
Gosub Show_pattern_2 'Stelle "Irgendwas" dar
Wait 1
Gosub Show_pattern_3 'Stelle "Irgendwas" dar
Wait 1
Gosub Clear_all 'Lösche Matrix
Goto Looping
'-----------------------------------------------------------------------
Multiplex:
Portc = 0 'Spaltentreiber abschalten
Incr Ebene 'Ebene hochzählen
If Ebene = 8 Then Ebene = 0 'Überlauf abfangen
Ebenenbit = Ebene - 1
Portb = Buffer(ebene) 'Ebenentreiber umschalten
Portc.ebenenbit = 1 'Spaltentreiber einschalten
Return
'------------------------------------------------------------------------
Show_pattern_1:
Buffer(1) = &B00000011
Buffer(2) = &B00000011
Buffer(3) = &B00000011
Buffer(4) = &B00000011
Buffer(5) = &B00000011
Buffer(6) = &B00000011
Buffer(7) = &B11111111
Buffer(8) = &B11111111
Return
Show_pattern_2:
Buffer(1) = &B11111111
Buffer(2) = &B11111111
Buffer(3) = &B00000011
Buffer(4) = &B00111111
Buffer(5) = &B00111111
Buffer(6) = &B00000011
Buffer(7) = &B11111111
Buffer(8) = &B11111111
Return
Show_pattern_3:
Buffer(1) = &B00011111
Buffer(2) = &B01111111
Buffer(3) = &B11100011
Buffer(4) = &B11000011
Buffer(5) = &B11000011
Buffer(6) = &B11100011
Buffer(7) = &B01111111
Buffer(8) = &B00011111
Return
Clear_all:
Buffer(1) = 0
Buffer(2) = 0
Buffer(3) = 0
Buffer(4) = 0
Buffer(5) = 0
Buffer(6) = 0
Buffer(7) = 0
Buffer(8) = 0
Return
Portb = Ebene
Portb.3 = 1 ' Latch-Ausgang aus
Byteadress = Ebene * 8 ' Nummer des ersten Bytes in der aktuellen Ebene
Porta = 0 ' alle Latch-Strobes deaktivieren
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
PortA.7 = 1
Porta.7 = 0 ' Puls erzeugen, damit das Latch 1 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
PortA.6 = 1
Porta.6 = 0 ' Puls erzeugen, damit das Latch 2 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
PortA.5 = 1
Porta.5 = 0 ' Puls erzeugen, damit das Latch 3 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.4 = 1
Porta.4 = 0 ' Puls erzeugen, damit das Latch 4 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.3 = 1
Porta.3 = 0 ' Puls erzeugen, damit das Latch 5 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.2 = 1
Porta.2 = 0 ' Puls erzeugen, damit das Latch 6 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.1 = 1
Porta.1 = 0 ' Puls erzeugen, damit das Latch 7 die Daten übernimmt
Incr Byteadress ' nächstes Byte ausgeben
Portc = Buffer(byteadress) ' zugehöriges Byte an den Latch-Eingang legen
Porta.0 = 1
Porta.0 = 0 ' Puls erzeugen, damit das Latch 8 die Daten übernimmt
Portb.3 = 0 ' Latch-Ausgang an
ich melde mich mal wieder nach fertigem Zusammenbaus des Cubes. Die Platinen sind fertig, die Matrix und die Säule auch. Bilder folgen in kürze! Nun hänge ich an der Programmierung ... mit dem waitms Befehl kommt man leider nicht weit.
Ich habe versucht mir an diesem Beispiel (10*10*10 Led Cube) ein Bild davon zu machen, wie so ein Programm aussehen kann. Leider ist er mit Schieberegistern und nicht wie meiner mit Latches aufgebaut. Demnach paßt auch das Programm nicht.
Wie kann man schnell und einfach den Code ändern, damit er auf meinen paßt? Irgendwie tue ich mich schwer damit.
Die Pinbelegung vom Atmega32 sieht folgendermaßen aus:
Sorry, nicht böse gemeint, aber oft verstehe ich Deine Gedankengänge/Rechnungen/Messungen einfach nicht
Wahrscheinlich drücke ich mich nicht deutlich genug aus. Werde mir in Zukunft mehr Mühe geben!
Mit dem "Platz ist nur begrenzt vorhanden" meinte ich, dass genau an der Stelle wo der 7805 plaziert ist, für einen evtl. größeren Spannungsregler wenig Platz ist. Klar könnte man den auch an einer anderen Stelle plazieren, so gesehen ist ja noch eine freie Fläche da... dann müssten aber die Leiterbahnen neu verlegt werden...und ob dann noch der Platz ausreicht, ist fraglich. Und von fliegender Verdrahtung halte ich nichts...das wäre dann *fusch*
Ist aber egal... das Problem ist nun gelöst! Pesi du hast ja recht, es ist einfacher jeweils eine Leitung zu den UDNs an die beiden Platinen zu verlegen, anstatt den Regler zu tauschen... Das habe ich nun gemacht und siehe da: Der Regler wird nicht mehr heiß und die Helligkeit der LEDs stimmt auch...also alles wie *eigentlich* geplant! Danke für die Hilfe!
Gruß
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen.Weitere InformationenSchließen