ATmega16+DS18B20+4 Led

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
zezo.vn
Родился
Сообщения: 5
Зарегистрирован: Вт янв 25, 2011 03:23:05

ATmega16+DS18B20+4 Led

Сообщение zezo.vn »

Уважаемые коты!!!

Имеется следующее - датчик 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
Смотрите, где неправильно!!! пожалуйста :cry: :cry: :cry:
Реклама
Tom91
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт окт 08, 2010 15:43:55

Re: ATmega16+DS18B20+4 Led

Сообщение Tom91 »

По скольку сам мучаюсь с инициализацией, такой вопрос:
Если убрать:

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

sbi PORTC,0            ;DQ=1
   nop
то поидее 1 должна поступать через подтяжку резистора, когда порт установлен на вход, а вот вдувать чистую 1 мне кажется лишним... только повышается риск что-нить спалить, в случае если ведомое прижмёт её к земле...
Так что попробуйте убрать эти строчки из инициализации, а также в начале проинициализировать порт на вход, подредактировать управление через DDR и отписатьcя об результате..
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega16+DS18B20+4 Led

Сообщение ChipKiller »

Смотрите, где неправильно!!! пожалуйста
... уже приводил пример как можно выводить дробную часть температуры с помощью табличного преобразования - самый быстрый и простой способ.
zezo.vn
Родился
Сообщения: 5
Зарегистрирован: Вт янв 25, 2011 03:23:05

Re: ATmega16+DS18B20+4 Led

Сообщение zezo.vn »

то поидее 1 должна поступать через подтяжку резистора, когда порт установлен на вход, а вот вдувать чистую 1 мне кажется лишним... только повышается риск что-нить спалить, в случае если ведомое прижмёт её к земле...
Так что попробуйте убрать эти строчки из инициализации, а также в начале проинициализировать порт на вход, подредактировать управление через DDR и отписатьcя об результате..
Как это??? По другому я несмог написать!
.. уже приводил пример как можно выводить дробную часть температуры с помощью табличного преобразования - самый быстрый и простой способ.
Уточните,пожалуйста!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega16+DS18B20+4 Led

Сообщение ChipKiller »

zezo.vn писал(а):Уточните,пожалуйста!
уточняю:
1. Читаем это http://radiokot.ru/forum/viewtopic.php? ... 6&start=40
2. Ваш код

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

;коды чисел семисегментного индикатора
   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
можно изменить на следующий:

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

num_table: .db ch_0,ch_1 ... ch_9
.......
.......
ldi ZL,low(num_table<<1)
ldi ZH,high(num_table<<1); необязательно если таблица расположена в "начале" ldi ZH,0
add ZL,temp
lpm 
; в r0 код символа
3. для вывода дробной части создаем таблицу из 16-ти наборов

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

div_table: 
.db ch_0,ch_0,ch_0,ch_0 ; для кода 0000
.db ch_0,ch_6,ch_2,ch_5 ; для кода 0001
.db ch_1,ch_2,ch_5,ch_0
.......
.db ch_9,ch_3,ch_7,ch_5 ; для кода 1111
... дальше все аналогично
Реклама
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Re: ATmega16+DS18B20+4 Led

Сообщение AndyWorld »

Немного не в тему. Хочу спросить про задержки в вашем тексте, так как это для меня сейчас актуально.
480 мкс –Reset линии – понятно
70 мкс – ожидание ответа от датчика – тоже понятно
410 мкс – уже непонятно, почему не 480 мкс?
Какой размер задержки для ожидания преобразования?
Процедура transmit:
Четыре разные задержки 60 мкс, 10 мкс, 6 мкс, 64 мкс
В процедуре read тоже несколько непонятных задержек 6, 9, и 55 мкс. Ну, 6 мкс – это следует предполагать лог 1, а 9 тогда что? 55 мкс это – 0?
Почему такое разнообразие?
Реклама
zezo.vn
Родился
Сообщения: 5
Зарегистрирован: Вт янв 25, 2011 03:23:05

Re: ATmega16+DS18B20+4 Led

Сообщение zezo.vn »

:cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry:
Кто-небудь помоги мне переписать программу!
:cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry:
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega16+DS18B20+4 Led

Сообщение ChipKiller »

zezo.vn писал(а):Кто-небудь помоги мне переписать программу!
Если Вы сами написали, то что приведено выше и все это работает, то непонятно в чем проблема?
ИМХО переписывать программу нет необходимости, как и что можно добавить я уже описал. Если какой-то конкретный вопрос не ясен - постараюсь помочь.
zezo.vn
Родился
Сообщения: 5
Зарегистрирован: Вт янв 25, 2011 03:23:05

Re: ATmega16+DS18B20+4 Led

Сообщение zezo.vn »

Она работает, но показается только целые числа...............
Выходные лежают в "t" но когда я читаю этот код, только целые числа показались!!!!!
add t,byte ;преобразование результата в один байт
;---------------------------------------------
Поэтому я незнаю, где неправильно! :cry: :cry: :cry:
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega16+DS18B20+4 Led

Сообщение ChipKiller »

zezo.vn писал(а):Она работает, но показается только целые числа...............
Выходные лежают в "t" но когда я читаю этот код, только целые числа показались!!!!!
... так по-другому и быть не может - считанное значение содержится в 12-ти битах, а в байте 8 бит :)
Ваш код

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

   rcall read         ;чтение первого байта
   mov t,byte  

;  в первом байте SSSS S D6 D5 D4, где S - биты знака
   rcall read         ;чтение второго байта	
;   во втором байте D3 D2 D1 D0 X3 X2 X1 X0
как можно сделать

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

   rcall read         ;чтение первого байта
   mov t2,byte     ; здесь младшая и дробная часть температуры
   rcall read         ;чтение второго байта
   mov   t,byte     ; здесь старшая часть температуры и знак
   andi  t2,0x0F     ; в t2 - дробная часть температуры (при условии, что преобраование 12-бит)
; в t2 - сохраняем дробную часть для дальнейшей обработки
   lsr 	 byte          ; сдвигаем D3 D2 D1 D0 на свое место ( биты D7..4 >> D3..0 )
   lsr 	 byte
   lsr 	 byte
   lsr 	 byte
   lsl   t                ; сдвигаем S D6 D5 D4 на свое место ( биты D3..0 >> D7..4 )
   lsl   t
   lsl   t
   lsl   t
; соединяем тетрады в один байт
   or	 t,byte    ; в t - S D6 D5 D4 D3 D2 D1 D0 (целая часть и знак)
;если S=1 - температура отрицательна и нужно корректировать X3 X2 X1 X0 - читать datasheet
... и все . Как можно отобразить дробную часть - пример уже приводил.

(28.01.2011) ... похоже случай тяжелый - поэтому налепил везде комментариев...
Последний раз редактировалось ChipKiller Пт янв 28, 2011 12:10:08, всего редактировалось 1 раз.
zezo.vn
Родился
Сообщения: 5
Зарегистрирован: Вт янв 25, 2011 03:23:05

Re: ATmega16+DS18B20+4 Led

Сообщение zezo.vn »

Значит так???:

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

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			;чтение второго байта	
        mov   t2,byte
        andi  t2,0x0F     ; в t2 - дробная часть температуры (при условии, что преобраование 12-бит)

   lsr     byte
   lsr     byte
   lsr     byte
   lsr     byte
   lsl   t 
   lsl   t
   lsl   t
   lsl   t
   or    t,byte    ; в t - S D6 D5 D4 D3 D2 D1 D0 (целая часть и знак)		
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega16+DS18B20+4 Led

Сообщение ChipKiller »

zezo.vn писал(а):Значит так???:
... нет - посмотрите приведенный пример еще раз!

28.01.2011
Выходные лежают в "t" но когда я читаю этот код, только целые числа показались!!!!!
Вопрос? С какого ... там что-то может показаться что-то другое, если Вы "убиваете" дробную часть 4-мя сдвигами (т.е. затирая нулями) ???

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

 rcall read         ;чтение первого байта
   mov t,byte   
   lsr t
   lsr t
   lsr t
   lsr t            ;откидываем 4 младших разряда
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»