-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Led Cube Ansteuern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.07.2007
    Beiträge
    15

    Led Cube Ansteuern

    Anzeige

    Hallo,

    Ich hab mir gesetrn mal auß Spaß so einen kleinen 3x3x3 Led Würfel gebaut.
    Der Würfel wir auf den 3 ebenen gemultiplext.
    Ich bin ziehmlicher anfänger auf dem Gebiet der uC programmierung, hab nur am Pc in Basic was gemacht.
    Ich würde den Würfel gerne über solche
    Tabellen steuern in der Form:
    &b000,&b000, &b000, &b000, &b000 ,&b000, &b000 ,&b000, 5000

    Immer eine Zeile mit 3 leds wird angegebnen also ingesamt 27
    und die 5000 ist die anzeigedauer in millisekunden. Die Anschlussbelegung wird aus dem Code ersichtlich. Mit dem Code gehen aber nur alle LED's an und es tut sich sonst nichts. Wie muss der Code aussehen damit das funktioniert?

    Lukas

    Code:
    $regfile = "m16def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Config Porta = Output
    Config Portc = Output
    
    Gnd1 Alias Portc.2
    Gnd2 Alias Portc.1
    Gnd3 Alias Portc.0
    
    Ledvornlinks Alias Porta.0
    Ledvornmitte Alias Porta.1
    Ledvornrecht Alias Porta.2
    
    Ledmittelinks Alias Porta.3
    Ledmittemitte Alias Porta.4
    Ledmitterecht Alias Porta.5
    
    Ledhintenlinks Alias Portc.7
    Ledhintenmitte Alias Portc.6
    Ledhintenrecht Alias Portc.5
    'ebene 0 ist an
    'led 1 ist an
    Porta = 0
    Gnd1 = 1
    Gnd2 = 1
    Gnd3 = 1
    
    
    
    Dim Temp As Word
    Temp = 0
    
    Do
    
    
                                               ' das ergebnis 1-16 ---> 0 - 15 (s.o.)
    Temp = Temp * 9                                             ' wie gehabt
    Porta = Lookup(temp , Daten) ; Lookup(temp -1 , Daten)      ' die erste Spalte
    Incr Temp
                                                        
    Incr Temp
    Portc = Lookup(temp , Daten)                                
    Incr Temp
    Gnd1 = 0
    Gnd2 = 1
    Gnd3 = 1
    Porta = Lookup(temp , Daten)                                
    Incr Temp
    Porta = Lookup(temp , Daten)                              
    Incr Temp
    Porta = Lookup(temp , Daten)                               
    Incr Temp
    Gnd1 = 1
    Gnd2 = 0
    Gnd3 = 1
    Porta = Lookup(temp , Daten)                              
    Incr Temp
    Porta = Lookup(temp , Daten)                               
    Incr Temp
    Porta = Lookup(temp , Daten)                               
    Incr Temp
    Gnd1 = 1
    Gnd2 = 1
    Gnd3 = 0
    
    Temp = Temp + 1
    
    
    Loop
    
    
    
    Daten:
    Data &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , &B000 , 1000
    Data &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , 1000
    Data &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , &B100 , 1000
    Data &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , &B001 , 1000
    Data &B000 , &B111 , &B000 , &B000 , &B111 , &B000 , &B000 , &B100 , &B000 , 1000

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Das mit den "1000" in jeder "data" Zeile is mir nicht klar, was das bewirken soll.
    btw: für "1000" müßtest du 1000% schreiben, dann isses ein Word, braucht aber 2 byte, logo.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    31.07.2007
    Beiträge
    15
    also die 1000 soll die Anzeigedauer in millisekunden sein.
    Ich hab keine Ahnung wie ich die notieren soll.
    Jede DATA zeile soll ein Bild darstellen.

    Lukas

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Schmeiß die anzeigedauer raus, die brauchste doch eh nicht - lass das Ding so schnell multiplexen, wie es kann, wen störts?
    Die GNDs würd ich noch mit
    FOR PortC = 1 TO 3
    ansteuern, dann wechseln sie wirklich synchron.

    Es kann auch sein, dass du noch zwischen die neuen Daten einmal alle LEDs ausmachen musst - also:
    - PortC = 1
    - Daten rein
    - kurz warten (Konstante einbauen)
    - PortC = 0
    - neue Daten rein
    - PortC 2
    Ansonsten treten Geisterbilder auf!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    31.07.2007
    Beiträge
    15
    also gemultiplext wird so schnell es kann nur die Anzeigedauer soll für ein einzelnes Bild stehn.
    Es sollen also Später für kleine Animationen sehr vile socher DATA reihen untereinander kommen.
    Das mit den Geisterbildern krieg ich schon hin nur wie ich die Daten
    aus der Tabelle korrekt ausgebn soll ist mir schleierhaft.

    Lukas

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Es kann sein, dass du die Byte-Werte kompletto schreiben musst - also nicht "Data &B100" sondern "Data &B00000100" - ansonsten setzt er vielleicht die Bits auf der falschen Seite des Ports um.

    Und schmeiß das 1000 am Ende der Datalines raus, das kannst du einfacher in ner Konstante speichern.
    Und WENN du es in Data speichern willst, dann MUSST du ein "%" dahinter setzen!

    Aus der Bascom-Hilfe (Seite 409):
    Dta2:
    Data 1000% , -1%
    'Note that integer values (>255 or <0) must end with the %-sign
    'also note that the data type must match the variable type that is
    'used for the READ statement
    Und daher KANN das so erstmal nicht klappen, denn:
    A - ist dein Port in den du ausgibst nur 8 Bit breit und
    B - Die "1000" in Data nicht richtig gekennzeichnet

    Und lad mal ein Bild des Würfels hoch, würde mich mal interessieren!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    31.07.2007
    Beiträge
    15
    Ja also das programm war nur mal zum probieren. Ich hab ja eben keine Ahnung wie ich das ganze ausgeben soll.
    6 led's sind an porta und 3Led's und 3x GND and portc.
    Später soll ja eine SChleife laufen die die Daten aus der Tabelle als ein bild (frame einer animation) ausgibt
    (also aus der tabelle immer 9 led's liest, ausgibt und die entsprechende Ebene einschaltet. Das ganze natürlich 3 mal) .
    Dazu muss ja der zustand der 27 LED's irgendwie notiert werden und da bieten sich so dreiergruppen halt an weil man da auch übersichtlich bilder erstellen kann. Man könnte es natürlich auch irgendwie anders aufrufen.
    Mein Problem ist das ich nicht weiß wie ich die daten aus der tabelle an den ports ausgeben soll. DAs mit der Dauer ist ja erstmal sekundär.

    Lukas

    Bild:

    vllt schleif ich die Led's noch matt.

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Also, um aus der Prog-memory Bytes hintereinander auszulesen, ist der Basic-Befehl "READ" gut genug.
    Lookup bringt's dann, wenn der Index hin- und hersprint

    Zu beginn der auslese-Sequenz:
    Code:
      RESTORE Daten  'Datenzeiger auf das erste Tabellenbyte
    und dann nurmehr jedesmal
    Code:
    FOR counter= 1 to 27
      READ  temp-byte    ' raufzählen tut er selber 
    next
    Noch was:
    Du mußt beim ausgeben von einem Byte immer erstmal das von vorher löschen, sonst leuchten irgendwann alle
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    31.07.2007
    Beiträge
    15
    Hallo,
    Ich bin inzwischen soweit:
    Code:
    $regfile = "m16def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Dim B As Integer , Count As Byte
    Dim A1 As Byte
    Dim A2 As Byte
    Dim B3 As Byte
    Dim B4 As Byte
    Dim C5 As Byte
    Dim C6 As Byte
    
    
    Config Porta = Output
    Config Portc = Output
    
    Gnd1 Alias Portc.2
    Gnd2 Alias Portc.1
    Gnd3 Alias Portc.0
    
    'ebene: 0 ist an
    'led: 1 ist an
    Porta = 0
    Gnd1 = 1
    Gnd2 = 1
    Gnd3 = 1
    
    
    
    Restore Daten                                               'Datenzeiger auf das erste Tabellenbyte
    
    
    
    Do
    
    
    Read A1
    Read A2
    Read B3
    Read B4
    Read C5
    Read C6
    Read B
    
    
    For Count = 0 To B
    
    
    Porta = &B00000000
    Portc = &B00000111
    
    
    Porta = A1
    
    Portc = A2
    
    Gnd1 = 0
    Gnd2 = 1
    Gnd3 = 1
    Waitms 1
    Porta = &B00000000
    Portc = &B00000111
    
    Porta = B3
    
    Portc = B4
    
    Gnd1 = 1
    Gnd2 = 0
    Gnd3 = 1
    Waitms 1
    Porta = &B00000000
    Portc = &B00000111
    
    
    Porta = C5
    
    Portc = C6                                                  ' die erste Spalte
    
    Gnd1 = 1
    Gnd2 = 1
    Gnd3 = 0
    Waitms 1
    
    Next
    Loop
    
    Daten:
    Data &B00101010 , &B00100111 , &B00101010 , &B00100111 , &B00101010 , &B00100111 , 1000%
    Data &B00111111 , &B01010111 , &B00110011 , &B01000111 , &B00111111 , &B00000111 , 1000%
    Nur wenn jetzt alle Zeilen zuende sind fangen die Led's wold zu blinken an!
    Ich würde gerne am Schluss so eine Art Dummy-zeile hinzufügen:
    Data &B0000000 , &B0000000 , &B00000000 , &B00000000 , &B00000000 , &B0000000 , 0%

    Also wenn die zeit 0 ist soll das ganze aufhören oder wieder von vorne anfangen. Wenn ich aber schreibe: while B <> 0 passiert überhaupt nichts!
    Wie soll ich das machen?

    Lukas

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Schau mal, wie man es machen könnte: Ohne Gewähr, ich hab keine Cube zum testen

    Vielleicht ist das eine Hilfe

    Code:
    $regfile = "m16def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Dim Temp As Byte
    Dim Wait_time As Word
    
    Config Porta = Output
    Config Portc = Output
    
    Gnd1 Alias Portc.2
    Gnd2 Alias Portc.1
    Gnd3 Alias Portc.0
    
    'ebene: 0 ist an
    'led: 1 ist an
    
    Porta = 0
    Portc = 0
    Gnd1 = 1
    Gnd2 = 1
    Gnd3 = 1
    
    
    Do
    
       Restore Daten                                            'Datenzeiger auf das erste Tabellenbyte
    
     ' ------------ ebene EINS -----------------
       Gnd1 = 0
       Gnd2 = 1
       Gnd3 = 1
       Gosub Eine_ebene
    
    
     ' ------------ ebene ZWEI -----------------
       Gnd1 = 1
       Gnd2 = 0
       Gnd3 = 1
       Gosub Eine_ebene
    
    
     ' ------------ ebene DREI -----------------
       Gnd1 = 1
       Gnd2 = 1
       Gnd3 = 0
       Gosub Eine_ebene
    
    Loop                                                        ' und wieder
    
    End
    
    '================ subroutine für eine Ebene =================
    Eine_ebene:
    '-------- 1 reihe ---------
       Read Temp
       Porta = Temp                                             ' bit 0, 1, 2
    '-------- 2 reihe ---------
       Read Temp
       Shift Temp , Left , 3                                    ' 3 bits nach links
                                                                ' bit 3, 4, 5
       Porta = Porta Or Temp                                    ' dazumischen
    '-------- 3 reihe ---------
       Read Temp
       Shift Temp , Left , 5                                    ' 5 bits nach links
       Portc = Portc Or Temp                                    ' zu den GND's dazumischen
    
       Read Wait_time                                           ' wait-time
       Waitms Wait_time                                         ' warten nnn millisek
    ' Leds abdrehen
       Porta = Porta And &B11000000                             ' Bits 0,1,2,3,4,5
       Portc = Portc And &B00011111                             ' Bits 5,6,7
       Return
    
    '    test daten:   alle Leds leuchten
    Daten:
    ' ------------- 1.ebene -------------------
       Data &B00000111                                          ' Bit   vorne
       Data &B00000111                                          ' Bit   mitte
       Data &B00000111                                          ' Bit   hinten
       Data 1000%                                               'wait-time 1000 mS
    ' ------------- 2.ebene -------------------
       Data &B00000111                                          ' Bit   vorne
       Data &B00000111                                          ' Bit   mitte
       Data &B00000111                                          ' Bit   hinten
       Data 1000%                                               'wait-time 1000 mS
    ' ------------- 3.ebene -------------------
       Data &B00000111                                          ' Bit   vorne
       Data &B00000111                                          ' Bit   mitte
       Data &B00000111                                          ' Bit   hinten
       Data 1000%                                               'wait-time 1000 mS
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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