инициализация
ldi r16,0b00011010 ;sda scl на вход
out ddrb,r16 ; DDRB
ldi r16,0B00000000 ;перевести выходы в 0
out portb,r16 ; PORTB
;(USICR) РЕГИСТР УПРАВЛЕНИЯ USI
LDI temp,0b10101000
; 0-----USITC переключение вывода строба
; 1-----USICLK SCK 000-строб отсутствует 001-програмный строб
; 2-----USICS0 выбор строб 01x- блок сравнения счетчика
; 3-----USICS1выбор строб -1
; 4-----USIWM0 режим раб 00-USI-откл 01-3-проводн режим
; 5-----USIWM1 режим раб 10-2-проводный 11-2-проводный при переполнении SCL-низкий--1
; 6-----USIOIE разреш прерыван при переполнении счетчика -1
; 7-----USISIE разреш прерыван при обнаружении СТАРТ -1
OUT USICR, temp
;(USISR) РЕГИСТР СОСТОЯНИЯ USI
LDI temp,0b11110000;сбросили все флаги
; 0-----USICNT0 счетчик-4бит
; 1-----USICNT1 инкриментируется при каждом стробе
; 2-----USICNT2
; 3-----USICNT3
; 4-----USIDC флаг колизии при выведении данных в 2х проводном режиме
; 5-----USIPF флаг обнаружения СТОП
; 6-----USIOIF флаг прерыван при переполнении счетчика
; 7-----USISIF флаг прерыван при обнаружении СТАРТ
OUT USISR, temp
USI_START:
in reg_,SREG ; cохранение регистра статуса и всех регистров
PUSH temp
PUSH temp1
SBI PORTB,PB1
ldi temp, (1< OUT USICR, temp
CLR FLL ;ОБНУЛИЛИ ВСЕ ФЛАГИ
ACK_OK_8: ldi temp,0xf0;/8бит данных
OUT USISR, temp
CBR FLL,ACKK;СБРОСИЛИ ФЛАГ
WDR exit: POP temp1
POP temp
out SREG,reg_
RETI
;ПРЕРЫВАНИЕ ПО ПЕРЕПОЛНЕНИЮ СЧЕТЧИКА
USI_OVF: in reg_,SREG ; cохранение регистра статуса и всех регистров
PUSH temp
PUSH temp1
SBIC USISR,USIPF;ЕСЛИ ПРИШОЛ СТОП ТО ПРИВОДИМ ВСЕ В ИСХОДНОЕ СОСТОЯНИЕ
RJMP STOP
SBRC FLL,4; ACK
RJMP ACK_OK_8;ЗАРЯЖАЕМ НА ПРИЕМ 8 БАЙТОВ
SBRC FLL,2 ; АДРЕС H
RJMP ADRESS_HH
SBRC FLL,3 ; АДРЕС L
RJMP ADRESS_LL
SBRC FLL,0; FL_READ
RJMP READ1
SBRC FLL,1 ; FL_WRITE
RJMP WRITE1
STARTT: IN TEMP,USIBR
SBR FLL, FL_WRITE
SBRS TEMP,7
RJMP STT
SBR FLL, FL_READ
CBR FLL, FL_WRITE
STT: ANDI TEMP,0XF0
CPI TEMP,0XA0
BRNE EXIT
SBRS FLL,0;ЧТЕНИЕ НЕНАДО ЧИТАТЬ АДРЕС
SBR FLL,FL_ADRESS_H;БУДЕМ ПРИНИМАТЬ АДРЕСС
ACK: CLR TEMP
OUT USIDR,TEMP
ldi temp,0xfE;/1бит данных C ack
OUT USISR, temp
SBR FLL,ACKK
RJMP EXIT
NACK: LDI TEMP,0X80
OUT USIDR,TEMP
ldi temp,0xfE;/1бит данных
OUT USISR, temp
SBR FLL,ACKK
RJMP EXIT
ADRESS_HH: IN ZH,USIBR
CBR FLL,FL_ADRESS_H
SBR FLL,FL_ADRESS_L
ldi temp,0xf0;/9бит данных
OUT USISR, temp
RJMP EXIT
ADRESS_LL: IN ZH,USIBR
CBR FLL,FL_ADRESS_L
RJMP ACK
WRITE1: IN TEMP,USIBR
ST Z+,TEMP
; RCALL EEPROM_write
; ADIW ZL,1
RJMP ACK
READ1 : SBI PORTB,PB3
LD TEMP,Z+
; RCALL EEPROM_READ
OUT USIDR,TEMP
; ADIW ZL,1
RJMP ACK
STOP:
CBI PORTB,PB1
ldi temp, (1< OUT USICR, temp
CLR FLL ;ОБНУЛИЛИ ВСЕ ФЛАГИ
ldi temp,0xf0;/8бит данных;
OUT USISR, temp
RJMP EXIT