mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sensor FOST02 an AVR - Fragen zur I/O-Konfiguration


Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen.

Ich bin gerade im Inbegriff den Feuchtigkeits- und Temperatursensor 
FOST02 an einen ATmega16 anzuschließen. Da das Ganze für mich 
Übungscharakter hat wollte ich nicht auf bestehende Bibliotheken 
zurückgreifen. Um jetzt nicht bei meinen ersten Versuchen direkt den 
Sensor oder Controller zu grillen wollte ich mir das unten aufgeführte 
Vorgehen von euch abgesegnen oder eben korrigieren lassen:

Clock
Das SCK (Serial Clock) Signal würde ich ohne weitere externe Beschaltung 
über einen als Ausgang konfigurierten I/O anschließen:
; der Code ist sinngemäß zu verstehen

init:  out DDRx, 1 << CLK_PIN  ; I/O als Ausgang
high:  out PORTx, 1 << CLK_PIN ; 1 ausgeben
low:  out PORTx, 0 << CLK_PIN ; 0 ausgeben

DATA Write
Die DATA-Leitung ist bidirektional ausgelegt. Nachdem ich 
Ausgangsstufen Logik-ICs durchgearbeitet habe, bin ich der Meinung, 
dass Open Collector das ist, was ich für die Anbindung brauche. Im 
Datenblatt für den Sensor findet sich dazu folgender Abschnitt:

"The DATA tristate pin is used to transfer data in and out of the 
device. ... To avoid signal contention the microcontroller should only 
drive data low. An external pull-up resistor (e.g. 10 kΩ) is required to 
pull the signal high."

Das entspricht meiner Meinung nach dem Open Collector Verhalten.

Auf der Seite des Mikrocontrollers würde ich dann zwischen folgenden 
zwei Zuständen an den I/Os umschalten:

Für den High-Zustand den I/O als Eingang mit aktiviertem internen 
Pull-Up konfigurieren
out DDRx, 0 << DATA_PIN    ; I/O als input
out PORTx, 1 << DATA_PIN  ; internen Pull-Up aktivieren

Für den Low-Zustand den I/O als Ausgang konfigurieren und 0 ausgeben
out PORTx, 0 << DATA_PIN  ; Pull-Up deaktivieren
out DDRx, 1 << DATA_PIN    ; I/O als output

Beim Umschalten zwischen High und Low ergibt sich folgendes Problem (aus 
dem ATmega16-Datenblatt):
"Switching between input with pull-up and output low generates the same 
problem. The user must use either the tri-state ({DDxn, PORTxn} = 0b00) 
or the output high state ({DDxn, PORTxn} = 0b11) as an intermediate 
step."

Ich würde mich hier für den tri-state-Zwischenzustand entscheiden. Das 
sollte ja kein Problem sein, da das SCK-Signal ja die Gültigkeit des 
Pegels bestimmt.

DATA Read
Für den Datenempfang auf der Controllerseite würde ich den I/O als 
Eingang mit aktiviertem Pull-Up konfigurieren
out DDRx, 0 << DATA_PIN    ; I/O als input
out PORTx, 1 << DATA_PIN  ; internen Pull-Up aktivieren

in isHigh, PINx    ; Zustand auslesen

Hab ich das soweit alles korrekt verstanden, oder gibt's da noch was 
nachzubessern? Sorry, ist alles Neuland für mich.

Hier noch das Datenblatt des FOST02:
http://profmason.com/wp-content/uploads/2007/10/fost02.pdf

Danke und schöne Grüße
Kai

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... ist die Frage zu einfach oder zu schwer? ;)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche konkrete Frage?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Um jetzt nicht bei meinen ersten Versuchen direkt den
>Sensor oder Controller zu grillen wollte ich mir das unten aufgeführte
>Vorgehen von euch abgesegnen oder eben korrigieren lassen:

>Hab ich das soweit alles korrekt verstanden, oder gibt's da noch was
>nachzubessern?

Ich will einfach nur wissen, ob ich das alles richtig verstanden habe, 
oder ob ich mit dem oben beschriebenen Verhalten in Gefahr laufe mir 
irgendwelche Bauteile zu zerstören.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei SDA optimal: Externen Pullup 10K statt des internen verwenden. Dann 
PORTx permanent auf 0 lassen und nur mit DDRx arbeiten.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bei SDA optimal: Externen Pullup 10K statt des internen verwenden. Dann
>PORTx permanent auf 0 lassen und nur mit DDRx arbeiten.

Klingt vernünftig. Wollte eigentlich keine externen Bauteile solange es 
in Software geht, aber den Widerstand werde ich auch noch überleben :)

Habe hier selbst noch ein paar Infos dazu gefunden:
Beitrag "Datenleitung, Ausgang oder Eingang ?"

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.