-
LED-Cube programmieren
Hallo alle zusammen!
Ich werde einen LED-Cube nach folgendem Schaltplan mit einem ATTiny 2313 aufbauen.
Nun habe ich eine Frage zum Programm. Und zwar möchte ich dieses in C umschreiben (C ist für mich verständlicher).
Das ist der Programmcode für BASCOM:
Code:
$regfile = "2313def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 8000000 ' Achtung: Taktfrequenz per Fusebits auf 8 MHz einstellen!
'-------------------------------------------------------------------------------------------------
' Ports auf Ausgang setzen
'-------------------------------------------------------------------------------------------------
Ddrb = &B11111111
Ddrd = &B01111111
'-------------------------------------------------------------------------------------------------
' Variablen deklarieren
'-------------------------------------------------------------------------------------------------
Dim Bild As Word ' Aktuelle Bildnummer
Dim Maxbild As Word ' Nummer des letzten Bildes (=Zahl der Bilder in der Animation)
Dim Ebene As Byte ' Ebenen-ZŠhler
Dim Dauer As Byte ' Anzeigedauer des Bildes
Dim Temp As Word ' fŸr Berechnungen
Dim Offset As Word ' Position der zu holenden Daten
'-------------------------------------------------------------------------------------------------
' Hauptprogramm
'-------------------------------------------------------------------------------------------------
Do
Maxbild = Lookup(0 , Muster) ' Anzahl der gespeicherten Bilder holen
Maxbild = Maxbild - 1 ' 1 abziehen, da von 0 ab gezŠhlt wird
For Bild = 0 To Maxbild ' Bilder durchzŠhlen
For Dauer = 0 To 27 ' Dauer des Bildes, pro Durchlauf ca. 15 ms - also hier ca. 0,4 sek.
For Ebene = 0 To 2 ' 3 Ebenen durchmultiplexen
Offset = Bild * 6 ' Offset Berechnen, 6 Byte pro Bild
Temp = Ebene * 2 ' 2 Byte pro Ebene
Offset = Offset + Temp
Offset = Offset + 2 ' 1. Eintrag Ÿberspringen (Zahl der Bilder)
Portd = Lookup(offset , Muster) ' 1. Byte-Muster ausgeben
Offset = Offset + 1
Portb = Lookup(offset , Muster) ' 2. Byte-Muster ausgeben
Waitms 5 ' diese Ebene fŸr 5 ms anzeigen
Next Ebene
Next Dauer
Next Bild
Loop ' Programm von vorne beginnen
End
'-------------------------------------------------------------------------------------------------
Muster:
'-------------------------------------------------------------------------------------------------
$include "muster.txt" ' Datei mit Mustern einbinden
Und so sieht mein Programm im Moment aus:
Code:
#include <stdlib.h>
#include <avr/io.h>
// #include "def.h"
#include "muster.txt"
int main(void) {
int bilder;
int dauer;
int ebene;
/*###Initialisierungsphase###*/
//Pins bzw. Ports als Ausgänge konfigurieren
DDRB |= 0x00; //00000000 --> Alle als Ausgänge
DDRD |= 0x00; //00000000 --> Alle als Ausgänge
for ( bilder = 1; bilder <= 12; ++bilder ){
for ( dauer = 1; dauer = 27; ++dauer ){
for (ebene = 1; ebene = 3; ++ebene){
}
}
}
}
"def.h" ist estmal nicht weiter wichtig. "muster.txt" ist die Datei, die mit diesem Programm erstellt wurde. Sie liegt im gleichen Verzeichnis, wie die Quelldatei.
Meine muster.txt sieht im moment so aus:
Code:
Data 12% ' 12 Bilder in der Animation
Data &B01000000, &B00000000' Bild 1
Data &B00100000, &B00000000
Data &b00010001, &B11111111
Data &B01000000, &B00000000' Bild 2
Data &B00100001, &B11111111
Data &b00010000, &B00000000
Data &B01000001, &B11111111' Bild 3
Data &B00100000, &B00000000
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 4
Data &B00100001, &B11111111
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 5
Data &B00100000, &B00000000
Data &b00010001, &B11111111
Data &B01000000, &B00000000' Bild 6
Data &B00100000, &B00000000
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 7
Data &B00100000, &B00111000
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 8
Data &B00100001, &B00010001
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 9
Data &B00100000, &B10010010
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 10
Data &B00100000, &B01010100
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 11
Data &B00100000, &B00111000
Data &b00010000, &B00000000
Data &B01000000, &B00000000' Bild 12
Data &B00100000, &B00000000
Data &b00010000, &B00000000
1. Wie ist es möglich die muster.txt in die For-Schleife für die "ebene"-Variable zu implementieren?
2. Wie müssten eventuelle Änderungen am Programm / muster.txt aussehen?
So werden die Bits für den Cube definiert
Data &B01000001, &B11111111 ' oberste Ebene an
Data &B00100000, &B00000000 ' mittlere Ebene an
Data &B00010000, &B00000000 ' untere Ebene an
Die Reihen nach dem komma (z.B. &B11111111) setzen die bits für die Säulen.
Vielen Dank!
Torrent
-
Hallo
Ein "Bild" setzt sich aus drei Ebenen a 9 LEDs zusammen. PD4 bis PD6 sind die Ebenen, PB0 bis PB7 und PD0 die 9 Leds der jeweiligen Ebene. In den Datas sind pro Bild je drei Ebenen a 2 Bytes gespeichert. Im jeweils ersten Byte steckt in den Bits 6 bis 4 die Ebene, im Bit 0 und dem zweiten Byte die Leds der jeweiligen Ebene.
Um die Datas in eine für C verwendbare Form zu bringen, würde ich sie in ein zweidimensionales Array schreiben:
Code:
#include <stdlib.h>
#include <avr/io.h>
// #include "def.h"
// #include "muster.txt"
unsigned char muster[4][6]= // muster[Bildnummer][Bildmuster]
{
{
0b01000000, 0b00000000, // Bild 1
0b00100000, 0b00000000,
0b00010001, 0b11111111
},
{
0b01000000, 0b00000000, // Bild 2
0b00100001, 0b11111111,
0b00010000, 0b00000000
},
{
0b01000001, 0b11111111, // Bild 3
0b00100000, 0b00000000,
0b00010000, 0b00000000
},
//...
{
0b01000000, 0b00000000, // Bild 10
0b00100000, 0b01010100,
0b00010000, 0b00000000
}
};
int main(void)
{
int bildnr;
int ebene;
int dauer_bild;
int dauer_ebene;
//Pins bzw. Ports als Ausgänge konfigurieren
DDRB = 0xFF; // 0b11111111 --> Alle Pins an Port B als Ausgänge
DDRD = 0b01110001; // 0b01110001 --> Benutzte Pins an Port D als Ausgänge
while(1)
{
for ( bildnr = 0; bildnr < 4; bildnr++ )
{
for ( dauer_bild = 0; dauer_bild < 10000; dauer_bild++ ) // geschätzt
{
for (ebene = 0; ebene < 3; ebene++)
{
for(dauer_ebene = 0; dauer_ebene < 50; dauer_ebene++) // geschätzt
{
PORTD = muster[bildnr][ebene*2]; // Ebene und LED Säule 1 ausgeben
PORTB = muster[bildnr][ebene*2+1]; // LEDs Säule 2 bis 9 ausgeben
}
PORTD=0; // Ebene und LEDs aus
PORTB=0;
}
}
}
}
return 0;
}
(Selbstverständlich ungetestet)
Wenn du weiterhin das Muster includen willst, kannst du die Definition von muster[][] rauskopieren und als muster.txt speichern. Ich hoffe, das funzt so.
Sind 390 Ohm nicht etwas viel? Oder verwendest du LowCurrent-LEDs?
Gruß
mic
[Edit]
unsigned int muster[4][6] sollte natürlich ein unsigned char sein. Sorry
-
Vielen Dank für deine Hilfe!
Die ersten tests werden ja dann zeigen was ich noch tweaken muss :D
P.S.: mal sehen ich denke das passt schon so mit den LED's
Grüße
Torrent