AVR Eingang und Ausgang

Gast #510812
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?
#510836
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
Gast #511781
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!
#511875
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
Gast #511908
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?
Gast #511978
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren