moin!! ich möchte gerne mehrere ds auslesen und zwar mit dem matchrom befehl. die adr hab ich schon von den 3 ds aber irgendwie scheint keiner der sensoren auf die ausgelesene adr zu reagieren zeigt immer 255 an kann mir da vielleicht jemand weiter helfen?????????
also um helfen zu können wird hier immer wieder geschrieben: "hänge den code an und den schaltplan dazu".hast du auch die 4,7 kohm nach plus von deinem datapin des ds1820 auch nicht vergessen.
ist alles so angeschlossen wie du es beschrieben hast ich glaube sonst
hätte es schon von vornherein net funzt (ein sensor)
die routine für EINEN sensor ist einwandfrei um die adr auszulesen
funktioniert auch, nur halt wie gesagt der matchbefehl, vorher hatte ich
das commando ins falsche reg geschrieben, korrigiert, aber hat sich auch
nichts verändert
.include "m8def.inc" ;Atmega8 auf 4MHz
; Viele definierte Register werden nicht gebraucht
.DEF rd1lh = R0 ; LSB Divident Multiplikator 1 (8 Bit)
.DEF rd1l = R1 ; LSB Divident Multiplikator 1 (8 Bit)
.DEF rd1h = R2 ; MSB Divident Hilfsregister für Multiplikation
.DEF rd2h = R3 ; MSB Divident Hilfsregister für Multiplikation
.DEF rd3h = R4 ; MSB Divident Hilfsregister für Multiplikation
.DEF rd1u = R5 ; Hifsregister Multiplikator 2 (1-8 Bit)
.DEF rd2u = R6 ; Hifsregister Multiplikator 2 (9-16 Bit)
.DEF rd3u = R7 ; Hifsregister Multiplikator 2 (16-24 Bit)
.DEF rel = R8 ; LSB Ergebnis Ergebnis, LSB (16 Bit) = zehner und einer
.DEF reh = R9 ; MSB Ergebnis Ergebnis, MSB1 = tauserder und hunderter
.DEF reh2 = R10 ; Ergebnis, MSB2
.DEF rd2 = R11 ; Divisor
;.def disp = r12 ; Zähler für Sekundenausgabe
.def BCD0 = r13
.def BCD1 = r14 ;
.def BCD2 = r15 ;Speicherregister für Status des Hauptprogr.
.def temp0 = r16 ;da ein Verknüpfung mit
.def temp1 = r17 ;dem Infodisplay geplant ist.
.def temp2 = r18
.def temp3 = r19 ;Registerbezeichnung bleibt,
.def temp4 = r20
.def cnt = r21
.def sek = r22
.def WorkH = r23 ; Arbeitsregister für das Hauptprogramm
.def Count1= r24 ; Zähler der Interrupts
.def Count2= r25 ; Zählt die festgelegten sek runter
.equ abz =$0060 ;
.equ temperature_lsb =$0061 ;
.equ temperature_msb =$0062 ;
.equ TH_register =$0063 ;
.equ TL_register =$0064 ;
.equ res_byte4 =$0065 ;
.equ res_byte5 =$0066 ;
.equ count_remain =$0067 ;
.equ count_per_c =$0068 ;
.equ crc =$0069 ;
.equ halbeh =$006a
.equ halbel =$006b
.equ family1 =$006c ;
.equ abz2 =$006d
;;;;;;$0080 benutzt
;;;;;;$0081 benutzt
;;;;;;$0082 benutzt
;.equ =$0090 ;
;.equ =$0091 ;
;.equ =$0092 ;
;.equ =$0093 ;
;.equ =$0094 ;
;.equ =$0095 ;
;.equ =$0096 ;
;.equ =$0097 ;
;.equ =$0098 ;
;.equ =$0099 ;
;.equ =$009a ;
;***************************Einsprungadressen***********************
.cseg
.org $0000
rjmp Reset
Reset: rjmp stack
reti
reti
reti
reti
reti
;***************************Init mit allem drumdran*****************
stack: ldi temp1,high(ramend) ;Stackpointer festlegen
out sph, temp1
ldi temp1,low(ramend) ;Stackpointer festlegen
out spl, temp1
ldi temp0,$3f
out ddrc,temp0
rcall lcd_init
rcall lcd_clear
clr temp0
out ddrb,temp0
ldi temp0,$70
out ddrd,temp0
rcall sram
ldi temp1,$01
sts abz2,temp1
rjmp main
;***************************Hauptprogramme****************************
main: sbic pinb,0
rcall ds18_t
sbic pinb,1
rcall ds18_rr
sbic pinb,2
rcall ds18_wm
sbic pinb,3
rcall ds18_cp
rjmp main
;*************************temp eines sensors lesen*********************
ds18_t: rcall ds_reset ;wer ist da???
rcall skip_rom ;ansprechen aller slaves
rcall convert_t ;start tempmessung
rcall ds_reset ;wer ist da???
rcall skip_rom ;ansprechen aller slaves+vorbereitung der
tempmessung
rcall read_scratchpad
rcall ds_reset
rcall ausgabe
ret
;****************adr auslesen eines einzelnen sensors****************
ds18_rr: rcall ds_reset ;wer ist da???
rcall read_rom
rcall ds_reset ;wer ist da???
rcall ausgabe3
ret
;*******************temp lesen in abhängigkeit der adr****************
ds18_wm: rcall ds_reset
rcall match_rom
rcall s1_64bit
rcall convert_t
rcall ds_reset
rcall match_rom
rcall s1_64bit
rcall read_scratchpad
rcall ausgabe3
ret
;************************Th und Tl write******************************
ds18_thl: rcall ds_reset
rcall skip_rom
rcall write_scratchpad
rcall write_thl
ds18_cp: rcall ds_reset
rcall skip_rom ;ansprechen aller slaves+vorbereitung der
tempmessung
rcall read_scratchpad
rcall ds_reset
rcall skip_rom
rcall copy_scratchpad
rcall ausgabe3
ret
;***************************unterprogramme****************************
sram: clr temp0
clr temp1
ldi r28,low($0060)
ldi r29,high($0060)
sram2:
inc temp1 ;Masterclr des Sram's über
st y+,temp0 ;die indirekte Adressierung
cpi temp1,$40 ;anzahl der zellen zum löschen
breq sramstopp ;
rjmp sram2
sramstopp:
ret
;*****************************RESETPULS*********************************
********
ds_reset: sbi ddrd,0
cbi portd,0
rcall w500u
cbi ddrd,0
rcall w70u
wait_puls:
sbic pind,0
rjmp wait_puls ;falls bus high zurück
wait_puls_end:
sbis pind,0
rjmp wait_puls_end ;falls bus low zurück
ret
;*********ansprechen aller slave's, tempmessung auslösen aller
sensoren**
;***nachfolgend muss keine adr gesendet werden nur 1slave einfache *****
;***kommunikation ohne adr zu senden ***********************************
skip_rom:
ldi temp1,$cc
rcall write_command ;read or write
ret
match_rom:
ldi temp1,$55
rcall write_command
ret
write_scratchpad:
ldi temp1,$4E
rcall write_command
ret
write_thl:
ldi temp1,$01 ;Tl
rcall write_command
rcall delay10ms
ldi temp1,$00 ;Th
rcall write_command
rcall delay10ms
ret
copy_scratchpad:
ldi temp1,$48
rcall write_command
sbi ddrd,0
sbi portd,0
rcall delay10ms
rcall delay10ms
cbi ddrd,0
cbi portd,0
ret
;**************************read rom 64bits=8byte*********************
read_rom:
ldi temp1,$33
rcall write_command
rcall lesen ;daten empfangen und lesen
ret
;*******************read_scratchpad(auslesen der 9byte)****************
read_scratchpad:
ldi temp1,$be
rcall write_command
rcall lesen
ret
;***********Convert---T temperaturmessung starten im ds*************
convert_t: ldi temp1,$44
rcall write_command
rcall w6u
cbi ddrd,0
rcall w9u
convert_t1:
sbis pind,0
rjmp convert_t1
ret
;*********************auslesen*****************************************
lesen: rcall read_bit ;0
sts temperature_lsb,temp3
rcall read_bit ;1
sts temperature_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,$08
write_command1:
sbrs temp1,0
rcall write_0
sbrc temp1,0
rcall write_1
ror temp1
dec temp2
rcall w1u
brne write_command1
ret
write_1: cbi portd,0
sbi ddrd,0
rcall w6u
cbi ddrd,0
rcall w64u
ret
write_0: cbi portd,0
sbi ddrd,0
rcall w60u
cbi ddrd,0
rcall w10u
ret
read_bit:
clc
clr temp3 ;datenwort in temp3
ldi temp4,$08
read_bit0:
ror temp3
cbi portd,0
sbi ddrd,0
rcall w6u
cbi ddrd,0
rcall w9u
sbis pind,0
rjmp read_bit1
ldi temp2,$80
add temp3, temp2
rjmp read_bit2
read_bit1:
ldi temp2,$00
add temp3,temp2
read_bit2:
rcall w55u
dec temp4
brne read_bit0
ret
;********************adr s1******************************************
s1_64bit: ldi temp1,$10 ;0016
rcall write_command
ldi temp1,$fa ;0250
rcall write_command
ldi temp1,$24 ;0036
rcall write_command
ldi temp1,$c0 ;0192
rcall write_command
ldi temp1,$01 ;0001
rcall write_command
ldi temp1,$08 ;0008
rcall write_command
ldi temp1,$00 ;0000
rcall write_command
ldi temp1,$c7 ;0199
rcall write_command
ret
s2_64bit:
ldi temp1,$10 ;0016
rcall write_command
ldi temp1,$c2 ;0194
rcall write_command
ldi temp1,$23 ;0035
rcall write_command
ldi temp1,$a6 ;0166
rcall write_command
ldi temp1,$01 ;0001
rcall write_command
ldi temp1,$08 ;0008
rcall write_command
ldi temp1,$00 ;0000
rcall write_command
ldi temp1,$80 ;0128
rcall write_command
ret
s3_64bit: ldi temp1,$10 ;0016
rcall write_command
ldi temp1,$8a ;0138
rcall write_command
ldi temp1,$24 ;0036
rcall write_command
ldi temp1,$68 ;0104
rcall write_command
ldi temp1,$01 ;0001
rcall write_command
ldi temp1,$08 ;0008
rcall write_command
ldi temp1,$00 ;0000
rcall write_command
ldi temp1,$52 ;0082
rcall write_command
ret
;***********************ausgabe*************************************
ausgabe3:
lds temp0,temperature_lsb
sts abz,temp0
ldi temp1,0b10000000
rcall anzeige3
lds temp0,temperature_msb
sts abz,temp0
ldi temp1,0b10000100
rcall anzeige3
lds temp0,TL_register
sts abz,temp0
ldi temp1,0b10001000
rcall anzeige3
lds temp0,TH_register
sts abz,temp0
ldi temp1,0b10001100
rcall anzeige3
lds temp0,res_byte4
sts abz,temp0
ldi temp1,0b11000000
rcall anzeige3
lds temp0,res_byte5
sts abz,temp0
ldi temp1,0b11000100
rcall anzeige3
lds temp0,count_remain
sts abz,temp0
ldi temp1,0b11001000
rcall anzeige3
lds temp0,count_per_c
sts abz,temp0
ldi temp1,0b11001100
rcall anzeige3
rcall warte3s
rcall lcd_clear
lds temp0,crc
sts abz,temp0
ldi temp1,0b10000000
rcall anzeige3
rcall warte3s
ret
ausgabe: rcall div_2
ldi temp1,0b10000100
rcall point
lds temp0,halbeh
sts abz,temp0
ldi temp1,0b10000000
rcall anzeige3
lds temp0,halbel
sts abz,temp0
ldi temp1,0b10000101
rcall anzeige2
rcall warte3s
ret
;**********************ausgabe****************************************
anzeige2:
rcall lcd_clearAX ;Ausgabe
lds temp1,abz
rcall Zahldezi ;Hex in Dezimal
rcall Zahlout2 ;DezimalWert 2 Stellen
ret
anzeige3:rcall lcd_clearAX ;Ausgabe
lds temp1,abz
rcall Zahldezi ;Hex in Dezimal
rcall Zahlout4 ;DezimalWert 2 Stellen
ret
div_2: lds temp0,temperature_lsb
cpi temp0,$00
breq ende
div_21: inc temp1
subi temp0,$02
cpi temp0,$01
breq div_22
cpi temp0,$00
brne div_21
sts halbeh,temp1
clr temp2
sts halbel,temp2
ret
ende: clr temp2
sts halbeh,temp2
sts halbel,temp2
ret
div_22: sts halbeh,temp1
ldi temp2,$32
sts halbel,temp2
ret
;************************Zeitunterprogramme*************************
w750ms: sbi ddrd,0
sbi portd,0
ldi temp0,$1f
w750ms2:ldi temp1,$80
w750ms3:ldi temp2,$fb
w750ms4:dec temp2
brne w750ms4
dec temp1
brne w750ms3
nop
nop
dec temp0
brne w750ms2
cbi portd,0
cbi ddrd,0
rcall w6u
ret
w500u: ldi temp0,$03
w500u1: ldi temp1,$dd
w500u2: dec temp1
brne w500u2
dec temp0
brne w500u1
ret
w410u: ldi temp0,$03
w410u1: ldi temp1,$b5
w410u2: dec temp1
brne w410u2
dec temp0
brne w410u1
ret
w70u: ldi temp0,$5a
nop
w70u1: dec temp0
brne w70u1
nop
nop
ret
w64u: ldi temp0,$54
w64u1: dec temp0
brne w64u1
ret
w60u: ldi temp0,$4e
w60u1: dec temp0
brne w60u1
ret
w55u: ldi temp0,$47
w55u1: dec temp0
brne w55u1
ret
w40u: ldi temp0,$33
w40u1: dec temp0
brne w40u1
ret
w15u: ldi temp0,$13
w15u1: dec temp0
brne w15u1
ret
w10u: ldi temp0,$0c
w10u1: dec temp0
brne w10u1
ret
w9u: ldi temp0,$0a
w9u1: dec temp0
brne w9u1
ret
w6u: ldi temp0,$06
w6u1: dec temp0
brne w6u1
ret
w1u: nop
ret
;***************************txtausgabe*********************************
point: ldi temp1,0b10000100
rcall lcd_clearAX
ldi ZH,high(Out1)
ldi ZL,low(Out1)
ldi cnt,$01 ;8 Zeichen im Display ansteuern
rcall Textout
ret
zero: ldi temp1,0b11000100
rcall lcd_clearAX
ldi ZH,high(Out2)
ldi ZL,low(Out2)
ldi cnt,$06 ;8 Zeichen im Display ansteuern
rcall Textout
ret
go: ldi temp1,0b11000100
rcall lcd_clearAX
ldi ZH,high(Out3)
ldi ZL,low(Out3)
ldi cnt,$06 8 Zeichen im Display ansteuern
rcall Textout
ret
;*************************ascIIwandlung*****************************
out1: .db"."
out2: .db" "
out3: .db"online"
;*************************weitere*includedata***********************
.include "lcd-rout.asm" ;LCD-Routinen
.include "ds18s20.asm"
;*************************ENDE**************************************
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.