Hi! Ich habe folgendes aufgebaut: -4 8x8 RGB LED Matrix Module, die jeweils über 4 Schieberegister angesprochen werden. Angesteuert wird das über 5 Drähte über einen ATMega328: Clock, Latch, Serielle Daten, VCC und GND. Der ATMega328 sitzt auf einem Arduino UNO Board, um dem ATMega mit Strom und Takt zu versorgen. Der Arduino Bootloader sowie die IDE werden nicht verwendet. Stattdessen wird mit AtmelStudio und einem AVR ISP mkII programmiert. Problem ist folgendes: Das Programm wird nur nach einem Flashvorgang richtig ausgeführt. Unterbreche ich nach dem Flashen die Stromversorgung sieht das Muster auf den Matrizen zwar ähnlich aus, flackert aber und es werden falsche Farben dargestellt. An was kann das liegen? Am Code eigentlich nicht, da es ja nach dem Flashen funktioniert. An der Hardware eigentlich auch nicht, selber Grund wie bei der Software. Hat irgendjemand schonmal so ein Problem gehabt? Irgendeine Idee, wie man das löst? Grüße!
Ohne Schaltplan und Source code wird niemand helfen können.
Code Zeile 42 ? Oder allenfalls Bauteil 42 ?
Bleibt das AVR ISP mkII angeschlossen oder entfernst Du es beim Neustart? Schreibt Dein Programm ins Flash? Was hast Du als Netzteil? Wie ist Dein Reset beschaltet? Also nur mit Deiner obigen Beschreibung ist eine Hilfe wohl eher unwahrscheinlich.
Sowas hatte ich auch mal, prüf mal, ob RESET richtig beschaltet ist. Bei mir war einmal RESET in einer gestörten Umbegung ohne Pullup und einmal hatte der Controller einen wech.
Hi! Danke für eure Antworten. Ich hab eigentlich gedacht, dass Schaltplan und Software nicht nötig sind, da das ganze ja grundsätzlich läuft. Hatte eher gehofft, dass das evtl. ein Fehler im Ablauf, beim Programmieren, etc. ist... Achim K. schrieb: > Bleibt das AVR ISP mkII angeschlossen oder entfernst Du es beim > Neustart? > Schreibt Dein Programm ins Flash? > Was hast Du als Netzteil? > Wie ist Dein Reset beschaltet? AVR ISP mkII bleibt die ganze Zeit via USB mit dem PC verbunden sowie via ISP mit dem Arduino UNO. Ich denke das Programm wird ins Flash geschrieben. Was gäbe es denn noch? Ich Programmiere ganz normal über den Programmierdialog in AtmelStudio. Für die Stromversorgung muss ebenfalls der 5V Ausgang des Arduino UNO herhalten. Dieser bezieht seinen Strom aus dem USB Port. Resetbeschaltung entspricht der des Arduino. Laut deren Infoseite ist das 10k nach 5V und eine Diode paralell. Zum Schaltplan: JP1 ist der Eingang, an JP2 können weitere Module angeschlossen werden. JP3-5 sind die Kathoden der LED Matrix, JP6-7 die Anoden. Code:
1 | #include <avr/io.h> |
2 | #define F_CPU 16000000UL
|
3 | #include <util/delay.h> |
4 | #include <avr/interrupt.h> |
5 | |
6 | #define HELLIGKEITSSTUFEN 4
|
7 | #define SPALTENANZAHL 32
|
8 | #define MATRIXANZAHL 4
|
9 | #define STARTWARTEZEIT 1000
|
10 | |
11 | //Interrupte Einschalten
|
12 | #ifndef TIMER0_OVF_vect
|
13 | #define TIMER0_OVF_vect TIMER0_OVF0_vect
|
14 | #endif
|
15 | |
16 | //für die ShiftOut Routine
|
17 | int ShiftOutSp = 0x00; |
18 | int ShiftOut[MATRIXANZAHL][3]; |
19 | |
20 | //[HELLIGKEITSSTUFEN][FARBE][SPALTE] Speichert das aktuelle Bild.
|
21 | int DispAkt[HELLIGKEITSSTUFEN][3][32]; |
22 | |
23 | int counter1 = 1; //Zählt die Spalten der Matrix durch |
24 | int counter2 = 0; //Definiert, welche "Helligkeit" dargestellt wird. Bei 0 wird DispAktL ausgegeben, bei 1 DispAktM, usw... |
25 | int spalten = 0b10000000; //Spaltenposition in der ISR, wird so direkt in das Schieberegister geschoben. |
26 | |
27 | int main(void) |
28 | {
|
29 | Setup(); |
30 | Startup(); |
31 | |
32 | while(1) |
33 | {
|
34 | }
|
35 | }
|
36 | |
37 | void SPI_MasterInit (void) //FERTIG |
38 | {
|
39 | //aus dem Datenblatt übernommen
|
40 | DDRB |= (1 << PB3); //MOSI als Ausgang |
41 | DDRB |= (1 << PB5); //SCK als Ausgang |
42 | DDRD |= (1 << PD6); //LED an PD6 |
43 | DDRB |= (1 << PB2); //SS als Ausgang |
44 | SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR0); |
45 | }
|
46 | |
47 | |
48 | void Setup (void) //FERTIG |
49 | {
|
50 | SPI_MasterInit(); |
51 | |
52 | // Timer 0 konfigurieren
|
53 | TCCR0B |= (1<<CS01); // Prescaler 8 |
54 | TCCR0B |= (1<<CS00); |
55 | //TCCR0B |= (1<<CS02);
|
56 | |
57 | // Overflow Interrupt erlauben
|
58 | TIMSK0 |= (1<<TOIE0); |
59 | |
60 | // Global Interrupts aktivieren
|
61 | sei(); |
62 | |
63 | DDRD &= ~(1 << PD7); |
64 | }
|
65 | |
66 | void Startup() |
67 | {
|
68 | for (int b = 0; b < 3; b++) |
69 | {
|
70 | for (int a = 0; a < HELLIGKEITSSTUFEN; a++) |
71 | {
|
72 | for (int c = 0; c < SPALTENANZAHL; c++) |
73 | {
|
74 | DispAkt[a][b][c] = 0xff; |
75 | }
|
76 | _delay_ms(STARTWARTEZEIT); |
77 | }
|
78 | |
79 | _delay_ms(STARTWARTEZEIT); |
80 | |
81 | for (int a = 0; a < HELLIGKEITSSTUFEN; a++) |
82 | {
|
83 | for (int c = 0; c < SPALTENANZAHL; c++) |
84 | {
|
85 | DispAkt[a][b][c] = 0x00; |
86 | }
|
87 | }
|
88 | }
|
89 | }
|
90 | |
91 | void SPI_Write (void) //FERTIG |
92 | {
|
93 | for (int mat = 0; mat < MATRIXANZAHL; mat++) |
94 | {
|
95 | SPDR = ShiftOutSp; |
96 | while (!(SPSR & (1 << SPIF))); |
97 | |
98 | for (int farbe = 0; farbe < 3; farbe ++) |
99 | {
|
100 | SPDR = ShiftOut[mat][farbe]; |
101 | while (!(SPSR & (1 << SPIF))); |
102 | }
|
103 | }
|
104 | |
105 | //Strobe an RCK bringt die Daten von den Schieberegistern in die Latches
|
106 | PORTB |= ( 1 << PB2 ); |
107 | PORTB &= ~( 1 << PB2 ); |
108 | }
|
109 | |
110 | ISR (TIMER0_OVF_vect) //FERTIG |
111 | {
|
112 | ShiftOutSp = spalten; |
113 | |
114 | for (int m = 0; m < MATRIXANZAHL; m++) |
115 | {
|
116 | for (int farbe = 0; farbe < 3; farbe++) |
117 | {
|
118 | ShiftOut[m][farbe] = DispAkt[counter2][farbe][counter1]; |
119 | }
|
120 | }
|
121 | |
122 | SPI_Write(); |
123 | |
124 | if (counter2 == HELLIGKEITSSTUFEN) |
125 | counter2 = 0; |
126 | |
127 | else
|
128 | counter2++; |
129 | |
130 | if (counter1 < 8) //Beim normalen durchcyclen Spalte um eins erhöhen |
131 | {
|
132 | counter1++; |
133 | spalten = spalten >> 1; |
134 | }
|
135 | else //Wenn am Ende angekommen, zurücksetzen |
136 | {
|
137 | counter1 = 0; |
138 | spalten = 0b10000000; |
139 | }
|
140 | }
|
Hoffe, der Code ist soweit verständlich. Hab mein Bestes gegeben! Schonmal danke fürs Anschauen und Grüße!
Student schrieb: > Für die Stromversorgung muss ebenfalls der 5V Ausgang des Arduino UNO > herhalten. Dieser bezieht seinen Strom aus dem USB Port. also zusammengefasst: deine "schaltung" funktioniert nur, wenn sowohl die masseverbindung über den USB (stromversorgung), alsoauch über den mkII (programmieren) vom pc kommt ;) also wenn zeig bitte mal den kompletten schaltplan + layout + fotos von der platine (leiterbahnen) .. du wirst da irgendwo massiv störungen/masseverschiebungen haben .. hast du überhaupt die masse vom arduino board mit der von deiner platine verbunden ?
Marian B. schrieb: > Sowas hatte ich auch mal, prüf mal, ob RESET richtig beschaltet ist. Bei > mir war einmal RESET in einer gestörten Umbegung ohne Pullup und einmal > hatte der Controller einen wech. Such mal in der Richtung und kontrollier deine Masseverbindungen. Wenn dein Programm ausgeführt wird, ist es auch im Flash. Woraus soll es denn sonst ausgeführt werden? Die Software ist auch erstmal egal. Du hast ein Hardwareproblem, daß vom ISP zufällig kaschiert wird. Is´n Schweinefehler. Aber da mußt du jetzt durch. mfg.
:
Bearbeitet durch User
> > Achim K. schrieb: ... >> Schreibt Dein Programm ins Flash? ... > Ich denke das Programm wird ins Flash geschrieben. Was gäbe es denn > noch? Ich Programmiere ganz normal über den Programmierdialog in > AtmelStudio. Bei manchen Mikrocontrollern ist es möglich, mit dem Programm auf dem Controller selber ins Flash zu schreiben. Ob das bei Deinem der Fall ist, weiß ich aber nicht. Wenn so etwas benutzt wird und es hat dummerweise einen Fehler, dann kann es sein, man zerschiest sich das Programm selbst.
Achim K. schrieb: >> >> Achim K. schrieb: > ... >>> Schreibt Dein Programm ins Flash? > ... >> Ich denke das Programm wird ins Flash geschrieben. Was gäbe es denn >> noch? Ich Programmiere ganz normal über den Programmierdialog in >> AtmelStudio. > > Bei manchen Mikrocontrollern ist es möglich, mit dem Programm auf dem > Controller selber ins Flash zu schreiben. Ob das bei Deinem der Fall > ist, weiß ich aber nicht. Wenn so etwas benutzt wird und es hat > dummerweise einen Fehler, dann kann es sein, man zerschiest sich das > Programm selbst. Das nennt sich Bootloader. Aber: Student schrieb: > Der ATMega328 sitzt auf einem Arduino UNO Board, um dem ATMega mit Strom > und Takt zu versorgen. Der Arduino Bootloader sowie die IDE werden nicht > verwendet. Stattdessen wird mit AtmelStudio und einem AVR ISP mkII > programmiert. mfg.
> Das nennt sich Bootloader.
"Self-Programming the Flash" kann man natürlich als Bootloader
einsetzen, aber auch für andere Zwecke (unabhängig von der Frage, ob die
meisten anderen Zwecke nicht im EEPROM besser aufgehoben wären). Wäre
aber auch eine zu einfache Antwort gewesen, wenn sich das Programm bei
der ersten Ausführung Aufgrund eines Fehlers einfach selber zerschießt.
Servus! Danke schonmal für die vielen Antworten. Wäre doch gelacht, wenn ich das mit eurer Hilfe nicht hinbekomme! Achim K. schrieb: > ei manchen Mikrocontrollern ist es möglich, mit dem Programm auf dem > Controller selber ins Flash zu schreiben. Ob das bei Deinem der Fall > ist, weiß ich aber nicht. Wenn so etwas benutzt wird und es hat > dummerweise einen Fehler, dann kann es sein, man zerschiest sich das > Programm selbst. Im Programm wird nicht in den Flash geschrieben. Ich möchte euch nochmal meine "Entdeckungen" ausführlich beschreiben, da glaube ich Teile noch unklar waren: Andi D. schrieb: > also zusammengefasst: deine "schaltung" funktioniert nur, wenn sowohl > die masseverbindung über den USB (stromversorgung), alsoauch über den > mkII (programmieren) vom pc kommt ;) Der AVR ISP mkII hängt über USB am PC. Der Arduino UNO hängt über USB am PC. AVR ISP mkII und Arduino UNO sind vie ISP miteinander verbunden. Die LED Matrix (Schaltplan ist oben) ist mit 5 Kabeln mit dem Arduino verbunden: 5V, GND, latches der Schieberegister, SPI Clock und natürlich die SPI Daten. Ablauf ist folgender: Arduino und AVR ISP wird am PC eingesteckt. Im AtmelStudio wird das Programm auf den ATMega328 geschrieben. Die Matrix zeigt das Bild so an, wie sie soll. Und jetzt das Interessante: Während das Programm läuft kann ich den ISP Stecker rausziehen, das Programm läuft weiter wie es soll. Dies spricht meiner Meinung nach gegen einen Fehler in der Stromversorgung bzw. der Masseführung. Irgendwann ist das Programm dann durchgelaufen und die Matrix zeigt kein Bild mehr an, genau so wie es das Programm vorsieht. Wenn ich nun die Stromversorgung des Arduinos trenne und wieder verbinde, zeigt die Matrix zwar ein ähnliches Muster wie gewünscht an, aber die Farben stimmen nicht und es flackert - egal ob der ISP Stecker gesteckt ist oder nicht(!). Hoffe, ihr könnt mit den Infos bisschen was anfangen. Grüße!
Student schrieb: > Und jetzt das Interessante: > > Während das Programm läuft kann ich den ISP Stecker rausziehen, das > Programm läuft weiter wie es soll. > > Dies spricht meiner Meinung nach gegen einen Fehler in der > Stromversorgung bzw. der Masseführung. Elektronik kann so fies sein. Deine Meinung ist ihr übrigends vollkommen egal. Fehler in der Elektronik sind vor allem eins: Sie sind nicht logisch. Naja, wenn man sie gefunden hat schon. Die Zeit, die man dafür aufwenden muß, ist ungefähr: Viele Stunden * Frust / Erfahrung > Irgendwann ist das Programm dann durchgelaufen und die Matrix zeigt kein > Bild mehr an, genau so wie es das Programm vorsieht. > > Wenn ich nun die Stromversorgung des Arduinos trenne und wieder > verbinde, zeigt die Matrix zwar ein ähnliches Muster wie gewünscht an, > aber die Farben stimmen nicht und es flackert - egal ob der ISP Stecker > gesteckt ist oder nicht(!). > > Hoffe, ihr könnt mit den Infos bisschen was anfangen. Wie gesagt, Schweinefehler. Die 4 100-nF-Kondensatoren sind da, wo sie hingehören? Also direkt an den 595ern? mfg.
:
Bearbeitet durch User
Thomas Eckmann schrieb: > Die Zeit, die man dafür aufwenden muß, ist ungefähr: > > Viele Stunden * Frust / Erfahrung Die Formel gefällt mir! * aufschreib * ;)
Ich hatte auch mal das Prob, da war an dem AVR kein Brown-out gesetzt und die Spannung ist durch einen (nach dem Motto "viel hilft viel") zu großen Elko sehr langsam gestiegen. Das Ergebnis war, dass der AVR losgelaufen ist bevor die Spannung ganz da war und so ziemlich gemacht hat was er will. Ich würde also mal kucken ob ein manueller Reset (im einfachsten Fall mit nem Jumper an dem ISP-Header) das Problem auslöst (nach dem Proggen kann man mit Reset die Fehlermuster zaubern) oder behebt (nach dem Power-Cycle kann man mit Reset das "richtige" Bild kriegen), könnte interessant sein.
> 4 8x8 RGB LED Matrix Module > Wenn ich nun die Stromversorgung des Arduinos trenne und wieder > verbinde, zeigt die Matrix zwar ein ähnliches Muster wie gewünscht an, > aber die Farben stimmen nicht und es flackert - egal ob der ISP Stecker > gesteckt ist oder nicht(!). Merkwürdig finde ich das schon, dass es nach dem Programmieren tut und nach einem Neustart nicht mehr. Oder tut es "oft" nach dem Programmieren und "seltener" nach dem Neustart? Nehmen die Fehlbilder bei den LED Matrixen am Ende der seriellen Schieberegister zu? Vielleicht hilft es, wenn Du das Programm zuerst einmal nur für die 1. 8x8 Matrix umschreibst und testest und dann erst weitere LEDs hinzu nimmst. Und nimm z.B. für die ersten Tests nur Muster in "rot". Dann siehst Du, ob das Muster wirklich geschrieben wird oder doch einzelne Bits verloren gehen. (Und vielleicht hilft es auch, den SPI Takt etwas zu drosseln und/oder den Latch etwas länger auf 1 zu lassen, auch wenn das laut Spec. der Register wohl eher nichts bringen sollte.) Wenn der Prozessor "schlecht" aus dem Neustart kommt, sollte das meiner Ansicht nach nur Auswirkungen auf die "ersten" Bilder haben. Letztlich taktest Du die Bits für Deine Schieberegister raus und aktivierst diese mit dem Latch. Auch wenn das die ersten paar mal schief geht, sollte es sich nach einer gewissen Zeit selbst korrigieren. Aber die Tests mit dem Reset wie Max D. sie beschreibt können hier ja u.U. auch mehr Klarheit bringen.
Auch wenn es wohl mit dem Problem nichts zu tun hat: Ich bin von der Logik Spaltenauswahl etwas verwirrt. Erstens sind die PNP Transistoren gemäß Schaltplan mit C an VCC. Ich kenne das eher mit E an VCC. Zweitens müßte dann die "Auswahl" negiert sein. Ich überlege und überlege, aber irgendwie komme ich nicht dahinter, wie das tut.
>Wie gesagt, Schweinefehler. >Die 4 100-nF-Kondensatoren sind da, wo sie hingehören? Also direkt an >den 595ern? ich geh auch der einfachheit halber davon aus, daß die Entkoppelkondensatoren nicht da sind. Oder nicht da sind wo sie hingehören. Und schon sind bekommt man ganz seltsamme "unerklärliche" Fehler, es könnten auch ab und zu gehen, es geht wenn der Programmer dran ist, oder es geht nicht wenn der Programmer dran ist, oder bei Vollmond. DIE 100nF sind GANZ WICHTIG ÜBER JEDEM IC MIT MÖGLICHST KURZEN LEITUNGEN ZWISCHEN DEN SPANNUNGSANSCHLÜSSEN DES JEWEILIGEN ICS. und weil man es anscheinend nicht oft genug sagen kann : DIE 100nF sind GANZ WICHTIG ÜBER JEDEM IC MIT MÖGLICHST KURZEN LEITUNGEN ZWISCHEN DEN SPANNUNGSANSCHLÜSSEN DES JEWEILIGEN ICS. zeig uns mal nen Foto von der 595er Leiterkarte mit den 100nF Kondensatoren. Denn : DIE 100nF sind GANZ WICHTIG ÜBER JEDEM IC MIT MÖGLICHST KURZEN LEITUNGEN ZWISCHEN DEN SPANNUNGSANSCHLÜSSEN DES JEWEILIGEN ICS.
Ach so, Du meinst die 100nF sind ganz wichtig über jedem IC mit möglichst kurzen Leitungen zwischen den Spannungsanschlüssen des jeweiligen ICs?
Eine blöde Frage: Den Bootloader hast du in den Fuses auch ausgeschaltet?
Max D. schrieb: > Ich würde also mal kucken ob ein manueller Reset (im einfachsten Fall > mit nem Jumper an dem ISP-Header) das Problem auslöst (nach dem Proggen > kann man mit Reset die Fehlermuster zaubern) oder behebt (nach dem > Power-Cycle kann man mit Reset das "richtige" Bild kriegen), könnte > interessant sein. Joa, manueller Reset zeigt das selbe Muster wie das Unterbrechen der Stromversorgung. Achim K. schrieb: > Auch wenn es wohl mit dem Problem nichts zu tun hat: > Ich bin von der Logik Spaltenauswahl etwas verwirrt. > Erstens sind die PNP Transistoren gemäß Schaltplan mit C an VCC. Ich > kenne das eher mit E an VCC. Zweitens müßte dann die "Auswahl" negiert > sein. Jetzt wo dus sagst kommt mir das auch komisch vor. Hatte die Platinen schon länger gemacht. Haben die Transistoren ein Standard Pinout? Meine mich zu erinnern, dass da irgendwas war. Kann es sein, dass bei den evtl. Collector und Emitter vertauscht sind und ich das deshalb gemacht hab? Ausserdem funktionierts ja :D Uwe schrieb: > DIE 100nF sind GANZ WICHTIG ÜBER JEDEM IC MIT MÖGLICHST KURZEN LEITUNGEN > ZWISCHEN DEN SPANNUNGSANSCHLÜSSEN DES JEWEILIGEN ICS. Jaja, wenn man hier nur einen Tag mitliest kriegt man das ja immer wieder mit. Ich hab da SMD Kondensatoren mit drauf. Müssten 22nF sein, sollte aber auch passen, oder? Hab nochmal bisschen was probiert: Hab hier noch die erste Version der Software. Diese war nur auf das ansteuern eines Moduls ausgelegt, wenn man mehrere Module anschließt, zeigen also alle das selbe an. Diese hat zwar noch paar Bugs, nicht aber das oben genannte Verhalten. Sprich ich kann das Ding resetten wie ich will, ob mit oder ohne ISP, es funktioniert. Mit einem angeschlossenen Modul oder mit mehreren, alles kein Problem. Die zweite, nicht funktionierende, oben verwendete Version der Firmware ist eigentlich von der ersten abgeleitet, das heisst die Routinen unterscheiden sich nur geringfügig... Ich werde jetzt nochmal die erste Version schrittweise auf Stand der zweiten bringen und schauen worans hakt. Irgendwelche weiteren Tipps? Aber wirklich sehr, sehr komisch das Ganze. Zum Glück mach ich sowas nicht beruflich. Zu viel Vodoo, haha! Grüße!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.