Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 12.11.2007, 21:36  
stml
Частый гость
 
Регистрация: 06.06.2007
Сообщений: 42
Сказал спасибо: 1
Сказали Спасибо 9 раз(а) в 6 сообщении(ях)
stml на пути к лучшему
По умолчанию Набор подпрограмм (MCS51) для работы с DS1820

Здравствуйте, уважаемые форумчане.

Подмогните пожалуйста ссылочкой или если есть исходниками на тему. Понимаю, что изобретаю велосипед. Думаю, что где-то это есть и кто-нибудь обязательно это делал.
Особенность в том, что на шине будет порядка 20 датчиков. Следовательно, нужна п/п Serch ROM и Match ROM особенно.

Заранее спасибо.
Реклама:
stml вне форума  
Непрочитано 12.11.2007, 23:34  
lsa
Почётный гражданин KAZUS.RU
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
lsa на пути к лучшему
По умолчанию

Вот исходник на асме из одного файла:
Код:
;; Dallas DS1820 multidrop routines using timer 1 in mode 3 for MCS51
;; External power for DS1820 assumed
;; Clock is 11.0592 MHz -› one cycle is 1.0850694 us
;; Copyright 1999, Leon Kos, University of Ljubljana
;; TODO: Initial check routines for external power on each device

	NAME DS1820

	data_bit BIT 0EFh	; P4.7
	EAL	 BIT 0AFh	; enable all interrupts (SAB80C515 specific)
	
ds1820_routines	SEGMENT CODE		
T1_interrupt	SEGMENT CODE
ds1820rom	SEGMENT CODE
dowcrc		SEGMENT CODE
ds1820data	SEGMENT DATA
bitvar		SEGMENT BIT
	

	public	ds1820_init
	public	_ds1820_start
	public	touch_byte
	public	convert_time
	public	ds1820error
	public	scratchpad
	public	ds1820crc_ok
	public	errornum
					
CSEG    AT      0001BH
	jmp    timer1

	RSEG  T1_interrupt

timer1:
	push    acc		; 2
	push    psw		; 2
	push	dpl		; 2
	push	dph		; 2
	jnb	bit_state, matchROM_loop
	
bit_loop:			; bit writing/reading loop
	setb	data_bit
	setb	bit_state	; enable this state
	mov	c, read_slot
	mov	a, touch_byte
	rrc	a
	mov	touch_byte, a
	djnz	bitcnt, touch_bit
	mov	bitcnt, #9
	clr	bit_state
	jmp	exit_t1
	
touch_bit:
	clr	data_bit
	nop
	nop
	nop
	nop
	mov	data_bit, c
	nop
	nop
	nop
	nop
	nop
	nop
	mov	c, data_bit
	mov	read_slot, c
	mov	TH0, #(0FFh - 20)
	pop	dph		; 2
	pop	dpl		; 2
        pop     psw		; 2
	pop     acc		; 2
	reti
	
matchROM_loop:
	jnb	matchROM_state, reset_state_loop
	mov	a, loop		; test the loop counter
	clr	C		; clear for one byte substraction
	subb	a, #8		; loop couner in incrementing
	jz	_rom_end	; substract to match zero at end
	mov	dptr, #rom_table; point to in CODE device table
	mov	a, ds1820device	; which device
	rl	a		; address 
	rl	a		; is multiple of
	rl	a		; 8 offset
	add	a, loop		; select byte from table
	movc	a, @a+dptr
	mov	touch_byte, a
	inc	loop
	jmp	bit_loop
_rom_end:
	clr	matchROM_state
	inc	state		
	jmp	state_loop
	
reset_state_loop:
	jnb	reset_state, state_loop
	mov	a, loop
	dec	a
	jz	_reset_end
	mov	loop, a
	add	a, #254
	jnz	_rst0
	setb	data_bit
_rst0:	jmp	exit_t1
	
_reset_end:
	clr	reset_state
	inc	state
	
state_loop:			; Main state machine loop
	mov	a, state	; must be in the middle
	mov	dptr, #jump_table; of the code
	movc	a, @a+dptr
	jmp	@a+dptr
	
jump_table:	
	db	reset0		- jump_table
	db	match_rom0	- jump_table
	db	convertT	- jump_table
	db	readbusy	- jump_table
	db	reset1		- jump_table
	db	match_rom1	- jump_table
	db	read_scratchpad	- jump_table
	db	temp_lsb	- jump_table
	db	temp_msb	- jump_table
	db	user_byte1	- jump_table
	db	user_byte2	- jump_table
	db	reserved1	- jump_table
	db	reserved2	- jump_table
	db	count_remain	- jump_table
	db	count_per_c	- jump_table
	db	crc		- jump_table
	db	stop		- jump_table
	
reset0:
	mov	loop, #4
	setb	reset_state
	mov	TH0, #(255-200)	; first half of the reset time
	clr	data_bit
	jmp	exit_t1
match_rom0:
	mov	touch_byte, #55h
	mov	loop, #0
	setb	matchROM_state
	jmp	bit_loop
convertT:
	mov	touch_byte, #44h
	inc	state
	mov	convert_time, #00h
	mov	convert_time + 1, #00h
	jmp	bit_loop
		
readbusy:	; check every 280us
	inc	convert_time + 1; 
	mov	a, convert_time + 1
	jnz	_noinc
	inc	convert_time
	mov	a, #08h		; 8*72ms=569ms overrun
	anl	a, convert_time
	jz	_noinc
	setb	ds1820error	; short circuit
	mov	errornum, #1	; to long zero resonse
	jmp	end_t1
_noinc:	mov	a, touch_byte
	mov	touch_byte, #0FFh
	inc	a
	jz	converted
	jmp	bit_loop
converted:
	clr	C
	mov	a, convert_time+1; compare the conversion
	subb	a, #20		; time must be over 20
	mov	a, convert_time	; typical time is 240
	subb	a, #0
	jnc	_endcvt
	setb	ds1820error	; to quick ready response
	mov	errornum, #2	; no device or no power on
	jmp	end_t1		; device or line open
_endcvt:	
	inc	state		
reset1:
	mov	loop, #4
	setb	reset_state
	mov	TH0, #(255-200)	; first half of the reset time
	clr	data_bit
	jmp	exit_t1
match_rom1:
	mov	touch_byte, #55h
	mov	loop, #0
	setb	matchROM_state
	jmp	bit_loop
read_scratchpad:
	mov	touch_byte, #0BEh
	inc	state
	jmp	bit_loop
temp_lsb:			; larger but easy to fetch bytes
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
temp_msb:
	mov	scratchpad, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop

user_byte1:			
	mov	scratchpad + 1, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
user_byte2:
	mov	scratchpad + 2, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
reserved1:
	mov	scratchpad + 3, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
reserved2:
	mov	scratchpad + 4, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
count_remain:
	mov	scratchpad + 5, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
count_per_c:
	mov	scratchpad + 6, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
crc:
	mov	scratchpad + 7, touch_byte
	mov	touch_byte, #0FFh
	inc	state
	jmp	bit_loop
stop:
	mov	scratchpad + 8, touch_byte
end_t1:	
	clr	ET1		; disable interrupt
	clr	TR1		; stop the timer
	mov	state, #0	; reset the machine state
	setb	data_bit	; power the line
exit_t1:			; exit from interrupt
	pop	dph		; 2
	pop	dpl		; 2
        pop     psw		; 2
	pop     acc		; 2
	reti    

	RSEG ds1820_routines
ds1820_init:			; initialize the variables
	mov	bitcnt, #9	; bit counter
	setb	data_bit	; power the devices on line 1
	clr	matchROM_state	; not sending match ROM to ds1820
	clr	bit_state	; not in the bit delay state
	clr	reset_state	; not in the reset state
	mov	state, #0	; clear machine state
	mov	ds1820device,#0	; default is reading device0
	mov	TMOD, #033h	; timer 0 & timer 1 -› mode 3
	setb	EAL
	ret

_ds1820_start:			; R7 has the device number to read
	mov	ds1820device,R7
	mov	TH0,#0FAh
	clr	ds1820error	; no error at beginning
	mov	errornum, #0
	setb	ET1
	setb	TR1
	ret     


	RSEG dowcrc
ds1820crc_ok:			; extern bit ds1820crc_ok(void);
	mov	loop, #9	; 8+1 byte CRC
	mov	ds1820crc, #0	; clear CRC register
	mov	dptr, #dowcrc_table
	mov	r0, #scratchpad

_crc:		
	mov	a, @r0		; scratchad value
	xrl	a, ds1820crc
	movc	a, @a+dptr
	mov	ds1820crc, a
	inc	r0
	djnz	loop, _crc
	jz	_ok
	clr	CY
	ret
_ok:	setb	CY
	ret
	
dowcrc_table:	DB	0, 94, 188, 226, 97, 63, 221, 131
		DB	194, 156, 126, 32, 163, 253, 31, 65
		DB	157, 195, 33, 127, 252, 162, 64, 30
		DB	95, 1, 227, 189, 62, 96, 130, 220
		DB	35, 125, 159, 193, 66, 28, 254, 160
		DB	225, 191, 93, 3, 128, 222, 60, 98
		DB	190, 224, 2, 92, 223, 129, 99, 61 
		DB	124, 34, 192, 158, 29, 67, 161, 255
		DB	70, 24, 250, 164, 39, 121, 155, 197 
		DB	132, 218, 56, 102, 229, 187, 89, 7
		DB	219, 133, 103, 57, 186, 228, 6, 88 
		DB	25, 71, 165, 251, 120, 38, 196, 154
		DB	101, 59, 217, 135, 4, 90, 184, 230 
		DB	167, 249, 27, 69, 198, 152, 122, 36
		DB	248, 166, 68, 26, 153, 199, 37, 123 
		DB	58, 100, 134, 216, 91, 5, 231, 185
		DB	140, 210, 48, 110, 237, 179, 81, 15 
		DB	78, 16, 242, 172, 47, 113, 147, 205
		DB	17, 79, 173, 243, 112, 46, 204, 146 
		DB	211, 141, 111, 49, 178, 236, 14, 80
		DB	175, 241, 19, 77, 206, 144, 114, 44 
		DB	109, 51, 209, 143, 12, 82, 176, 238
		DB	50, 108, 142, 208, 83, 13, 239, 177 
		DB	240, 174, 76, 18, 145, 207, 45, 115
		DB	202, 148, 118, 40, 171, 245, 23, 73 
		DB	8, 86, 180, 234, 105, 55, 213, 139
		DB	87, 9, 235, 181, 54, 104, 138, 212 
		DB	149, 203, 41, 119, 244, 170, 72, 22
		DB	233, 183, 85, 11, 136, 214, 52, 106 
		DB	43, 117, 151, 201, 74, 20, 246, 168
		DB	116, 42, 200, 150, 21, 75, 169, 247 
		DB	182, 232, 10, 84, 215, 137, 107, 53
		
alternate_dowcrc:		; slower and thus not used
	mov	ds1820crc, #0
	mov	loop, #8	; 8 bytes
	mov	r0, #scratchpad

_dcrc:	mov	a, @r0
	call	do_crc
	inc	r0
	djnz	loop, _dcrc
	ret
	
do_crc:	push	acc
	push	b
	push	acc
	mov	b, #8
crc_loop:
	xrl	a, ds1820crc
	rrc	a
	mov	a, ds1820crc
	jnc	zero
	xrl	a, #18h
zero:	rrc	a
	mov	ds1820crc, a
	pop	acc
	rr	a
	push	acc
	djnz	b, crc_loop
	pop	acc
	pop	b
	pop	acc
	ret	
	
	RSEG ds1820data
bitcnt:		ds	1	; bit couter
touch_byte:	ds	1	; touch byte
scratchpad:	ds	9	; DS1820 scratchpad
convert_time:	ds	2	; time required for conversion
state:		ds	1	; machine state
loop:		ds	1	; shared byte for loops
errornum:	ds	1	; error number
ds1820device:	ds	1	; which device number 0,1,...
ds1820crc:	ds	1	; DOW 8 bit CRC value
		
	RSEG bitvar
read_slot:	DBIT	1	; read bit from ds1820
bit_state:	DBIT	1	; delaying one bit state
matchROM_state:	DBIT	1	; sending MATCH ROM state
reset_state:	DBIT	1	; resetting the bus state
ds1820error:	DBIT	1	; error getting temperature

	
	RSEG ds1820rom		
rom_table:	; avalable devices on the 1-wire net

device0:	DB	10h, 088h, 3Dh, 0Ch, 00h, 00h, 00h, 0CAh
device1:	DB	10h, 05Bh, 49h, 09h, 00h, 00h, 00h, 0A4h	
device2:	DB	10h, 022h, 49h, 09h, 00h, 00h, 00h, 0AAh
device3:	DB	10h, 0DAh, 4Ah, 09h, 00h, 00h, 00h, 037h
device4:	DB	10h, 099h, 48h, 09h, 00h, 00h, 00h, 098h
device5:	DB	10h, 09Ah, 4Bh, 09h, 00h, 00h, 00h, 08Fh
device6:	DB	10h, 021h, 47h, 09h, 00h, 00h, 00h, 051h
device7:	DB	10h, 0EEh, 47h, 09h, 00h, 00h, 00h, 0EAh
device8:	DB	10h, 06Eh, 47h, 09h, 00h, 00h, 00h, 000h
device9:	DB	10h, 0D3h, 49h, 09h, 00h, 00h, 00h, 0EFh
device10:	DB	10h, 09Ah, 47h, 09h, 00h, 00h, 00h, 0AEh
device11:	DB	10h, 0B1h, 4Ah, 09h, 00h, 00h, 00h, 00Ch
device12:	DB	10h, 08Bh, 4Ah, 09h, 00h, 00h, 00h, 02Eh
device13:	DB	10h, 03Ch, 4Bh, 09h, 00h, 00h, 00h, 061h
device14:	DB	10h, 074h, 49h, 09h, 00h, 00h, 00h, 036h
device15:	DB	10h, 024h, 48h, 09h, 00h, 00h, 00h, 0D5h
device16:	DB	10h, 057h, 49h, 09h, 00h, 00h, 00h, 0D9h	
device17:	DB	10h, 050h, 04h, 0B0h,90h, 00h, 00h, 0DFh


END
А в приложении проект для 8051 для восьми датчиков

Прикрепленный файл: 2065817.zip
lsa вне форума  
Непрочитано 13.11.2007, 18:20  
stml
Частый гость
 
Регистрация: 06.06.2007
Сообщений: 42
Сказал спасибо: 1
Сказали Спасибо 9 раз(а) в 6 сообщении(ях)
stml на пути к лучшему
По умолчанию

Ну, блин, не ожидал. Спасибо большое. Думаю теперь побыстрее дело пойдет. Как чо получится - сообчу.
stml вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ЛБП для души и для работы bocem Источники питания и свет 154 11.02.2011 21:29
Виды подпрограмм kvark85 Микроконтроллеры, АЦП, память и т.д 3 02.12.2008 02:22
Вопрос по C для MCS51 aversI Микроконтроллеры, АЦП, память и т.д 7 09.06.2007 13:10


Часовой пояс GMT +4, время: 13:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot