Hallo liebes Forum.
Noch immer bin ich etwas neu in der Mikrocontroller-Welt. Dachte aber
eigentlich, ich hätte inzwischen ein bisschen was gelernt, wohl aber
immer noch zu wenig... mein Problem(an dem ich schon die ganze Nacht
verzweifle):
Ein Atmega 328 steuert zwei max 7219 an. Diese sollen 96 Leds zum
Leuchten bringen. Leider leuchten fast immer alle. Manchmal allerdings
macht das Programm grob was es soll(LEDS gehen nacheinander an),
manchmal nur einer von den beiden MAX7219.Manchmal leuchtet auch nichts.
Habe keine Ahnung, nach welchem System. Manchmal gehts nach dem Flashen,
manchmal aber auch, wenn ich die Schaltung (nachdem alle LEDS
leuchteten) mal kurz von der Stromversorgung nehme. Meistens leuchten
alle, am zweithäufigsten keine und ab und an so, wie es soll...
Ich mache zum ersten Mal was mit SPI-Kommunikation. Die Signale sind
teilweise sehr unsauber: wo man eigentlich ein schönes Rechtecksignal
sehen sollte, scheint sich das gleiche Signal nochmal phasenverschoben
zu überlagern... oder hat unschöne Ausreißer irgendwohin. Hab leider nur
ein Oldschool-Oszi und kann keine Bilder rumschicken. Und dann gehts ja
auch manchmal. Wenn das Programm läuft, dann läufts auch und stürzt dann
nicht irgendwann ab.
Bin grad leider zu müde und genervt um mehr und besser zu schreiben,
sorry.
Meine Frage: sieht irgendwer im Schaltplan oder Board einen groben
Fehler? (Beim Board fehlen die Verbindungen von den Max zu den Jumpern
für die LEDS, war faul.)
Kanns an EMV liegen? Die Platine hat keine Brücken, einige Lötpunkte
sind aber schon recht fett und recht nah an den anderen. Die Kabel zu
den Leds sind im längsten Fall ca. 120cm.
Die Stromversorgung läuft über eine Powerbank, die durch eine Grundlast
nicht abschaltet. Kanns daran liegen? Funktioniert soweit eigentlich
ganz gut...
Oder mach ich bei der SPI kommnikation irgendwas grundsätzlich falsch?
Meinen Testcode häng ich auch mal an...
Falls irgendwer ne Idee oder Erfahrung mit dem Problem hat, bin für
alles dankbar. Sorry nochmal für die vermutlich etwas wirre Anfrage,
muss jetzt schlafen. Danke für jede Hilfe!
C.
CODE:
//AtMega 328 @8MHZ
// Outputs, pin definitions
#define PIN_SCK PORTB5
#define PIN_MOSI PORTB3
#define PIN_SS PORTB2
#define ON 1
#define OFF 0
#define MAX7219_LOAD1 PORTB |= (1<<PIN_SS)
#define MAX7219_LOAD0 PORTB &= ~(1<<PIN_SS)
#define MAX7219_MODE_DECODE 0x09
#define MAX7219_MODE_INTENSITY 0x0A
#define MAX7219_MODE_SCAN_LIMIT 0x0B
#define MAX7219_MODE_POWER 0x0C
#define MAX7219_MODE_TEST 0x0F
#define MAX7219_MODE_NOOP 0x00
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
char digitsInUse = 6;
void spiSendByte (char databyte)
{
// Copy data into the SPI data register
SPDR = databyte;
// Wait until transfer is complete
while (!(SPSR & (1 << SPIF)));
}
void MAX7219_writeData(char data_register, char data)
{
MAX7219_LOAD0;
//sende 2 x 16Bit
spiSendByte(data_register);
spiSendByte(data);
spiSendByte(data_register);
spiSendByte(data);
MAX7219_LOAD1;
}
void MAX7219_clearDisplay()
{
for (int i = 1; i <= digitsInUse; i++) {
MAX7219_writeData(i, 0);
}
}
int main(void)
{
// SCK MOSI CS/LOAD/SS
DDRB |= (1 << PIN_SCK) | (1 << PIN_MOSI) | (1 << PIN_SS);
// SPI Enable, Master mode
SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR1);
// Decode mode to "No Code"
MAX7219_writeData(MAX7219_MODE_DECODE, 0x00)
MAX7219_writeData(MAX7219_MODE_SCAN_LIMIT, digitsInUse - 1);
MAX7219_writeData(MAX7219_MODE_INTENSITY, 0x0F);
MAX7219_writeData(MAX7219_MODE_POWER, ON);
MAX7219_clearDisplay();
while(1)
{
//Test
for (int i=1; i <= 6; i ++) {
for (int j = 0; j <= 7; j++) {
MAX7219_writeData(i, pow(2,j));
_delay_ms(10);
MAX7219_clearDisplay();
}
}
}
}
kleiner Nachtrag:
jetzt z.B. wars grad so: bei einem MAX leuchteten alle LEDS, beim
zweiten keine. Dann steckte ich den Programmer auf die ISP Buchse und
siehe da, der MAX, der vorher nicht ging, spulte das Programm ab, der
andere leuchtete durchgängig. Es war aber auch schon öfter anders rum.
Jetzt geh ich wirklich schlafen...
C.
Nochmal Nachtrag:
Nochmal alles ausgemacht, ISP-Stecker abgezogen. Stromversorgung
angemacht, ISP Stecker aufgesteckt, Programm läuft wie testweise
programmiert.ISP-Stecker wieder, nichts läuft. Stecker wieder rauf,
läuft.
Das gleiche Programm nochmal geflasht, alle LEDs leuchtet. ISP wieder
abgenommen, leuchten immer noch alle LEDS. Strom aus und an, nichts
leuchtet. ISP wieder rauf, das Programm läuft!
ich versteh es nicht. und geh jetzt wirklich schlafen!
Das Layout ist ein wenig gruselig...
Und nimm lieber gleich den MAX7221, der 19er stört wie sau, dedingt
durch die steilen Flanken. Software für den MAX7221 ist ein bisschen
anders.
claudia schrieb:> irgendwer im Schaltplan oder Board einen groben Fehler?
Na ja, die 320mA, die in MAX7219 schaltet, fliessen nicht über deine
dünne langen Leitungen. Die Abblockkondensatoren an den 7219 wirken so
nicht, so wie du sie montiert hast. Das Layout ist also grottig und kann
schon Ursache für die Probleme sein.
Allerdings kann das Board sowieso nicht eingesetzt worden sein, es
fehlen ja die Hälfte der Verbindungen. Wie hast du die Schaltung den
aufgebaut, auf einem Steckbrett ?
Man baut Stromversorgungen als Stern. Siehst du, wie auf meinem
board.gif die plus und Masse Leitungen für jeden Baustein direkt vom
Stromanschlussk kommen ? Und kurz vor dem Baustein die
Abblockkondensatoren sitzen. Mit mehr Umarbeitung deines baords hätte
ich beide Stromanschlüsse (plus und Masse) unter den MAX7291 an der
Seite von Pin12/Pin13 herausgeführt und dort die Abblockkondenstaoren
gesetzt.
Moin Claudia,
sieht dein Board so aus wie im Anhang?
Bei den 90° Winkeln würden mich dann Reflexionen und Überlagerungen
nicht zu sehr wundern.
Als du das mit dem Stecker geschrieben hast, dachte ich an ein
Masse-Problem.
Gruß
Beast
Vielen lieben Dank für die Antworten. Entschuldigt die verspätete
Antwort, hatte vorher keine Zeit, Lohnarbeit. Das Problem ist gelöst:
Tatsächlich war es der ISP-Stecker. Beim Testen habe ich, wenn ich den
Stecker als Problem ausschließen wollte, immer den Programmer aus der
USB-Buchse gezogen. Allerdings verursachte der aufgesteckte ISP Stecker
das Problem. Abgezogen, Strom aus, Strom an, alles lief wie geünscht...
@ crazyhorse: Danke für den Hinweis, in Zukunft lieber den 7221 zu
nehmen. wird so und nicht anders gemacht!
@ laberkopp: tausend Dank an dich, dass du dir auch die Mühe gemacht
hast, das Board nochmal anders zu zeichnen! DANKE!
Die vielen Verbindungen in der Boarddatei fehlten, weil es ja nur die
"einfachen" Verbindungen zu den LEDs waren, wie gesagt, da war ich kurz
faul.
Die Platine ist genau wie mein grottiges Board auf Lochraster gelötet
(mit allen Verbindungen von den MAXen zu den Pinheads und funktioniert
jetzt gut. Ohne ISP-Stecker auch ordentlich saubere Signale am Oszi.
Ich hätte aber noch zwei Fragen. Vorneweg: ich komme eigentlich aus der
künstlerischen Ecke und bring mir seit zwei Jahren selber Elektrotechnik
und Mikrocontrollergedöns bei. Deswegen meine Unwissenheit, auch wenn
ich mir schon ganz gut was angeeignet hab...
1. Warum funktionieren meine Abblockkondesatoren so nicht?
Schaltplantechnisch ist es ja (vermutlich) ok, oder? Kommt die Masse von
zu weit her? Bzw es heißt ja immer, Abblockkondensatoren so nah wie
möglich an die Eingänge - das gilt also auch für Masse?
2. Plus und Masse probieren tendenziell als Stern aufzubauen, das werde
ich in Zukunft berücksichtigen. Dank auch an dich Beastyk. Deinen
Kommentar verstehe ich so, dass man die Leitungen eher mit 45 Grad
Winkeln verlegt, weil Signale anscheinend in den Leitungen sowas wie
reflektieren?
3. Da fällt mir noch ne Frage ein. Als ich das Board gelötet hab, habe
ich die Leitungen mit 0,4mm verzinnten Kupferdraht gelegt und dann
gelötet. Danach habe ich da dann (bei allen leitungen auf der
Unterseite) nochmal großzügig Zinn drübergeballert. Macht man das so
überhaupt? Ist ja z.B. bei denen, die dann teilweise oben langgeführt
werden, Quatsch. Oder setz ich da lieber enfach hier und da mal einen
Lötpunkt und gut ist?
Plus und Minus habe ich mit 0,6mm gelegt. Is das eigentlich schon
oversized (bei sagen wir mal max. 1A) Ich hab da schon öfter mal nach
Hinweisen gesucht, aber alles was ich diesbezüglich fand waren immer
Angaben zur Breite der Leiterbahnen bei geätzten Platinen. Gibts auch ne
Faustregel für Platinen für Draht mit rundem Querschnitt?
Danke nochmal an alle! Und nen schönes Wochenende!
Claudia schrieb:> Deinen Kommentar verstehe ich so, dass man die Leitungen eher mit 45> Grad Winkeln verlegt, weil Signale anscheinend in den Leitungen sowas> wie reflektieren?
Ja, das stimmt erstmal beim layouten von Platinen. Bei elektrischen und
auch optischen Leitungen gibt es das auch. Ich wußte allerdings nicht
das du deine Schaltung auf Lochraster platziert hast, da kann viel
passieren...für ein Testboard kann man das aber machen.
Ganz dolle würde ich empfehlen sich auf UTube mal das ein oder andere
Video über das richtige Löten anzusehen. Viel hilft nicht viel....
Was die Kabel angeht, da stehen vom Hersteller der Kabel schon dabei was
sie aushalten, im Netz und auch hier solltest du etwas über
Kabelquerschnitt, Spannung und Strom (Leistung, ohmscher Widerstand und
Wärmeentwicklung im Kabel) finden.
Gruß
Beast
BeastyK schrieb:> Ganz dolle würde ich empfehlen sich auf UTube mal das ein oder andere> Video über das richtige Löten anzusehen. Viel hilft nicht viel....
Und ich empfehle mir das richtige lesen...wenn man eine Anwendung hat
die mehr Strom braucht kann man natürlich auch den Kupferleiter noch mit
der Kupferleiterbahn auf der Lochrasterplatine mit Lötzinn verbinden.
So, hab mich mal verbessert...
Schönes WE
Beast