mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Eingang und Ausgang


Autor: He? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl-j. B. (matrixman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: He? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: He? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch ein Bild dazu.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi wrote:
> Hier noch ein Bild dazu.

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


Peter

Autor: He? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.