PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie funktioniert ein 1-Wire bus?



Gerko
16.10.2007, 21:11
Hallo an alle Assemblerliebhaber!

Weiß jemand wie man einen 1-Wire bus ansteuert, bzw. ausließt?
Ich will nämlich eine Temperatur mit einem DS 1822 messen. Dieser Sensor liefert mir den Temperaturwert DIGITAL !!! nur leider weiß ich nicht genau wie ich das ganze eigentlich auf meinem ATmega8 auswerten kann.

Zu diesem Zweck hab ich schon mal ein bischen gegooglet und bin auf das Prinzip draufgekommen. Also man schickt dem ganzen Sensor mal Spannung damit sich dort die Kondensatoren laden können, und anschließend (wenn man die Spannung wieder wegnimmt) fängt der an zu senden. Bitte korregiert mich wenn ich komplett daneben liege.
Jetzt weiß ich aber nicht in welchen Zeitabständen die einzelnen Bits kommen. Insgesamt müsste der Sensor 2Byte übertragen.

Wenn ich das Programm fertig habe bin ich gerne bereit es hier online zu stellen, nur alleine schaffe ich das glaub ich nicht, also dachte ich mir ich frage mal die Profies.

Danke schon mal, Gerko

PS: Rechtschreibfehler sind bewusst kreativ eingebracht worden und dürfen bei entdecken behalten werden.

gummi_ente
17.10.2007, 06:41
Hallo Gerko,

nicht ganz, wie Du beschrieben hast. Die Funktion ist hier beschrieben: http://www.maxim-ic.com/appnotes.cfm/an_pk/214.

Wie es geht z.B. in C steht hier: http://www.mikrocontroller.net/topic/14792#new

Und vom Hersteller hier: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2795/t/do

Grüße

Gerko
17.10.2007, 18:45
Danke für die Links, ich werd das Morgen mal alles mal durchackern. Hab beim ersten Links schon mal gesehn das ich den UART verwenden muss (dachte immer das geht ohne). So erklärt sich es für mich jetzt von selbst wie ich die ganzen Werte einlesen kann.

wkrug
18.10.2007, 18:46
Hab beim ersten Links schon mal gesehn das ich den UART verwenden muss (dachte immer das geht ohne)
Bei den meisten Compilern ist eine 1wire implementation vorhanden.
Soweit ich weiß ist aber dabei der Port - Pin frei wählbar.

Mit einen UART ist es vieleicht einfacher zu proggen, aber wenns der Compiler schon an Board hat ...

Gerko
18.10.2007, 19:10
Ich verwende AVR Studio4, da ist sowas glaub ich nicht vorhanden (man kann mir ja eines besseren belehren).

Was ich bis jetzt geschafft habe ist es das Prinzip in ein Programm umzuschreiben, also quasi schon fast fertig, nur eines brauch ich noch.
Der Sensor hat eine 6Byte adresse, schön langsam gehn mir allerdings die Register aus :)

Wie kann ich die 6 Byte so abspeichern das ich 2 oder mehr Sensoren insgesamt dann in eine "Liste" eintragen kann, und somit mehrer Sensoren seperat ansprechen?

Ich hab mich leider noch nie mit den Speichern im Kontroller befasst (Grundwissen hab ich schon drüber, aber hald nix spezifisches) daher wäre es nett wenn mir da jemand einen Befehl für das Beschreiben vom EEPROM??? (bin mir nciht sicher ob der geeignet is) geben kann.

Rofo88
18.10.2007, 20:23
Naja wenn Du was speichern wills und dir die Register ausgehen dann nehme doch den Ram, dafür ist der ja da.

Und damit Du nicht alles neu erfinden musst gibts hier schönen Assembler-Code : http://s-huehn.de/elektronik/tempmess/tempmess-sm1.htm

MfG der RoFo

Gerko
19.10.2007, 13:01
Ok, also so weit bin ich bis jetzt:



;Temperatursensor auf PortX, X (Einstellbar)
.equ Wire1_DDR = DDRD
.equ Wire1_PORT = PORTD
.equ Wire1_PIN = PIND
.equ Wire1_IO = 4

;*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X* X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X
; Sensoradressen ermittlen
suche_Adressen:
rcall reset
rcall search_rom
ret
;_________________________________________________ ________
; Temperatur eines Sensors einlesen
read_Temperatur1:
rcall reset
rcall skip_rom
rcall convert_t
rcall reset
rcall skip_rom
rcall read_scratchpad
rcall reset
ret

;_________________________________________________ ________
; *** Behandelte Unterprogramme ***
;_________________________________________________ ________
; -reset
; -search_rom* ; Sucht alle angeschlossenen Slaves
; -read_rom ; Liest 64Bit Adresse aus (nur bei einem Slave möglich)
; -match_rom* ; Ansprechen eines bestimmten Slaves
; -skip_rom ; Ansprechen aller Slaves
; -Alarm_search* ; Wie search_rom, nur das alle Slaves mit Alarmen antworten

; -convert_t ; Veranasst den Sensor eine neue Messung zu starten
; -write_scratchpad*; Um einen Slave zu Programmieren (TH, TL, ConfigReg)
; -read_scratchpad ; Liest einen Sensor aus
; -copy_scratchpad* ; Schreibt konfiguration einens Sensors in EEPROM
; -RecallEE* ; Keine Ahnung für was man das jemals braucht
; -Read_Power_Supply*;Keine Ahnung für was man das jemals braucht


; *... noch nicht fertig
;*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X* X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X
; Reset Impuls
reset:
sbi Wire1_DDR, Wire1_IO
cbi Wire1_PORT, Wire1_IO
rcall Wait_500us
cbi Wire1_DDR, Wire1_IO
rcall Wait_70us
wait_puls:
sbic Wire1_PIN, Wire1_IO
rjmp wait_puls ;falls bus high zurück
wait_puls_end:
sbis Wire1_PIN, Wire1_IO
rjmp wait_puls_end ;falls bus low zurück
ret
;_________________________________________________ ________
; Suche
search_rom:
rcall reset
;!?!
ret
;_________________________________________________ ________
; alle Sensoren
skip_rom:
ldi temp, 0xCC
rcall write_command ;read or write
ret

;_________________________________________________ ________
; Ein bestimmter Sensor
match_rom:
; !?!
ret
;_________________________________________________ ________
; read rom 64bits=8byte
read_rom:
ldi temp, 0x33
rcall write_command
; 64Bit abspeichern
ret

;_________________________________________________ ________
; read_scratchpad(auslesen der 9byte)
read_scratchpad:
ldi temp, 0xBE
rcall write_command
rcall lesen
ret

;_________________________________________________ ________
; Convert---T temperaturmessung starten im ds
convert_t:
ldi temp, 0x44
rcall write_command
rcall Wait_6us
cbi Wire1_DDR, Wire1_IO
rcall Wait_9us
; rcall w750ms ;unterdrückung 85.00 im disp.
convert_t1:
sbis Wire1_PIN, Wire1_IO
rjmp convert_t1
ret

;*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X* X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X
; Unterprogramme
; auslesen
lesen:
rcall read_bit ;0
sts temp_lsb,temp3
rcall read_bit ;1
sts temp_msb,temp3
rcall read_bit ;2
sts th_register,temp3
rcall read_bit ;3
sts tl_register,temp3
rcall read_bit ;4
sts res_byte4,temp3
rcall read_bit ;5
sts res_byte5,temp3
rcall read_bit ;6
sts count_remain,temp3
rcall read_bit ;7
sts count_per_c,temp3
rcall read_bit ;8
sts crc,temp3
ret

;_________________________________________________ ________
; Unterprogramme
write_command:
ldi temp2, 0x08
write_command1:
sbrs temp,0
rcall write_0
sbrc temp,0
rcall write_1
ror temp
dec temp2
brne write_command1
ret

write_1:
cbi Wire1_PORT, Wire1_IO
sbi Wire1_DDR, Wire1_IO
rcall Wait_6us
cbi Wire1_DDR, Wire1_IO
rcall Wait_64us
ret

write_0:
cbi Wire1_PORT, Wire1_IO
sbi Wire1_DDR, Wire1_IO
rcall Wait_60us
cbi Wire1_DDR, Wire1_IO
rcall Wait_10us
ret
;_________________________________________________ ________

read_bit:
clr temp3 ;datenwort in temp3
ldi temp4, 0x08

read_bit0:
ror temp3
cbi Wire1_PORT, Wire1_IO
sbi Wire1_DDR, Wire1_IO
rcall Wait_6us
cbi Wire1_DDR, Wire1_IO
rcall Wait_9us
sbis pind,0
rjmp read_bit1 ;0 lesen
ldi temp2, 0x80 ;1 lesen
add temp3,temp2
rjmp read_bit2

read_bit1:
ldi temp2, 0x00
add temp3,temp2

read_bit2:
rcall Wait_55us
dec temp4
brne read_bit0
ret

im Hauptprogramm muss man zusätzlich noch die SRAM speicheradressen initialisieren, und temp-temp4.
__________________________________________________ _________
Mit einem Temperatursensor könnte man das ganze schon verwenden, irgenwie ...
Ich will aber 2, also hab ich mir 2 lösungswege einfallen lassen:
- Entweder ich mach die 2 über einen Eingang und schreibe noch weiter an dem File,
- oder ich lege meinen 2ten Sensor auf einen anderen Eingang und lass auf dem ebenfalls die gleiche Routine durchlaufen.

Frage: Ist es überhaupt möglich an einer Leitung die 2 Sensoren räumlich zu unterscheiden?
__________________________________________________ _________
Entweder-Lösung:
Ich hab jetzt angefangen das Pdf zu lesen wo genau beschrieben steht wie man den search_rom befehl programmieren kann, und irgenwie schaltet mein Hirn nach einiger Zeit immer wieder aus,... übersteigt einfach mein Verständnis denke ich. 1. weils english ist, und 2. weils einfach zu kompliziert ist.
Naja, wenn ich das noch 1-2mal lese dann versteh ich vielleicht ein bischen was davon.
Wie kann ich z.B in einen Speicherbereich von 8Byte die einzelnen Byte so reinschreiben das ich sie nachher wieder geordnet auslesen kann (klingt nach einer blöden frage, aber ihr müsst verstehn, ich hab das noch nie gemacht mit SRAM)
Und wie Funktioniert dieser Search_rom befehl überhaupt?

- Reset Senden
- 0xF0 Senden (Search_Rom)
- Rest versteh ich schon nimma (irgenwas mit Slave sendet 0 oder 1 und darauf weiß man dann seine 64Bit adresse, kommt mir noch ein bissi spanisch vor)
__________________________________________________ _________
Oder-Lösung:
Ist nicht so schön, und mag ich eigentlich auch nicht ^^
__________________________________________________ _________

Naja, jedem der sich die Mühe macht das alles noch zu lesen: Danke
Vielleicht kann mir irgenwer ja bei der Logik zum Programmieren der Search_rom Funktion helfen. das Match_rom wird ja dann ähnlich gehn, wenn ich weiß wie man den SRAM wieder ausließt.

Danke schon mal im Voraus
Gerko

gummi_ente
19.10.2007, 13:20
Hallo Gerko,

warum so kompliziert.

So ein Sensor ist auch nur ein "Mensch" und ist froh wenn er angesprochen wird,
will sagen, wenn Du für jeden Sensor einen PIN nutzt kannst Du Dir das mit der Adresse sparen.

Dann kannst Du so vorgehen:

Ablauf

; LOOP
; - DS18B20 Reset
; - DS18B20 DoConversation senden
; - 750 msec warten, abhängig von Genauigkeit
; - DS18B20 Reset
; - DS18B20 Read Scartchpad 2 Byte
; - DS18B20 Reset, keine CRC-Prüfung!!
; - Daten verarbeiten
; ENDLOOP


Werde einmal sehen, habe so was mal mit 12 Sensoren gemacht, wenn ich den Code finde ich ihn Dir.

Grüße

Gerko
19.10.2007, 14:21
Aber ich will trotzdem wissen wie das geht :)

gummi_ente
19.10.2007, 17:30
Hi Gerko,

dann sieh einmal hier: http://www.mikrocontroller.net/topic/14792

Da wurde viel darüber geschrieben.

Übrigens im wilden Westen wurde Leute erschossen wenn die zuviel wußten.:mrgreen:

Grüße und viel Erfolg.

wkrug
19.10.2007, 19:01
Aber ich will trotzdem wissen wie das geht
Dazu solltest Du das Datenblatt deines Sensors durcharbeiten.
Hat aber sehr viel mit zeitabhängigen Vorgängen zu tun.
Ich hab mal versucht einen 1wire Empfänger in Assembler zu proggen, das war eine übelste Arbeit. Ausgetestet hab ich das Teil aber aus Zeitmangel und wegen anderer Projekte noch nicht
In AVR Studio 4 gibts natürlich keine 1wire Routinen, aber in BASCOM und in CodeVision gibt es sicher welche.
Ich vermute auch Win AVR wird 1wire Routinen implementiert haben.
Also warum das Rad 2mal erfinden ?

Gerko
21.10.2007, 09:57
Hmm, ich glaube das wird zu viel arbeit.
Der eine sagt er erschießt mich wenn ich zu viel weiß, und der andere ich soll das rad nicht neu erfinden :) vielleicht mach ich das doch über 2 Eingänge, dann kann ich den code den ich bis jetzt habe verwenden und brauch nicht weiter Stundenlang versuchen das Datenblatt zu verstehen.

Trotzdem muss ich sage das mir das Vorhaben alleine schon einiges an Wissen gebracht hat, jetzt weiß ich z.B wie man mit Speichern noch mehr machen kann.

In diesem Sinne stell ich das Projekt ein und befasse mich mal mit der Auswertung ... Schließlich soll das ganze Ding ja auch mal funktionieren.

mfg Gerko

wkrug
21.10.2007, 14:00
@Gerko
Wenn Du dein 1wire Projekt tatsächlich in Assembler angehen möchtest wird es schwierig. Du muss dazu erstamal ein Protokoll erarbeiten, das das Timing auf dem 1wire Bus auch einhält.
Als nächstes musst Du dich dann um den Datenaustausch auf dem 1wire Bus kümmern.
Wenn sich nun dein Sensor nicht ansprechen lässt weißt Du im Prinzip nicht an welchem Programmteil es denn nun liegt.

Wenn Du aber fertige Routinen aus einer Hochsprache verwenden würdest, bräuchtest Du dich nur noch um die Sendung und den Empfang der richtigen Daten kümmern und das ist eine lösbare Aufgabe.

Um das Durcharbeiten des Datenblattes (evtl. auch mehrere) und Umsetzung für deine Anwendung kommst Du aber so oder so nicht herum.