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.
Soll ich es mal mit einem 10k PullUp von Reset nach VCC versuchen?
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
Fotos und Schaltplan werden am Sonntag folgen. Leider schaffe ich es vorhe r nicht nach Hause. AVCC ist angeschlossen
Mit welcher Frequenz betreibst du die Atmega? Bei 3,3 Volt sind die lt. Datenblatt nur bis 8 MHz geeignet.
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?
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 | } |
Mach an beide einen Stabilen Taktgeber also quarz oder resonator und stelle die Fuses passend ein. dann verstehen sie sich garantiert.
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.
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.