Имеется следующее - датчик DS18B20 , ATmega16 и 4 индикатора
Я написал программу, но показается только 2 целых цифр....например: температура = 25,21 -----> на индикатор только 25
Ещё, я исспользовал дешифратор двоично-десятичного КР514ИД2
Вот моя программа
Код: Выделить всё
;тактовая частота: 8 МГц
.device atmega16
.include "m16def.inc"
;объявления
.def temp=r16 ;регистр хранения значения температуры в 2ичн. форме
.def mL=r17 ;регистр хранения десятичного числа
.def mH=r18
.def byte=r19 ;регистр для приёма и передачи байта
.def bits=r20 ;счётчик количества переданных битов
.def t=r21 ;величина задержки
.def cl=r22
.def ch=r23
;---------------------------------------------
;инициализация
ldi temp,0b00011000 ;отключаем сторожевой таймер
out wdtcr,temp
ldi temp,0b00010000
out wdtcr,temp
ser temp
out DDRA,temp ;порт настроен на выход
out DDRB,temp ;порт настроен на выход
out DDRD,temp ;порт настроен на выход
ldi temp,0b00000001
out PORTC,temp ;clk=1
;организация стека
ldi temp,LOW (RAMEND)
out SPL,temp
ldi temp,HIGH (RAMEND)
out SPH,temp
;коды чисел семисегментного индикатора
ldi temp,0b11000000 ;"0"
mov r0,temp
ldi temp,0b11111001 ;"1"
mov r1,temp
ldi temp,0b10100100 ;"2"
mov r2,temp
ldi temp,0b10110000 ;"3"
mov r3,temp
ldi temp,0b10011001 ;"4"
mov r4,temp
ldi temp,0b10010010 ;"5"
mov r5,temp
ldi temp,0b10000010 ;"6"
mov r6,temp
ldi temp,0b11111000 ;"7"
mov r7,temp
ldi temp,0b10000000 ;"8"
mov r8,temp
ldi temp,0b10010000 ;"9"
mov r9,temp
ldi temp,0b10111111 ;"-"
mov r10,temp
clt ;сброс флага T
;---------------------------------------------
;инициализация ds1820
init_ds1820:
cli ;запрет прерываний
cbi PORTC,0 ;DQ=0
ldi cl,160
rcall delay ;задержка 480 мкс
sbi PORTC,0 ;DQ=1
nop
cbi DDRC,0 ;PD0 настраивается на вход
ldi cl,23
rcall delay ;задержка 70 мкс
in temp,PINC ;чтение сигнала от термометра
sbi DDRC,0
ldi cl,137
rcall delay ;задержка 410 мкс
ror temp
brcs init_ds1820 ;переход если отклика не было
brts read_temp ;переход, если флаг Т установлен (преобразование выполнено)
;---------------------------------------------
;преобразование
ldi byte,0xCC ;команда skip ROM
rcall transmit
ldi byte,0x44 ;команда запуска преобразования
rcall transmit
converting: ;ожидание конца преобразования
ldi cl,250
rcall delay ;задержка
rcall read
tst byte
breq converting ;переход если преобразование не завершено
set ;T=1
rjmp init_ds1820
;---------------------------------------------
read_temp: ;чтение температуры
ldi byte,0xCC ;команда skip ROM
rcall transmit
ldi byte,0xBE ;команда Read Scratchpad
rcall transmit
ldi cl,5
rcall delay ;задержка
rcall read ;чтение первого байта
mov t,byte
lsr t
lsr t
lsr t
lsr t ;откидываем 4 младших разряда
rcall read ;чтение второго байта
;сброс
cbi PORTC,0 ;DQ=0
ldi cl,160
rcall delay ;задержка 480 мкс
sbi PORTC,0 ;DQ=1
ldi cl,23
rcall delay ;задержка 70 мкс
sbrc byte,4
rjmp neg_temp ;переход если результат отрицателен
andi byte,0b00001111
swap byte
add t,byte ;преобразование результата в один байт
;---------------------------------------------
clr mH
clr mL
;Преобразование в двоично-десятичный код
FindTens: ;находим количество десятков
subi t,10
brcs FindOnes
inc mL
rjmp FindTens
FindOnes: ;находим количество единиц
subi t,-10
mov mH,t
;---------------------------------------------
;m1: ;вывод результата на семисегментные индикаторы
; clr ZH
; mov ZL,mL
; ld temp,Z
; out PORTA,temp
; mov ZL,mH
; ld temp,Z
; out PORTD,temp
; clt ;Т=0
; rjmp init_ds1820
m1: ;????? ?????????? ?? ?????????????? ??????????
clr ZH
clr ZL
swap mL
or mL, mH
; or mL,mH
; swap mL
mov ZL,mH
ld temp,Z
swap mH
out PORTD,mL
swap mH
out PORTA,mH
clt
rjmp init_ds1820
;---------------------------------------------
neg_temp:
andi byte,0b00001111 ;преобразование результата в один байт
swap byte
add t,byte
neg t ;вычисление дополнительного кода результата
ldi mH,0x0A ;для отображения "-" в старшем разряде
rjmp m1-1
;---------------------------------------------
transmit:
ldi temp,8
ror byte
brcs bit1
cbi PORTC,0 ;DQ=0
ldi cl,20
rcall delay ;задержка 60 мкс
sbi PORTC,0 ;DQ=1
ldi cl,9
rcall delay ;задержка 10 мкс
dec temp
brne transmit+1
ret
bit1:
cbi PORTC,0 ;DQ=0
ldi cl,2
rcall delay ;задержка 6 мкс
sbi PORTC,0 ;DQ=1
ldi cl,21
rcall delay ;задержка 64 мкс
dec temp
brne transmit+1
ret
;-----------------------------------------
read:
ldi temp,8
cbi PORTC,0 ;DQ=0
ldi cl,2
rcall delay ;задержка 6 мкс
sbi PORTC,0 ;DQ=1
ldi cl,3
rcall delay ;задержка 9 мкс
cbi DDRC,0
ori r19,0b00000001 ;установка младшего бита
nop
nop
in r24,PINC
andi r24,0b00000001 ;проверка нулевого бита
brne m2 ;переход если нулевой бит равен 1
andi r19,0b11111110 ;сброс нулевого бита
m2: ror byte
sbi DDRC,0
ldi cl,18
rcall delay ;задержка 55 мкс
dec temp
brne read+1
ror byte
ret
;---------------------------------------------
delay:
ldi ch,7
dec ch
brne delay+1
dec cl
brne delay
ret

