Merkwürdiges Aufstartverhalten Atmega328 (Arduino)

Gast #4453848
Lesenswert?

Guten Morgen,

ich habe eine Schaltung aufgebaut bei der 2 uC (Atmega328) miteinander 
über eine serielle Verbindung (RX,TX) miteinander kommunizieren.
Der eine uC liest dabei verschiedene Sensorwerte aus und sendet die 
Messwerte über die serielle Schnittstelle an einen zweiten uC.
Dieser Wertet die Messwerte aus und soll eigentlich je nach Ergebnis bis 
zu 4 LEDs je nach Messwert zum leuchten bringen.

Beide uC liegen an der gleichen Spannungsversorgung (MP1584EN auf 3.3V 
eingestellt). Sobald ich die Spannung anlege, kommt das Problem.
Mal werden die LEDs richtig zum leuchten gebracht und mal leuchten 
einfach alle auf maximaler Stärke bzw. gar keine LED leuchtet mehr und 
es passiert nichts.

An was könnte dies liegen?
- Eine schlechte Masseverbindung?
- Fehlende PullUp/Down Widerstände am uC die zu einem unsicheren 
Verhalten führen? (Ich habe nur VCC und GND verbunden)

Habt ihr vielleicht eine Idee?

Als Programmierumgebung verwende ich Arduino.
Moderator (Firma: Titel) Persönliche Seite #4453881
Lesenswert?

Michi87 schrieb:
> Soll ich es mal mit einem 10k PullUp von Reset nach VCC versuchen?
Das ist "normalerweise" für Laboraufbauten nicht nötig. Hast du 
wenigstens die immer notwendigen Blockkondensatoren zwischen Vcc und 
GND? Welchen Takt verwendest du? Aber wie gesagt: zeig doch mal ein Foto 
von deinem Aufbau. Und am besten auch einen Schaltplan.

Und letztlich ist es natürlich ist es so, dass die LEDs von Software 
angesteuert werden, die machen die Faxen nicht von alleine. Erstaunlich 
oft ist dort drin der Fehler. Sagen wir mal in 90% der Probleme. Mit 
steigender Tendenz...

Also brauchen wir für eine sinnvolle Fehleranalyse das, was du vor dir 
hast:
1. den Schaltplan
2. Fotos vom Aufbau
3. das Programm
#4454482
Lesenswert?

Mögliche Ursache ist auch das Protokoll und seine Umsetzung, mit der 
die Daten übertragen werden.
Der Partner muss ja irgendwie den Beginn eines Datensatzes erkennen und 
die folgenden Bytes richtig zuordnen.

Wenn da nichts gemacht wurde, dann kann es z.B. sein, dass nach 
Einschalten der Sender schon ein Zeichen gesendet hat, bevor der 
Empfänger bereit ist. Dann werden alle folgenden Daten verschoben 
interpretiert.

Also: wie sind die Daten "verpackt" und wie wertet der Empfänger das 
aus?

Gruß Dietrich
Gast #4454612
Lesenswert?

Vielleicht redest Du zu schnell!
Wird kein Quatsch verwendet, um die Übertragungsrate konstant zu halten, 
so kann es bei grenzwertigen Geschwindigkeiten Probleme geben.
Im Handbuch werden die Abweichungen, bei angenommen konstanter Frequenz, 
beschrieben.
Gast #4454631
Lesenswert?

Ach so, ich vergaß: Wie bereits von anderen angedeutet kann sich beim 
Einschalten "Schmutz" in das Empfangsregister einschleichen.
Aus diesem Grund kann es nicht schaden, nach dem Einschalten der 
Betriebsspannung, und einer gehörigen Wartezeit, das Empfangsregister, 
auf Verdacht, zu putzen.

Vor ein paar Jahren hatte ich mal Probleme dadurch, dass ich ein 
Protokoll, mit nur einem Stoppbit verwendet habe. Irgendwie ist der mit 
der Suche nach dem Anfang des nächsten Datums durcheinander gekommen. 
Nach einer Änderung auf 2 Stoppbit, lief das Ganze Jahrelang problemlos.
Gast #4462314
Lesenswert?

leider habe ich am Wochenende nicht nach Hause gekommen und konnte keine 
Fotos machen. Anbei nur mal eine schnelle Skizze. An den Ports LED1 und 
LED2 hängt jeweils eine LED mit widerstand und wird mit ca. 10mA 
betrieben.
Die Ausgangsspannung am MP1584EN beträgt 3.3V.

Es handelt sich bei dem Atmega um eine TQFP Version.
Jetzt habe ich irgendwo im netzt gelesen, dass ich an jedem VCC/GND paar 
einen Abblockkondensator positionieren soll. Dies habe ich nur an einer 
Stelle je uC gemacht. Aber kann das der Fehler sein?
Oder kann es sein, dass ich einen grösseren Kondensator einlöten muss?

Den Code versuche ich schnellstmöglich zu organisieren.
Angehängte Dateien:
#4462450
Lesenswert?

Michi87 schrieb:

> Jetzt habe ich irgendwo im netzt gelesen, dass ich an jedem VCC/GND paar
> einen Abblockkondensator positionieren soll. Dies habe ich nur an einer
> Stelle je uC gemacht. Aber kann das der Fehler sein?
> Oder kann es sein, dass ich einen grösseren Kondensator einlöten muss?

Wenn ich so etwas schon lese... :)

Maßgebend für die Beschaltung des Controllers ist sein Datenblatt und im 
Datenblatt steht, dass für jedes Vcc-GND-Paar ein Abblockkondensator 
erforderlich ist.

Es spricht sogar Empfehlungen aus wie AVcc beschaltet werden muss.

Zusätzlich gibt der Hersteller Empfehlungen von sogenannten Application 
Notes heraus. Diese hier dürfte für die Reset-Beschaltung interessant 
sein: AVR040 http://www.atmel.com/images/doc1619.pdf

Erst dann kann man definiertes Verhalten gemäß dem Datenblatt 
erwarten...

Leute, lest endlich die Datenblätter!

Viele Grüße!

Sven
Gast #4463818
Lesenswert?

OK, also noch etwas ganz wichtiges hatte ich vergessen :-(

Ich habe das alles auch mal auf dem Steckbrett aufgebaut mit der DIP 
Version des Atmega328. Damit klappt alles problemlos.

Also schliesse ich die Software aus.

Ich habe somit mir eine Leiterplatte erstellt und einfach eben alle VCCs 
und den AVCC miteinander verbunden und auch alle GND.

Ich werde heute Abend mal versuchen an alle VCC-GND bzw. AVCC-AGND die 
Kondensatoren anzulöten.

Gruss
Gast #4464868
Lesenswert?

Also nun verstehe ich gar nichts mehr.
Ich habe folgenden Code versucht und nicht einmal das klappt.
Also das sollte normal ohne Probleme klappen.
1
#define LED1 3
2
#define LED2 5
3

4
void setup()
5
{
6
  pinMode(LED1, OUTPUT);
7
  pinMode(LED2, OUTPUT);
8
  analogWrite(LED1, 0);
9
  analogWrite(LED2, 0);
10
  delay(2000);
11
}
12

13
void loop()
14
{
15
  analogWrite(LED1, 0);
16
  analogWrite(LED2, 255);
17
  delay(100);
18
  analogWrite(LED2, 0);
19
  analogWrite(LED1, 255);
20
  delay(100);
21
}
Gast #4465212
Lesenswert?

Das ändert aber nichts daran ,das jetzt nicht einmal mehr das kleine 
Programm oben läuft bei dem nur 2 LEDs abwechselnd blinken sollen.
Dieses Programm ist nur auf einem der Atmega aufgespielt. Kann es sein 
dass die RX,TX Signale die der zweite sendet den ersten dermaßen stören. 
Ich habe irgendwo im Arduino Forum mal gelesen, dass man RX gegen GND 
schalten soll, aber dann wäre ja später keine Kommunikation mehr möglich 
wenn ich RX mit einem 10kOhm Widerstand gegen GND lege.
Gast #4465238
Lesenswert?

RX, TX habe ich nun abgehängt. Immer noch klappt es nicht.

Es klappt vielleicht 1 Mal von 10 Mal dass die LEDs wie gewünscht 
blinken. Ist irgendwie eher zufällig, aber die Wahrscheinlichkeit ist 
verschwindend gering das es klappt. In den meisten fällen leuchten 
einfach alle LEDs mit voller Helligkeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren