Forum: Mikrocontroller und Digitale Elektronik Software läuft nur nach dem Flashen über ISP richtig?!


von Student (Gast)


Lesenswert?

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!

von Jim M. (turboj)


Lesenswert?

Ohne Schaltplan und Source code wird niemand helfen können.

von jetzt (Gast)


Lesenswert?

Code Zeile 42 ? Oder allenfalls Bauteil 42 ?

von Achim K. (aks)


Lesenswert?

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.

von Marian (phiarc) Benutzerseite


Lesenswert?

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.

von Student (Gast)


Angehängte Dateien:

Lesenswert?

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!

von TestX .. (xaos)


Lesenswert?

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 ?

von Thomas E. (thomase)


Lesenswert?

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
von Achim K. (aks)


Lesenswert?

>
> 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.

von Thomas E. (thomase)


Lesenswert?

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.

von Achim K. (aks)


Lesenswert?

> 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.

von Student (Gast)


Lesenswert?

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!

von Thomas E. (thomase)


Lesenswert?

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
von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Thomas Eckmann schrieb:
> Die Zeit, die man dafür aufwenden muß, ist ungefähr:
>
> Viele Stunden * Frust / Erfahrung

Die Formel gefällt mir!   * aufschreib *

;)

von Max D. (max_d)


Lesenswert?

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.

von Achim K. (aks)


Lesenswert?

> 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.

von Achim K. (aks)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

>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.

von Mark B. (markbrandis)


Lesenswert?

Ach so, Du meinst die 100nF sind ganz wichtig über jedem IC mit 
möglichst kurzen Leitungen zwischen den Spannungsanschlüssen des 
jeweiligen ICs?

von Chr. M. (snowfly)


Lesenswert?

Eine blöde Frage:
Den Bootloader hast du in den Fuses auch ausgeschaltet?

von Student (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.