-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Wie funktioniert ein 1-Wire bus?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140

    Wie funktioniert ein 1-Wire bus?

    Anzeige

    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    68
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    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 ...

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    Ok, also so weit bin ich bis jetzt:

    Code:
    ;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

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    68
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    Aber ich will trotzdem wissen wie das geht

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    68
    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.

    Grüße und viel Erfolg.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •