- LiFePO4 Speicher Test         
Ergebnis 1 bis 3 von 3

Thema: LED-Cube programmieren

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355

    LED-Cube programmieren

    Anzeige

    Praxistest und DIY Projekte
    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
    MfG Torrentula

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Vielen Dank für deine Hilfe!

    Die ersten tests werden ja dann zeigen was ich noch tweaken muss

    P.S.: mal sehen ich denke das passt schon so mit den LED's

    Grüße

    Torrent

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen