Nabend :)
Ich habe mir einen 5x5x5 Led Cube gebaut und den mit einer
selbstgelöteten Platine verkabelt, welche von einem ATMega8a betrieben
wird.
Das ganze habe ich leider nicht selbst entworfen, weshalb ich auch nicht
völlig durch die Platine durchblicke (bin ein Amateur in sachen mC
Programmierung), und nach eurem Rat frage.
1. Bei den Ebenen des Cubes sind die Anoden verlötet, bei den Säulen die
Kathoden. Herausfinden welche Pins zu den Ebenen führen, konnte ich noch
recht einfach, da dort eben 1 Pin zu jeweils einer Ebene führt.
Nur stellt sich das Problem, wenn ich einzelne LEDs über einzelne Säulen
ansteuern will, da für die Säulen nicht jeweils ein Pin des
Mikrocontrollers zur Verfügung steht, und ich mir nun nicht vorstellen
kann, wie ich eine Säule ansteuer :(
Das ganze zeigt sich im Schaltplan, welcher sich im Anhang befindet.
Bisher habe ich nur ein simples Programm in C geschrieben, bei welchem
auf die einzelnen EbenenPins nacheinander Strom gelegt wird, sodass
jeweils eine Ebene leuchtet.
Das ganze sieht im moment so aus:
----
1
#define F_CPU 8000000UL //8 Mega Herz
2
#include<util/delay.h>
3
#include<avr/io.h>
4
5
intmain(void)
6
{
7
DDRC=0b0011111;//Port C Ausgänge: 0,1,2,3,4
8
while(1)
9
{
10
PORTC=0b0000001;
11
_delay_ms(30);
12
PORTC=0b0000011;
13
_delay_ms(30);
14
PORTC=0b0000111;
15
_delay_ms(30);
16
PORTC=0b0001111;
17
_delay_ms(30);
18
PORTC=0b0011111;
19
_delay_ms(30);
20
}
21
}
----
2. Das Programm startet sobald es hochgeladen ist nicht direkt. Damit es
anspringt muss ich ein wenig mit dem Finger über die Lötstellen des
Wannensteckers gehen, um vermutlich einen "Startimpuls" auszusenden.
Dann fangen meist zunächst einzelne LEDs der gerade angesteuerten Ebenen
an zu leuchten, und darauf hin die kompletten Ebenen.
Liegt dies vielleicht daran, dass ich im Setup vor der while Schleife
noch was hinzufügen muss?
Dass die Schaltung ohne "Finger an Lötstellen halten" funktioniert, und
es möglich ist einzelne LEDs anzusteuern, zeigt auch, dass ein nicht von
mir geschriebenes Assembler Programm funktioniert. Leider beherrsche ich
Assembler nicht ansatzweise, und kann in dem Programm so gut wie nichts
nachvollziehen, und ich muss und möchte den Cube in C programmieren.
Danke im Vorraus schonmal für Ratschläge und Tipps
>Entschuldige, hab jetzt n Screenshot als png drangehängt, falls du das>meintest.
Ich denke er meinte etwas was man erkennen kann und keinen
Fliegenschiss auf der Fensterscheibe.
Was man auf jeden Fall erkennen kann ist das
da mal wieder die Abblockkondensatoren fehlen.
Man kann zwar fast nichts erkennen, ich vermute aber, dass du die SPI
Pins erst als Ausgang/Eingang konfigurieren musst und Daten in die
Schieberegister (74HC595?) scheiben musst. Falls die Pins des ATmega
nach dem Reset als Eingang konfiguriert sind, sind die Eingänge des
Schieberegisters floating und du schiebst durch die Berührung der Pins
irgendwelche mehr oder weniger zufälligen Daten ins Schieberegister.
Wie hast du dir eigentlich vorgestellt, dass die Schaltung sinnvoll
funktionieren soll, ohne dass du etwas in die Schieberegister scheibst?
Edit: Wenn ich es richtig erkennen kann, ist das Schieberegister
ziemlich suboptimal am ATmega angeschlossen...
Max H. schrieb:> Wie hast du dir eigentlich vorgestellt, dass die Schaltung sinnvoll> funktionieren soll, ohne dass du etwas in die Schieberegister scheibst?
Ganz einfach, hab mir das Ding nicht ausgedacht, soll es nur
programmieren. Dabei hab ich bisher nur grundlegende Arduino Kenntnisse,
sonst allgemein weniger Erfahrung.
Ich les mich mal schlau!
Torben K. schrieb:> Ganz einfach, hab mir das Ding nicht ausgedacht, soll es nur> programmieren.
Ganz ehrlich, wie hast du dir vorgestellt es sinnvoll zu programmieren
ohne auch nur ein bisschen verstanden zu habe was die Hardware macht,
das geht höchsten mit einem LED-Cube-Shield...
P.S. Auf deinem Schaltplan kann man kein einziges Wort lesen.
Lesestoff: Porterweiterung mit SPI
Hab mich jetzt in Sachen Schieberegistern ein wenig schlau gelesen,
jetzt scheint das alles auch mehr Sinn zu machen.
Hauptsächlich hab ich mich da an diesem Tutorial orientiert:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister
Zum Programmieren:
Die einzelnen Bits, müssen dann über den Seriellen Eingang des 74HC595N
geschoben werden, und gelangen dann über QH* Ausgang in die nächsten
Schieberegister, sodass ich damit alle 4 Register "beschieben" kann.
Im Tutorial steht leider nur, wie man dies in Assembler umsetzt, was ich
leider nicht beherrsche.
Kann jemand verraten, wie ich einzelne Bits über C auf die Register
schiebe?
Max H. schrieb:> Torben K. schrieb:>> Kann jemand verraten, wie ich einzelne Bits über C auf die Register>> schiebe?> Soft-SPI Routine in C:
zu Maxens Routinen.
Den Teil mit der Auswertung des MISO Bits kannst du bei reinen 595
Anwendungen auch weglassen, solange du nicht vom anderen Ende der
Schieberegister wieder einliest (aber warum sollte man das bei 595 tun?)
Dafür fehlt noch etwas: Nachdem du alle (bei dir) 4 Schieberegister mit
den neuen Bits geladen hast, muss RCK noch einmal auf 1 und wieder auf 0
gewackelt werden, damit die Bits dann auch am Ausgang tatsächlich
aufscheinen.
Ich würde mal die Spannung an den Ausgängen des 74HC595 messen um zu
sehen ob der Fehler bei der Ansteuerung der 595er liegt.
Zur Fehlersuche wäre ein Schaltplan auf dem man den Text lesen kann
nicht schlecht.
Torben K. schrieb:> Entschuldige, hab jetzt n Screenshot als png drangehängt, falls du das> meintest.holger schrieb:> Ich denke er meinte etwas was man erkennen kann und keinen> Fliegenschiss auf der Fensterscheibe.
Ack
Torben, guck mal in EAGLE unter Menü Datei|Exportieren|Image ...
Wolfgang schrieb:> Torben, guck mal in EAGLE unter Menü Datei|Exportieren|Image ...
Ah vielen Dank, hab jetzt ein erkennbares Bild des Schaltplanes
angehängt. :)
Max H. schrieb:> Die Entkoppelkondensatoren* für die 74HC595 fehlen.
Heißt dass, dass es "nur" optimal wäre Entkoppelkondensatoren
einzulöten, oder dringend notwendig?
Max H. schrieb:> * 100nF zwischen Vdd und Vss bei jeden IC
Versteh ich leider nicht so Ganz,
? ist Vdd=Vcc, und Vss=Gnd ?
Und hier ist doch ein Kondensator am mC zwischen Vcc und Gnd (C1), der
somit auch bei den Spannungsversorgungen der Schieberegister wirkt.
Torben K. schrieb:> Max H. schrieb:>> Die Entkoppelkondensatoren* für die 74HC595 fehlen.> Heißt dass, dass es "nur" optimal wäre Entkoppelkondensatoren> einzulöten, oder dringend notwendig?
Es kann ohne funktionieren, muss es aber nicht. Ich habe aber noch keine
Erfahrung mit fehlenden Entkoppel-Cs gesammelt.
> Max H. schrieb:>> * 100nF zwischen Vdd und Vss bei jeden IC>> Versteh ich leider nicht so Ganz,> ? ist Vdd=Vcc, und Vss=Gnd ?
Stimmt, beim 74HC595 heißen die anderes.
> Und hier ist doch ein Kondensator am mC zwischen Vcc und Gnd (C1), der> somit auch bei den Spannungsversorgungen der Schieberegister wirkt.
Zitat
https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator> Jeder Digitalschaltkreis benötigt einen 100nF Keramikkondensator nah> (kleiner 20mm) an den Anschlüssen von VCC und GND. Je schneller der IC> schalten kann, umso wichtiger ist er.> Für jedes Anschlusspaar von VCC und GND eines ICs muss ein Kondensator> verwendet werden. Sparen geht hier oft schief!
Alles Klar, es lag daran, dass ich den Port B2 (an dem "Clear"
angeschlossen war) durchgehend auf low hatte.
Jetzt funktioniert alles wie gewollt, B2 ist durchgehend auf High, und
ich kann die Bits prima schieben, und der Cube leuchtet wie gewollt!
Vielen Dank!
Habe heute meine gestern angekommenen 74HC595 mal zum Spielen
ausgepackt. Haben erst nur 3 LEDs mitgespielt, erst nach Einsetzen eines
100nF CerCo, einmal komplett stromlos machen und neu anstöpseln lief
das.
Das ist also kein Gewäsch, sondern offenbar für die Zuverlässigkeit der
Schaltung unabdingbar. Jetzt mal den verlinkten Artikel lesen, ob das da
auch erklärt wird, warum dem so ist ;)
https://www.youtube.com/watch?v=OMEXsjAo5TE