Уже около месяца пытаюсь разобраться с Wire1. Перечитал все статьи, которые только можно было. Но это мне не особо помогло. Пытаюсь начать работать с датчиком температуры DS18B20 (100%!). Пишу на ассемблере. Пока что удается лишь узнать, есть ли на шине устройство или нет, а дальше все плохо. Попытался узнать код устройства. Посылаю 0x33. а в ответ все 8 байт 0b11111111. Пишу под Atmega16. Пока что на всем порту лишь одна шина, так что манипулирую всем портом сразу. Atmega16 тактируется от встроенного кварца на 8 мгц. Заливаю с помощью Jtag ICE (Иногда опознается как Jtag ICE Mkii, когда как...). Заливаю, ставлю паузу по окончанию приему последнего байта и перехода в бесконечный цикл. И там уже смотрю все регистры.
Код разбит на функции.
Инициализация.
Код: Выделить всё
.include "m16def.inc"
.def Temp = R16
.def Temp1= R17
.def Temp2= R18
.def Temp3= R19
.def MAX = R29
ser MAX
.equ Wire = PB0 ;Пин в порту Wire1.
.equ DDWIR= DDRB ;Порт входа Wire.
.equ PINWI= PINB ;Порт входа.
out DDRD, MAX
;Стек.-----------------------------------------------------------------------------------------
ldi Temp, Low(RAMEND)
out SPL, Temp
ldi Temp, High(RAMEND)
out SPH, Temp
Код: Выделить всё
Delay:push Temp
DDL: dec Temp
cpi Temp, 0
brne DDL
dec Temp1
pop Temp
cpi Temp1, 0
brne Delay
ret
Код: Выделить всё
;Рестарт и поиск элемента на шине.------------------------------------------
Wres: ldi Temp, 1<<Wire ;Пин на выход.
out DDWIR, Temp ;Автоматически будет 0 на линии.
ldi Temp, 239 ;500 мкс ждем (482).
ldi Temp1, 4
rcall Delay
ldi Temp, ~(1<<Wire) ;На вход.
out DDWIR, Temp
ldi Temp, 145 ;Ждем 74 мкс.
ldi Temp1, 1
rcall Delay
in Temp, PINWI ;Смотрим есть ли что на шине.
sbrs Temp, 0 ;Если что-то есть - дальше.
rjmp main
rjmp Wres ;Иначе выход.
Код: Выделить всё
;Передаем 1.----------------------------------------------------------------
Wr1: ldi Temp, 1<<Wire ;Пин на выход.
out DDWIR, Temp ;Автоматически будет 0 на линии.
ldi Temp, 25 ;Ждем 15 мкс.
ldi Temp1, 1
rcall Delay
clr Temp ;Переводим во вход.
out DDWIR, Temp
ldi Temp, 145 ;Ждем 74 мкс.
ldi Temp1, 1
rcall Delay
ret
Код: Выделить всё
;Передаем 0.----------------------------------------------------------------
Wr0: ldi Temp, 1<<Wire
out DDWIR, Temp .
ldi Temp, 220 ;Ждем 112 мкс.
ldi Temp1, 1
rcall Delay
clr Temp
out DDWIR, Temp
ldi Temp, 145
ldi Temp1, 1
rcall Delay
ret
Код: Выделить всё
;Принимаем бит.-------------------------------------------------------------
RidW: ldi Temp, 1<<Wire ;На выход, 0.
out DDWIR, Temp .
ldi Temp, 25 ;Ждем 15 мкс.
ldi Temp1, 1
rcall Delay
clr Temp
out DDWIR, Temp ;На вход.
in Temp2, PINWI ;Считываем порт.
ldi Temp, 145 ;Ждем 74 мкс.
ldi Temp1, 1
rcall Delay
ret
Передача байта.
Код: Выделить всё
;Передача байта.------------------------------------------------------------
;Ïåðåäà÷à áàéòà.------------------------------------------------------------
PrbW: sbrc Temp3, 0 ;Åñëè áèò 0 = 1, ïåðåäàòü 1.
rcall Wr1
sbrs Temp3, 0 ;Åñëè 0 = 0, ïåðåä. 0.
rcall Wr0
sbrc Temp3, 1
rcall Wr1
sbrs Temp3, 1
rcall Wr0
sbrc Temp3, 2
rcall Wr1
sbrs Temp3, 2
rcall Wr0
sbrc Temp3, 3
rcall Wr1
sbrs Temp3, 3
rcall Wr0
sbrc Temp3, 4
rcall Wr1
sbrs Temp3, 4
rcall Wr0
sbrc Temp3, 5
rcall Wr1
sbrs Temp3, 5
rcall Wr0
sbrc Temp3, 6
rcall Wr1
sbrs Temp3, 6
rcall Wr0
sbrc Temp3, 7
rcall Wr1
sbrs Temp3, 7
rcall Wr0
ret
Код: Выделить всё
;Прием байта!---------------------------------------------------------------
RrWb: clr Temp3 ;×èñòèì áàéò.
rcall RidW ;Ñ÷èòûâàåì áèò.
sbrs Temp2, 0;Wire ;Åñëè áèò ¹Wire=0,
sbr Temp3, (1<<0) ;ñäåëàòü çàïèñü 1 íà ãåî ìåñòå â áàéòå.
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<1)
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<2)
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<3)
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<4)
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<5)
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<6)
rcall RidW
sbrs Temp2, 0
sbr Temp3, (1<<7)
ret
Код: Выделить всё
main: ldi Temp3, 0x33 ;Игнорироват код устройства.
rcall PrbW
rcall RrWb ;Принять 1-й байт.
mov r20, Temp3
rcall RrWb ;2
mov r21, Temp3
rcall RrWb ;3
mov r22, Temp3
rcall RrWb ;4
mov r23, Temp3
rcall RrWb ;5
mov r24, Temp3
rcall RrWb ;6
mov r25, Temp3
rcall RrWb ;7
mov r26, Temp3
rcall RrWb ;8
mov r27, Temp3
L0: rjmp L0
Схема и файлы проекта в архиве.


