Общение с DHT22 на асме

Хочу спросить, прежде чем изобратеть велосипед. Ни у кого нет примера общения с DHT22 на ассемблере (atmel)? Или хотя бы вменяемого даташита?
Сишные исходники кривые чуть более чем полностью, даже тайминги не совпадают. И все как один жалуются на кривость. Не хотелось бы чужую кривизну переписывать.
Гугл что-то молчит.
0
https://www.sparkfun.com/datasheets/Sensors/Temper...
DHT22 send out higher data bit firstly!
DATA=8 bit integral RH data+8 bit decimal RH data+8 bit integral T data+8 bit decimal T data+8 bit check-sum
If the data transmission is right, check-sum should be the last 8 bit of "8 bit integral RH data+8 bit decimal RH
data+8 bit integral T data+8 bit decimal T data".
чото типа 1вайр протокола
проц дал импульс и ловит кучу обратно
вроде написано всё и нарисовано
0
Мoзгoпрaв и мoзгoвeд©
посмотрю
0
да, номано всё в даташыте, задача наипримитивнейшая
0
единствено формат данных подробно не расписан
нуно методом тыка посмотреть
упд:
да собссно расписан вроде понятно
влажность байт до запятой, байт после, температура байт до запятой, байт после, байт контрольной суммы
байт кс = младший байт суммы 4 предыдущих
чотам блин писать то?

[Сообщение изменено пользователем 10.12.2013 19:29]
0
Мoзгoпрaв и мoзгoвeд©
От пользователя Мoзгoпрaв и мoзгoвeд©
посмотрю

неа
0
проц даёт 1мс 0, 40мкс 1 - это старт
дхт потверждает что оно есть 80мкс 0, 80мкс 1
потом хреначит данные
50мкс 0, 26мкс 1 - бит = 0
50мкс 0, 70мкс 1 - бит = 1
0
период опроса 1 раз в 2сек или реже
0
timsa™
От пользователя ddd[гость]
проц даёт 1мс 0, 40мкс 1 - это старт
дхт потверждает что оно есть 80мкс 0, 80мкс 1
потом хреначит данные
50мкс 0, 26мкс 1 - бит = 0
50мкс 0, 70мкс 1 - бит = 1


вот за это спасибо. во всех найденных исходниках абсолютно разные задержки, а мануал я читал, меня укачало.

но всё же я надеялся на готовое :beach:
0
От пользователя timsa™
мануал я читал, меня укачало.

эт мну как то почитал мануал на тда7540 - вот там укачивает :-D
а тут то примитивизм, полчаса максимум на всё ПО
таймер вбил чтоб не повиснуть
установил щёчек приёма на 41
дал старт
задвинул по щёчеку в 5 регистров последовательно ( ну или по таймауту выпал если чото не так )
проверил кс
усё
0
От пользователя timsa™
надеялся на готовое

если на мцс51, могу скидать фпринцыпе
0
timsa™
От пользователя ddd[гость]
установил щёчек приёма на 41


так тамо же длительность разная. как по щёчеку то?
0
От пользователя timsa™
тамо же длительность разная. как по щёчеку то?

ну понятно что
От пользователя timsa™
все как один жалуются на кривость.

:-D
41 - это блин количество задвигаемых бит, включая нахрен ненужный презент-импульс
к значениям этих бит этот щёчег не относицо
значение бита вычисляецо по другому
0
timsa™
вот нельзя было по обычному 1-вайру сделать, опять какой-то говноедский протокол
0
порт=0
паузе 1000мкс
порт=1
щёт1=41
вайт порт=0

метко1

вайт порт=1
щёт2=0

метко2

инч щёт2
паузе 1мкс
иф порт=1 гото метко2
адд щёч2 206
рлц эр1
рлц эр2
рлц эр3
рлц эр4
рлц эр5
дек щёч1
иф щёч1=0 гото енд
гото метко1

енд

влаж эр5,эр4
темп эр3,эр2
кс эр1

[Сообщение изменено пользователем 10.12.2013 21:53]
0
От пользователя timsa™
вот нельзя было по обычному 1-вайру сделать, опять какой-то говноедский протокол

на 1 вире вы ещё дольше будете дрова писать с такими познаниями :-D
0
и собссно от 1-вайра оно суть и не отличаецо
чисто косметически
видимо готовых библиотек просто нет
а протокол примитивный
просто лень интернет-юзеров беспредельна :-D
они готовы часами качать и править чужой код, хотя свой с нуля пишецо за 20 минут
идьоты
0
там совсем для фэншуя надо таймер фкорячеть предельного времени ожидания
проще всего в пп вайт1мкс
и около метки1 при ожидании порта её тоже вызывать чтоб там не фстрять
0
timsa™
От пользователя ddd[гость]
паузе 1мкс


на моём камне это 8 тактов кагбэ

а ещё недайбох мама позовет из порта пирог доставать...

так что вы зря говорите 20 минут. я вот щас точные тайминги по тактам только полчаса отсчитывал.
и от вашего наброска до работающего кода может и день и два пройти.
поэтому иногда лучше погуглить час, чем потом эбстись неделю.

От пользователя ddd[гость]
на 1 вире вы ещё дольше будете дрова писать с такими познаниями


ф железе есть. ничо не надо писать.
0
От пользователя timsa™
от вашего наброска до работающего кода может и день и два пройти.

ну нихатите как хатите :beach:
0
timsa™
в любом случае спасибо за помощь, щас доковыряю выложу на суд общеснсти
0
timsa™
Исходник:
		SETB	DDRD, 2, R16			; переключаем ногу на выход
		CLRB	PORTD, 2, R16			; подаем "0"
		LDI		R16, 0x40
		LDI		R17, 0x06
		LDI		R18, 0x00
		RCALL	Delay					; ждем 1мс (0x1F40)
		SETB	PORTD, 2, R16			; подаем "1"
		LDI		R16, 0x40
		LDI		R17, 0x00
		LDI		R18, 0x00
		RCALL	Delay					; ждем 40мкс (0x0140)
		CLRB	DDRD, 2, R16			; переключаем ногу на вход
		SETB	PORTD, 2, R16			; внутренняя подтяжка к питанию
		
		// в течение 80мкс должен быть 0
		LDI		R18, 115				; 115 циклов = 690 тактов = 86мкс и улетаем по таймауту
rd22loop1:
		NOP
		DEC		R18
		BREQ	rd22timeisout
		SBIS	PIND, 2					; крутим пока 0
		RJMP	rd22loop1
		// Если R18 меньше 15 (т.е. 75мкс) то это по идее странно, можно обработать, но лень

		// в течение 80мкс должен быть 1
		LDI		R18, 115				; 115 циклов = 690 тактов = 86мкс и улетаем по таймауту
rd22loop2:
		NOP
		DEC		R18
		BREQ	rd22timeisout
		SBIC	PIND, 2					; крутим пока 1
		RJMP	rd22loop2
		// Если R18 меньше 15 (т.е. 75мкс) то это по идее тоже странно

		RJMP	rd22getdata

rd22timeisout:							; не дождались :( всё пропало
		LDI		R16, 0xff
		STS		RAWDATA, R16
		STS		RAWDATA+1, R16
		STS		RAWDATA+2, R16
		STS		RAWDATA+3, R16
		STS		RAWDATA+4, R16
		RET

		// теперь 40 бит данных
		LDI		R19, 40					; всего бит
		CLR		R16						; заполняемый байт
		LDI		R17, 8					; бит в байте
rd22getdata:
		// в течение 50мкс должен быть 0
		LDI		R18, 67					;  67 циклов = 400 тактов = 50мкс и улетаем по таймауту
rd22loop3:
		NOP
		DEC		R18
		BREQ	rd22timeisout
		SBIS	PIND, 2					; крутим пока 0
		RJMP	rd22loop3

		LDI		R18, 100				; 100 циклов = 600 тактов = 75мкс и улетаем по таймауту
rd22loop4:
		NOP
		DEC		R18
		BREQ	rd22timeisout
		SBIC	PIND, 2					; крутим пока 1
		RJMP	rd22loop4

		// а теперь смотрим сколько осталось: R18<40 это 0 иначе 1
		CPI		R18, 40
		BRLO	rd22getzero
		RJMP	rd22getone

rd22getzero:
		LSL		R16						; запихиваем 0 в младший и сдвигаем влево
		RJMP	rd22bit

rd22getone:
		SEC								; устанавливаем Carry
		ROL		R16						; запихиваем его в младший и сдвигаем влево
		RJMP	rd22bit

rd22bit:
		DEC		R17
		BREQ	rd22byte

rd22nextbyte:		
		DEC		R19
		BREQ	rd22thatsall

		RJMP	rd22getdata

rd22byte:
		LDI		R17, 8					; восстанавливаем счетчик битов

		LDI		ZL,Low(RAWDATA)			; область памяти для данных
		LDI		ZH,High(RAWDATA)
		ST		Z+, R16					; записывваем

		RJMP	rd22nextbyte

rd22thatsall:
		RET
0
timsa™
завтра проверю, кажется в конце накосячил
0
этот асм мну незнаком
0
со сдвигами несовсем понятно
вродь нуно сдвигать 5 регистров сразу
не увидел таково куска
0
Авторизуйтесь, чтобы принять участие в дискуссии.