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