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.