Hallo. Ich habe ein Problem. Ich habe einen ATMega 8535 und einen ATMega 8515 direkt mit zwei Ports (8bit) verbunden. Der 8535 gibt 16bit aus, die der 8515 auf einem Matrixdisplay ausgibt. Nun das Problem: Die Anzeige schwankt von den Werten her. Das liegt wahrscheinlich daran, dass ich keine Pulldownwiderstände bei der Verbindung verwendet habe. Die Frage ist, ob ich das Ganze auch in der Software (bei den Outputs) verändern kann, um mir die Lötarbeit zu sparen. Ps: Weißjemand, wieviele Wörter(!) in einem ATMega 8535 passen? Ggf. könnte ich sonst beide Programme zu einem vereinen. VIELEN DANK Pps: Dies ist mein erster Beitrag im Forum.
Wenn Du die Portleitungen direkt verbunden hast und eigentlich deine Ports auf den sendenden Baustein nie als Eingang verwendet werden, dann sollte das Problem eigentlich nicht auftreten. Die Pulldowns werden ja nur benötigt, wenn der Ausgang undefiniert (z.B. Tri-State) ist. Also kann da nur 0 oder 1 anliegen. Das Problem wird folglich woanders liegen. Vielleicht ein Timingproblem beim übertragen der Daten. "Wörter" ist gut. Wieviel Platz da noch frei ist, siehst Du beim linken. Kannst ja im Prinzip mal rechnen, ob beide Inhalte in den Flash passen würden. Oder ob der RAM reicht. Ich habe eher RAM, als FLASH-Probleme.
Erstmal danke für die Antwort. Leider bin ich noch nicht so bewandert in sachen Tri-State und so. Also ich habe jeweils die Datenrichtungsregister (beim Empfänger) auf 0x00 gesetzt. Damit müssten die Eingänge sein. Was bedeutet dann Tristate? Hinweis: Ich habe mal zur Probe ein Metallblech zur Abschirmung drübergehalten. Die Anzige hat nicht so oft geschwankt. Daher schließe ich ein Timingproblem aus.
Pull-Ups oder Downs braucht man nur, wenn man irgendwo einen Tristateausgang auswerten will. Das ist bei Dir nicht der Fall, da die Port-Outputs bei logisch "1" nach VCC und bei "0" nach GND ziehen. Tri-state ist z.B. ein Open-Kollektor Ausgang. Hast Du vielleicht etwas lange Leitungen ? Wie schnell sind die Daten ? MfG formtapez
Wie synchronisierst du denn den Datentransfer? Generierst du ein Clock-Signal, oder wie?
Nichts gegen euch, aber ich glaube ihr denkt ein wenig zu umständlich. Ich habe einfach zwei 8bit-Ports mit Drähten verbunden. Dabei liegen die Daten direkt parallel an. Ich habe dabei kein Clocksignal, da ich dabei nichts seriell übertrage. Wann habe ich denn einen Open-Kollektor Ausgang bei den ATMegas? Hängt das vom DDRX ab?
Habe mich nur gewundert, wie du Daten nicht synchron zuverlässig überträgst, oder haben beide AVR's dasselbe Clocksignal und laufen synchron? Denn wenn du 16 Bit auf einem 8Bit-Port überträgst, dann müssen sie doch irgendwie zeitgemultiplext sein, und dazu braucht man ein entsprechendes Timing.
Salut, @Christopher: korrigier mich wenn ich falsch liege, aber ich hab das Gefühl, Du gibst die Daten an einem AVR-Port einfach aus, und liest sie an dem anderen einfach ein. Sofern Deine µCs nicht 100% synchron laufen, klappt das so natürlich nicht. Ob Du Daten seriell oder parallel überträgst, hat nichts damit zu tun, ob Du das synchron oder asynchron machst. Serielle Daten kannst Du synchron (z.B. SPI) oder asynchron (z.B. UART) übertragen. Dort macht asynchron auch Sinn, weil Du alles über eine einzige Leitung machst, die sowohl Start-/Stopbit enthält, als auch die Daten. Parallele Daten kannst Du sicherlich auch asynchron übertragen. Aber dann mußt Du gewisse Zustände oder Leitungen für die Synchronisierung definieren. Mehr Sinn macht die Verwendung einer EN(able)-, bzw. Clock-Leitung. Also: Daten an den Port ausgeben und dann Flanke auf EN generieren. Das ist das Signal für den anderen AVR, die Daten jetzt entgegenzunehmen. Wir denken nicht umständlicher als es nötig ist. Aber ohne Synchronisierung kannst Du nunmal 8bit parallel schlecht übertragen. Wenn Du grundsätzlich 16bit-Worte überträgst, könntest Du z.B. die EN-Leitung zur Wort-Synchronisierung (Framing) verwenden. Steigende Flanke bedeutet High-Byte liegt an, fallende Flanke steht für Low-Byte. Das spart externes Framing. Die Datenworte müssen ja auch synchronisiert werden. Gibt nen höllischen Datenwust, wenn ein Byte verloren geht und in Folge dessen High- und Lowbytes verkehrt zugeordnet werden. Gruß, Mark
Danke für die Antworten. Jedoch verwende ich keine 16bit Worte. Ich gebe bei dem 8535 an zwei Ports jeweils 8bit aus und lese diese auf zwei Ports bei dem 8515 wieder ein. Syncronisiert sind sie nicht, da ich mir die externe Beschaltung von Osyillatoren aus Arbeitszeittechnischen Gründen gespart habe. Ich betreibe beide mit 4MHz internem RC-Oszi.
Verstehe ich das jetzt richtig, dass du also bestimmte Signale anlegst und diese quasi analysierst und dementsprechend etwas auf dem Display ausgibst? Also keine Datenübertragung im eigentlichen Sinne?
Hmm... der Fehler kann aber eigentlich nicht bei der Hardware liegen, denn der Ausgang legt die Leitung ja wirklich auf einen definierten Pegel, also kein Open Collector o.ä. Deswegen brauchst du auch beim Eingang des zweiten AVRs auch keine Pullups schalten. Wie oft bzw. in welchem Zeitrahmen ändert sich denn der "Inhalt" der Ports denn so?
mindestens 4 bis 5mal in der Sekunde (sehr unbeständig) Bisher lag es immer daran, dass ich keine Pulldowns eingelötet habe. Dann kann ich mir die Lötarbeit wohl doch nicht sparen. Vielen Dank an alle Helfer
Salut, Pull-down-Widerstände werden nix bringen, weil es nichts "downzupullen" gibt. Am ausgebenden AVR die DDRx auf 0xff einstellen (ich hoffe, das hast Du schon gemacht, ansonsten sind die internen Pull-up-Widerstände des AVR alles, was Deinen (dann ziemlich hochohmigen) Ausgangspegel beeinflußt) und am empfangenden DDRx = 0x00 setzen. Du kannst genausogut am empfangenden AVR die DDRx = 0x00; PORTx = 0xff setzen, dann werden die Eingänge intern gegen Vcc gezogen. Damit cancelst Du schonmal Tristate-Zustände. Ob Du das gegen GND oder Vcc machst, spielt in diesem Fall ja keine Rolle (weil Du ja definierte Zustände hast - insofern sind Ziehwiderstände ja aber wie schon mehrfach erwähnt völlig überflüssig). Mit den internen Pull-ups sparst Du Dir aber erstmal das Löten. Insgesamt wird es Dir auf Dauer aber nur helfen, wenn Du Dich etwas in die Thematik einliest. Die Elektronikgrundlagen sollte man schon etwas kennen, bevor man beginnt, sich bei solchen Probleme an die Fehlersuche zu machen. Gruß, Mark
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.