Простой термометр
135
Листинг 6.1. Продолжение
/Подпрограмма рестарта Restart:
rsi:
sbi
nop
cbi
nop
rcall
nop
cbi
sbis
DDRB, SCL DDRB, SDA wait5us DDR3, SCL PinB,SCL
соединения I1с
; Повторяем условие старта ; Ниспадающий фронт SCL
; Установка SDA в 1
; Цикл задержки
; Нарастающий фронт SCL
Состояние ожидания ведомого устройства ?
rjmp RSI
rcall wait5us .•Подпрограмма старта передачи Start: nop
clz
sbi DDRB,SDA rcall wait4us WriteByte: nop clz sec
rol dbyt rjmp bitl WriteBit: nop
lsl' dbyt
Цикл задержки
SDA = лог. 0: условие старта Цикл задержки
Запись байта в ведомое устройство
Флаг переноса С = 1 Сдвигаем влево, C->LSB, MSB-Особая обработка разряда 1
>С
bitl: пор
breq
sbi
brcc
пор
cbi
rjmp WriteLow: nop
sbi DDRB,SDA
nop
SCL_High: nop
rcall wait4us cbi DDRB,SCL
GetAck DDRB,SCL WriteLow
DDRB,SDA SCL_High
wb1:
nop sbis
rjmp
rcall
rjmp
PinB,SCL wb1
wait5us WriteBit
Если dbyt пустой, . . .
... то передача завершена
SCL = лог. О Ниспадающий фронт SCL
Переход, если флаг С = 0 Чтобы уравновесить время выполнения SDA - высокоомный Установка SDA в 1
; SDA = лог. 0 Установка SDA в 0 Чтобы уравновесить длительность такта
; Цикл задержки
; SCL - высокоомный Ниспадающий
; фронт SCL
; Состояние ожидания ведомого
; устройства ?
; Цикл задержки
136
Глава 6
Листинг 6.1. Продолжение
GetAck: пор
GA1:
sbi cbi
пор sbis
rjmp
cbr
sbic
sbr
rcall
ret
DDR3,SCL DDRB,SDA
rcall wait5us cbi DDRB,SCL
PinB,SCL GA1
Fig, l«Ack PinB,SDA Fig, l«Ack wait4us
Считывание бита квитирования от зедомого
SCL = лог. О Ниспадающий фронт SCL 3DA - зысокоомный SDA -высокоомное состояние Цикл задержки
SCL - высокоомный Нарастающий фронт SCL
Состояние ожидания зедомого устройства
Флаг Ack = О Если SDA = 1, флаг Ack = 1 Цикл задержки
.•Подпрограмма чтения данных из LM75
ReadByte: ldi
RBI:
RB2 :
sbi rcall cbi sbis
rjmp
rcall
clc
sbic
sec
rol
brcc
nop dbyt,1 DDRB, SCL wait5us DDRB, SCL PinB,SCL
RB2
wait5us
PinB,SDA
dbyt RBI
; Вывод бита квитирования SetAck:
sbi DDRB, SCL
sbrs Fig,Ack
SAl: SA2 :
SA3 :
rimp
Cbi
rjmp
sbi
rcall
cbi
sbis
SAl
DDRB, SDA SA2
DDRB, SDA wait5us DDRB, SCL PinB,SCL
Назначаем в качестве счетчика бит Ниспадающий фронт SCL Цикл задержки Нарастающий фронт SCL Состояние ожидания ведомого устройства ?
Цикл задержки Флаг С = О Если SDA = 1
Carry = 1 Сдвигаем прочитанный бит в байте Переход, если чтение не завершено
Ниспадающий фронт SCL Пропускаем следующую команду, если Ack = 1 Переход, если Ack = О Установка SDA в 1
Установка SDA з О Цикл задержки Нарастающий фронт SCL Состояние ожидания ведомого устройства ?
Простой термометр
137
Листинг 6.1. Продолжение
rjmp SA3
rcall wait5us ret
.•Подпрограмма передачи флага STOP Stopp:
nop
sbi DDRB,SCL
sbi DDRB,SDA
rcall wait5us
cbi DDRB,SCL
rcall wait5us
cbi DDRB,SDA
; Цикл задержки
rcall wait5us ret
Вывод условия зазершения SCL = лог. О Ниспадающий фронт SCL SDA = лог. 0. Установка SDA в 0 Цикл задержки
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |