Forum: Mikrocontroller und Digitale Elektronik Probleme mit Pulldowns


von Christopher Seifert (Gast)


Lesenswert?

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.

von Ronny Schulz (Gast)


Lesenswert?

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.

von Christopher Seifert (Gast)


Lesenswert?

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.

von formtapez (Gast)


Lesenswert?

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

von Christof Krüger (Gast)


Lesenswert?

Wie synchronisierst du denn den Datentransfer? Generierst du ein
Clock-Signal, oder wie?

von Christopher Seifert (Gast)


Lesenswert?

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?

von Christof Krüger (Gast)


Lesenswert?

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.

von Mark Hämmerling (Gast)


Lesenswert?

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

von Christopher Seifert (Gast)


Lesenswert?

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.

von Christof Krüger (Gast)


Lesenswert?

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?

von Christopher Seifert (Gast)


Lesenswert?

So kann man es ausdrücken

von Christof Krüger (Gast)


Lesenswert?

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?

von Christopher Seifert (Gast)


Lesenswert?

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

von Mark Hämmerling (Gast)


Lesenswert?

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