PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-Cube programmieren



Torrentula
08.12.2010, 15:59
Hallo alle zusammen!

Ich werde einen LED-Cube nach folgendem Schaltplan (http://www.ledstyles.de/index.php?page=Attachment&attachmentID=5162&h=14fd27d042c0853320f7f045e11838b113fe8373) 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:



$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:



#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 (http://www.ledstyles.de/index.php?page=Attachment&attachmentID=5171&h=eb9af6df748be87f0ec569f49ba2482bfb89953f) erstellt wurde. Sie liegt im gleichen Verzeichnis, wie die Quelldatei.


Meine muster.txt sieht im moment so aus:



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

radbruch
08.12.2010, 17:16
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:

#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

Torrentula
08.12.2010, 18:31
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