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.
Michi87 schrieb:> (Ich habe nur VCC und GND verbunden)
Du hast also einfach 2 Schaltungen parallel an die selbe Versorgung
gehängt und sonst nichts verbunden? Und dann spinnen die herum? Aber
jede Schaltung für sich allein an der selben Versorgung funktioniert
einwandfrei?
Hast du da mal Bilder vom Aufbau?
Also die VCC und GND Pins der beiden uC hängen an den entsprechenden
Ausgangpins der Spannungsversorgung (3.3V)
Ebenso sind natürlich die beiden uCs an RX TX miteinander verbunden.
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
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
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.
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.
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.
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
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
Michi87 schrieb:> Ich werde heute Abend mal versuchen an alle VCC-GND bzw. AVCC-AGND die> Kondensatoren anzulöten.
Daran liegt es kaum. Die AVRs sind recht robust und oft mit einem
Kondensator zufrieden.
Wie sieht denn Dein Protokoll aus, d.h. wie synchronisieren sich die
beiden MCs aufeinander?
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.
Michi87 schrieb:> ... Kann es sein> dass die RX,TX Signale die der zweite sendet den ersten dermaßen stören.
Ja, kann sein. Alles ist möglich und das Chaos ist wahrscheinlicher als
die Ordnung.
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.
Lothar M. schrieb:> Also brauchen wir für eine sinnvolle Fehleranalyse das, was du vor dir> hast:> 1. den Schaltplan> 2. Fotos vom Aufbau> 3. das Programm
Schaltplan ist oben skizziert. Programm ist auch oben zu sehen.
Foto folgt noch, aber da gibt es nichts spektakuläres zu sehen, aber
mache ich gerne nachher noch
Flip B. schrieb:> Mach an beide einen Stabilen Taktgeber also quarz oder resonator> und> stelle die Fuses passend ein. dann verstehen sie sich garantiert.
Michi87 schrieb:> #define LED1 3> #define LED2 5>> void setup()> {> analogWrite(LED2, 0);>> }
Stelle auch bitte sicher, dass genau das Programm auch auf dem Micro
läuft.