DHT-11 + atmega16+assembler

Обсуждаем цифровые устройства...
Ответить
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вт апр 09, 2013 20:43:04

Сообщение triest »

Нужно написать программку, для работы DHT11 на assemblere.
Статью читал http://radiokot.ru/articles/13/, + основывался на данной заметке
http://avrproject.ru/publ/kak_podkljuch ... r/2-1-0-72

К сожалению не работает.
Датчик на выводе А0.
Расчет задержек через AvrDelayLoop.
Как это отлаживать тоже неясно :(
Спойлер

Код: Выделить всё

.include "m16def.inc"

.def count=r19
.def temperat=r18;
.def temp=r23;
.def tempdrob=r24
.def vlag=R16;
.def vlagdrob=r17;


main:
out PORTB,R
sbi PORTA,0;
ldi count,0;
sbi DDRA,0;нулевой вывод порта А на выход
cbi PORTA,0;прижимаем вывод к землеж
;ждем 25милисекунд

; =========== 
;    delay loop generator 
;     115200 cycles:
; ----------------------------- 
; delaying 115182 cycles:
          ldi  R20, $9E
WGLOOP0:  ldi  R21, $F2
WGLOOP1:  dec  R21
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; ----------------------------- 
; delaying 18 cycles:
          ldi  R20, $06
WGLOOP2:  dec  R20
          brne WGLOOP2
;
sbi porta,0;отпускаем шину
cbi DDRA,0;на вход

;ждем 40мс

; =========== 
;    delay loop generator 
;     184320 cycles:
; ----------------------------- 
; delaying 183768 cycles:
          ldi  R20, $F7
WGLOOP0:  ldi  R21, $F7
WGLOOP1:  dec  R21
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; ----------------------------- 
; delaying 552 cycles:
          ldi  R20, $B8
WGLOOP2:  dec  R20
          brne WGLOOP2
; =========== 

sbic PIND,0x00 ;если на выходе досих пор 0, то
jmp ERROR;ошибка :(


;Если на шине 0,то ждем 80мс

; =========== 
;    delay loop generator 
;     368640 cycles:
; ----------------------------- 
; delaying 368586 cycles:
          ldi  R20, $03
WGLOOP0:  ldi  R21, $BB
WGLOOP1:  ldi  R22, $DA
WGLOOP2:  dec  R22
          brne WGLOOP2
          dec  R21
          brne WGLOOP1
          dec  R20
          brne WGLOOP0
; ----------------------------- 
; delaying 54 cycles:
          ldi  R20, $12
WGLOOP3:  dec  R20
          brne WGLOOP3
; =========== 

sbic pind,0x00; если на выходе досихпор 0
jmp ERROR;ошибка :(

;иначе начинаем получать данные
clr count;очищаем шетчик

cikle:
sbic pind,0x00; ждем пока на выходе появиться 1
jmp cikle;

;начинаем принимать биты

sbis pind,0x00;ждем появления 0 

;ждем 30 мс

; =========== 
;    delay loop generator 
;     138240 cycles:
; ----------------------------- 
; delaying 138195 cycles:
          ldi  R20, $B9
WGLOOP3:  ldi  R21, $F8
WGLOOP4:  dec  R21
          brne WGLOOP4
          dec  R20
          brne WGLOOP3
; ----------------------------- 
; delaying 45 cycles:
          ldi  R20, $0F
WGLOOP3:  dec  R20
          brne WGLOOP3
; =========== 

sbis pind,0x00; если на шине до сих пор 1
inc temp;
add temperature,temp;
lsr temperature;
;в temperature целая часть температуры 
inc count;инкрементируем счетчик
cpi count,8;
BRNE cikle;


clr count
cikle2:
sbic pind,0x00; ждем пока на выходе появиться 1
jmp cikle2;

;начинаемпринимать биты

sbis pind,0x00;ждем появления 0 

;ждем 30 мс

; =========== 
;    delay loop generator 
;     138240 cycles:
; ----------------------------- 
; delaying 138195 cycles:
          ldi  R20, $B9
WGLOOP5:  ldi  R21, $F8
WGLOOP6:  dec  R21
          brne WGLOOP6
          dec  R20
          brne WGLOOP5
; ----------------------------- 
; delaying 45 cycles:
          ldi  R20, $0F
WGLOOP7:  dec  R20
          brne WGLOOP7
; =========== 

sbis pind,0x00; если на шине досихпор 1
inc temp;
add tempdrob,temp;
lsr tempdrob;
;в tempdrob дробная часть температуры 
inc count;инкрементируем счетчик
cpi count,8;
BRNE cikle2;


clr count
cikle3:
sbic pind,0x00; ждем пока на выходе появиться 1
jmp cikle3;

;начинаем принимать биты

sbis pind,0x00;ждем появления 0 

;ждем 30 мс

; =========== 
;    delay loop generator 
;     138240 cycles:
; ----------------------------- 
; delaying 138195 cycles:
          ldi  R20, $B9
WGLOOP8:  ldi  R21, $F8
WGLOOP9:  dec  R21
          brne WGLOOP9
          dec  R20
          brne WGLOOP8
; ----------------------------- 
; delaying 45 cycles:
          ldi  R20, $0F
WGLOOP10:  dec  R20
          brne WGLOOP10
; =========== 

sbis pind,0x00; если на шине досихпор 1
inc temp;
add tempdrob,temp;
lsr tempdrob;
;в tempdrob дробная часть температуры 
inc count;инкрементируем счетчик
cpi count,8;
BRNE cikle3;


clr count
cikle4:
sbic pind,0x00; ждем пока на выходе появиться 1
jmp cikle4;

;начинае принимать биты

sbis pind,0x00;ждем появления 0 

;ждем 30 мс

; =========== 
;    delay loop generator 
;     138240 cycles:
; ----------------------------- 
; delaying 138195 cycles:
          ldi  R20, $B9
WGLOOP11:  ldi  R21, $F8
WGLOOP12:  dec  R21
          brne WGLOOP12
          dec  R20
          brne WGLOOP11
; ----------------------------- 
; delaying 45 cycles:
          ldi  R20, $0F
WGLOOP13:  dec  R20
          brne WGLOOP11
; =========== 

sbis pind,0x00; если на шине досихпор 1
inc temp;
add vlag,temp;
lsr vlag;
;в  vlag целая часть влажности
inc count;инкрементируем счетчик
cpi count,8;
BRNE cikle4;


clr count
cikle5:
sbic pind,0x00; ждем пока на выходе появиться 1
jmp cikle5;

;наяинае принимат биты

sbis pind,0x00;ждем появления 0 

;ждем 30 мс

; =========== 
;    delay loop generator 
;     138240 cycles:
; ----------------------------- 
; delaying 138195 cycles:
          ldi  R20, $B9
WGLOOP14:  ldi  R21, $F8
WGLOOP15:  dec  R21
          brne WGLOOP15
          dec  R20
          brne WGLOOP14
; ----------------------------- 
; delaying 45 cycles:
          ldi  R20, $0F
WGLOOP16:  dec  R20
          brne WGLOOP14
; =========== 

sbis pind,0x00; если на шине до сих пор 1
inc temp;
add vlagdrob,temp;
lsr vlagdrob;
;в  vlag целая часть влажности
inc count;инкрементируем счетчик
cpi count,8;
BRNE cikle5;

jmp main;


ERROR
ldi R16,0b10101010
out portb,R16;
jmp ERROR
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15645
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А с чего Вы решили, что далласовский алгоритм подойдет?
Интерфейс однопроводный но не стандарта uLAN.
Да и данных в документации "не очень"...
Для точных интервалов у АВР требуется задействовать аппаратный таймер/счетчик...
:roll:
Реклама
Ответить

Вернуться в «Цифровая техника»