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


von Kai G. (runtimeterror)


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:
1
; der Code ist sinngemäß zu verstehen
2
3
init:  out DDRx, 1 << CLK_PIN  ; I/O als Ausgang
4
high:  out PORTx, 1 << CLK_PIN ; 1 ausgeben
5
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
1
out DDRx, 0 << DATA_PIN    ; I/O als input
2
out PORTx, 1 << DATA_PIN  ; internen Pull-Up aktivieren

Für den Low-Zustand den I/O als Ausgang konfigurieren und 0 ausgeben
1
out PORTx, 0 << DATA_PIN  ; Pull-Up deaktivieren
2
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
1
out DDRx, 0 << DATA_PIN    ; I/O als input
2
out PORTx, 1 << DATA_PIN  ; internen Pull-Up aktivieren
3
4
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

von Kai G. (runtimeterror)


Lesenswert?

Hmm... ist die Frage zu einfach oder zu schwer? ;)

von Andreas K. (a-k)


Lesenswert?

Welche konkrete Frage?

von Kai G. (runtimeterror)


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.

von Andreas K. (a-k)


Lesenswert?

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

von Kai G. (runtimeterror)


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 ?"

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.