Forum: Mikrocontroller und Digitale Elektronik Max7219 + Atmega328 = EMV-Problem?


von claudia (Gast)


Angehängte Dateien:

Lesenswert?

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();
      }
    }


    }
}

von claudia (Gast)


Lesenswert?

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.

von claudia (Gast)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

claudia schrieb:
> Die Stromversorgung läuft über eine Powerbank

Ich würde besser ein Steckernetzteil 5V/1A nehmen.

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

von Michael B. (laberkopp)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von BeastyK (Gast)


Lesenswert?

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

von Claudia (Gast)


Lesenswert?

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!

von BeastyK (Gast)


Lesenswert?

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

von BeastyK (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.