Forum: Mikrocontroller und Digitale Elektronik AVR Eingang und Ausgang


von He? (Gast)


Lesenswert?

Hi,
ist es irgendwie möglich einen Portpin sowohl als Eingang als auch als 
Ausgang laufen zu lassen?
Der Pin wird über externe Pullups auf vcc gezogen.
Nun sollte der AVR die Leitung auf Gnd ziehen können aber die Leitung 
soll auch ausserhalb vom µC auf Gnd gezogen werden können (und dieser 
solls mitbekommen)

Kurz und gut:
Was passiert wenn ich den Pin als Ausgang konfigurier und dann halt mit 
porta die ausgangspegel setz aber gleichzeitig mit pina die 
eingangspegel abrufe?

Geht das?
Oder muss ich zwischendurch das ddra umschalten?

von Karl-j. B. (matrixman)


Lesenswert?

Nö musst du nicht.

PINx sagt dir immer den Status welcher am Port liegt

Wenn jedoch der Pin als Ausgang im DDRx gestellt wird geht der Strom 
wahrscheinlich hoch da er den Ausgang mit 0V bzw 5V verbindet.


mfg Karl

von Peter D. (peda)


Lesenswert?

He? wrote:

> Was passiert wenn ich den Pin als Ausgang konfigurier und dann halt mit
> porta die ausgangspegel setz aber gleichzeitig mit pina die
> eingangspegel abrufe?
>
> Geht das?

Das geht, nennt sich open-drain Ausgang.

Dazu muß das PORTx-Bit einmalig auf 0 gesetzt werden.

Um eine 1 zu senden: DDRx = 0
Um eine 0 zu senden: DDRx = 1


Peter

von Jörg B. (manos)


Lesenswert?

Das was Du vorhast klingt wie I2C. Leitung wird über Pullup auf 5V 
gezogen und von irgendeinem der angeschlossenen Devices auf 0V gezogen. 
Die anderen Devices horchen währenddessen auf diesem Pin.

von He? (Gast)


Lesenswert?

War tatsächlich I2C.
Lief auch soweit, allerdings hatte ich das Problem das mein EEPROM nicht 
mitmachen wollte.
Die Befehle hat es soweit angenommen (und mit ACK bestätigt sofern sie 
korrekt waren) das Problem ist jedoch dass vor dem Auslesen ein Dummy 
Write gemacht werden muss, und selbiges lief überhaupt nicht.
Ich kann mal kurz die Vorgehensweise dafür schildern:

1 Start Condition
2 Device Address incl. Write Bit
3 EEPROM sendet ACK
4 Erste 8bit der Adresse werden übertragen
5 EEPROM sendet ACK
6 Zweite 8bit der Adresse werden übertragen
7 EEPROM sendet ACK
8 Dummy Daten werden übertragen
9 EEPROM sendet ACK
10 Start Condition
11 Device Address incl. Read Bit
12 EEPROM sendet ACK (auch bei falscher DEVADDR)
13 EEPROM sollte die Daten übertragen

Leider tut es das aber nicht.
Es könnte an 2 Dingen liegen:
Nach dem Schreiben der Daten (natürlich NICHT der Dummy Daten) wird die 
Stop Condition falsch verstanden.
Ich nehme mal an dass wen die nicht folgt die Daten nicht geschrieben 
werden.
Desweiteren habe ich beobachtet dass bei Schritt 11 das EEPROM auch ein 
ACK sendet wenn die Device Adresse falsch ist, bei allen anderen 
Abfragen funktioniert es jedoch normal.

Hat jmd von euch eine Idee?
Das er eine falsche Dev-Adresse akzeptiert verblüfft mich einfach..
Vllt hab ich auch einfach das Datenblatt falsch verstanden..

Das Ganze ist eine reine Software Lösung und ich verarbeite nur Bits, 
deswegen ist der Code etwas unübersichtlich und lang, ich könnte ihn 
aber auch mal posten..

EEPROM ist das 24C128 und SDA bzw. SCL liegen auf PORTA eines AT90S8515

Vllt fällt den alten Hasen hier mal was ein :)

Gruß und Danke!

von Peter D. (peda)


Lesenswert?

He? wrote:

> Die Befehle hat es soweit angenommen (und mit ACK bestätigt sofern sie
> korrekt waren) das Problem ist jedoch dass vor dem Auslesen ein Dummy
> Write gemacht werden muss, und selbiges lief überhaupt nicht.

Wo hastn das her ?

Daß der EEPROM beim Dummy-Write austillt, kann ich verstehen, sowas 
gibts garnicht.

Du verwechselst das wohl mit SPI.


Peter

von Peter D. (peda)


Lesenswert?

He? wrote:

> Das Ganze ist eine reine Software Lösung und ich verarbeite nur Bits,
> deswegen ist der Code etwas unübersichtlich und lang, ich könnte ihn
> aber auch mal posten..

Nö, SW-I2C muß weder lang noch unübersichtlich sein:

http://home.tiscali.de/peterd/appl/soft/c51/eeprom/index.htm


Peter

von He? (Gast)


Lesenswert?

@Peter

Aus dem Datenblatt? Schau mal:

RANDOM READ: A random read requires a “dummy” byte write sequence to 
load in the data
word address. Once the device address word and data word address are 
clocked in and
acknowledged by the EEPROM, the microcontroller must generate another 
start condition.
The microcontroller now initiates a current address read by sending a 
device address with the
read/write select bit high. The EEPROM acknowledges the device address 
and serially clocks
out the data word. The microcontroller does not respond with a zero but 
does generate a following
stop condition (refer to Figure 5).

Es ist I2C bzw. TWI. Oder bin ich im falschen Film und kann nichtmal 
lesen?

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Bild dazu.

von Peter D. (peda)


Lesenswert?

Andi wrote:
> Hier noch ein Bild dazu.

Und wo siehst Du auf diesem Bild Deinen Schritt 8 und 9 ?


Peter

von He? (Gast)


Lesenswert?

AAArgh okok..
entweder ich bin doof und habs falsch aufgeschrieben, oder ich machs im 
Programm wirklich falsch.
Ich habs jetz nicht hier, sitz am Notebook, aber denke mal das könnte 
der Grund sein. Ich glaube ich hab da wirklich noch ein Datenbyte drin.

Dank dir Peter!

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.