реклама на сайте
подробности

 
 
> Реализация 1-Wire на ассемблере
zelvans
сообщение Apr 30 2010, 03:19
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 29-04-10
Пользователь №: 56 980



Предлагаю свой вариант реализации опроса DS18s20 с помощью Atmega8.
Сделано на ассемблере в AVR Studio. Кварц 14.745 . Для синхронизации
1-Wire использую Timer2, если использовать другой кварц используемые
значения надо пересчитывать. задействованы две ножки PIND,3 (кнопка)
и PINC,4(шина 1-Wire). PINC,4 подтянута к питанию резистором 5к1 и
подключена к DS18s20. Если PIND,3 занулить и подать питание на схему,
то в EEPROM начиная с адрес 0x0000 можно увидеть адрес DS18s20
(7 байтов) плюс байт CRC. Записав эти 8 байтов в адрес 0x0010,
подав логическую 1 на PIND,3, после в EEPROM начиная с адреса
0x0070 можно увидеть содержимое Scratchpad-а (8 байтов+1 байт CRC
и ASCII десятки и единицы температуры)
Есть некоторая диагностика: в ячейке памяти ONE_WIRE_STAT
код завершения операции на шине 1Wire успешно 0xf0
0xe1 - превышено время ожидания импульса присутствия
0xe2 - импульс присутствия пришел слишком рано
0xe3 - импульс присутствия длиннее требуемого
0xe4 - импульс присутствия короче требуемого
0xe5 - при чтении нуля слишком долго удерживалась в нуле шина
0xe6 - не совпала CRC
На столе работают 4 датчика их адреса в EEPROM
0x0010, 0x0020, 0x0030, 0x0040 ,буду измерять температуру в 4
точках помещения. Знак температуры не анализирую. Есть косяк,
при включении выдается 85, так как у меня такого быть не может,
то значение 85(десятичное) игнорируется.

Прикрепленный файл  JQ015_1wire_Termometr.rar ( 25.72 килобайт ) Кол-во скачиваний: 229
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ILYAUL
сообщение Apr 30 2010, 05:27
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(zelvans @ Apr 30 2010, 07:19) *
Есть косяк,
при включении выдается 85, так как у меня такого быть не может,
то значение 85(десятичное) игнорируется.

Для DS18B20 - это значение default , о чём сообщено в DS

И так-то зачем? У Вас в прерывании разве меняются все регистры процессора?

Код
timer1:
push r0
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
push r16
push r17
push r18
push r19
push r20
push r21
push r22
push r23
push r24
push r25
push r26
push r27
push r28
push r29
push r30
push r31
in r16,$3f
push r16
R2X PAUSE1,r24,r25  
.........................................................
out $3f,r16
pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
pop r25
pop r24
pop r23
pop r22
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
pop r0
reti


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 07:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.11112 секунд с 7
ELECTRONIX ©2004-2016