Общение с DHT22 на асме
t
timsa™
Хочу спросить, прежде чем изобратеть велосипед. Ни у кого нет примера общения с DHT22 на ассемблере (atmel)? Или хотя бы вменяемого даташита?
Сишные исходники кривые чуть более чем полностью, даже тайминги не совпадают. И все как один жалуются на кривость. Не хотелось бы чужую кривизну переписывать.
Гугл что-то молчит.
Сишные исходники кривые чуть более чем полностью, даже тайминги не совпадают. И все как один жалуются на кривость. Не хотелось бы чужую кривизну переписывать.
Гугл что-то молчит.
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вайр протокола
проц дал импульс и ловит кучу обратно
вроде написано всё и нарисовано
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вайр протокола
проц дал импульс и ловит кучу обратно
вроде написано всё и нарисовано
М
Мoзгoпрaв и мoзгoвeд©
посмотрю
единствено формат данных подробно не расписан
нуно методом тыка посмотреть
упд:
да собссно расписан вроде понятно
влажность байт до запятой, байт после, температура байт до запятой, байт после, байт контрольной суммы
байт кс = младший байт суммы 4 предыдущих
чотам блин писать то?
[Сообщение изменено пользователем 10.12.2013 19:29]
нуно методом тыка посмотреть
упд:
да собссно расписан вроде понятно
влажность байт до запятой, байт после, температура байт до запятой, байт после, байт контрольной суммы
байт кс = младший байт суммы 4 предыдущих
чотам блин писать то?
[Сообщение изменено пользователем 10.12.2013 19:29]
М
Мoзгoпрaв и мoзгoвeд©
посмотрю
неа
проц даёт 1мс 0, 40мкс 1 - это старт
дхт потверждает что оно есть 80мкс 0, 80мкс 1
потом хреначит данные
50мкс 0, 26мкс 1 - бит = 0
50мкс 0, 70мкс 1 - бит = 1
дхт потверждает что оно есть 80мкс 0, 80мкс 1
потом хреначит данные
50мкс 0, 26мкс 1 - бит = 0
50мкс 0, 70мкс 1 - бит = 1
t
timsa™
дхт потверждает что оно есть 80мкс 0, 80мкс 1
потом хреначит данные
50мкс 0, 26мкс 1 - бит = 0
50мкс 0, 70мкс 1 - бит = 1
вот за это спасибо. во всех найденных исходниках абсолютно разные задержки, а мануал я читал, меня укачало.
но всё же я надеялся на готовое
мануал я читал, меня укачало.
эт мну как то почитал мануал на тда7540 - вот там укачивает
а тут то примитивизм, полчаса максимум на всё ПО
таймер вбил чтоб не повиснуть
установил щёчек приёма на 41
дал старт
задвинул по щёчеку в 5 регистров последовательно ( ну или по таймауту выпал если чото не так )
проверил кс
усё
t
timsa™
установил щёчек приёма на 41
так тамо же длительность разная. как по щёчеку то?
тамо же длительность разная. как по щёчеку то?
ну понятно что
все как один жалуются на кривость.
41 - это блин количество задвигаемых бит, включая нахрен ненужный презент-импульс
к значениям этих бит этот щёчег не относицо
значение бита вычисляецо по другому
t
timsa™
вот нельзя было по обычному 1-вайру сделать, опять какой-то говноедский протокол
порт=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]
паузе 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]
вот нельзя было по обычному 1-вайру сделать, опять какой-то говноедский протокол
на 1 вире вы ещё дольше будете дрова писать с такими познаниями
и собссно от 1-вайра оно суть и не отличаецо
чисто косметически
видимо готовых библиотек просто нет
а протокол примитивный
просто лень интернет-юзеров беспредельна
они готовы часами качать и править чужой код, хотя свой с нуля пишецо за 20 минут
идьоты
чисто косметически
видимо готовых библиотек просто нет
а протокол примитивный
просто лень интернет-юзеров беспредельна
они готовы часами качать и править чужой код, хотя свой с нуля пишецо за 20 минут
идьоты
там совсем для фэншуя надо таймер фкорячеть предельного времени ожидания
проще всего в пп вайт1мкс
и около метки1 при ожидании порта её тоже вызывать чтоб там не фстрять
проще всего в пп вайт1мкс
и около метки1 при ожидании порта её тоже вызывать чтоб там не фстрять
t
timsa™
паузе 1мкс
на моём камне это 8 тактов кагбэ
а ещё недайбох мама позовет из порта пирог доставать...
так что вы зря говорите 20 минут. я вот щас точные тайминги по тактам только полчаса отсчитывал.
и от вашего наброска до работающего кода может и день и два пройти.
поэтому иногда лучше погуглить час, чем потом эбстись неделю.
на 1 вире вы ещё дольше будете дрова писать с такими познаниями
ф железе есть. ничо не надо писать.
t
timsa™
в любом случае спасибо за помощь, щас доковыряю выложу на суд общеснсти
t
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 |
t
timsa™
завтра проверю, кажется в конце накосячил
со сдвигами несовсем понятно
вродь нуно сдвигать 5 регистров сразу
не увидел таково куска
вродь нуно сдвигать 5 регистров сразу
не увидел таково куска
Авторизуйтесь, чтобы принять участие в дискуссии.