так ведет себя МАСТЕР. СЛАЙВ в этот момент принимает ПОСТОЕ СЛОВО и на его основе формирует ответ.
Код
//----------------------------------------------------------------------------
// Процедура _peredacha_slova_PRD
//----------------------------------------------------------------------------
// передаем слово данных ведомому
_peredacha_slova_PRD:
//-------------------------------------------------
// выдаем на PORTB.0 6 младших разрядов байта ADRES_OUT
//-------------------------------------------------
_out_ADRES_OUT:
OUT PORTB, temp //50ns в регистр ввода-вывада (РВВ) передаем R16 PORTB
ROR ADRES_OUT //100ns сдвигаем ADRES_OUT вправо причем SREG.C=ADRES_OUT.0
BRCS C_1 //150ns Выдаем
SBR temp, (1<<PB1) // если бит SREG.С=0 то выдаем в выдаем в порт только синхросигнал
RJMP C_0
C_1:SBR temp, (1<<PB1)+(1<<PB0)// если бит SREG.С=1 то выдаем в выдаем в порт синхросигнал и сам бит
NOP
C_0:NOP
INC Nraz //400нс увеличиваем счетчик разрядов на +1
//_________________________________________
OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB
CLR temp //500ns чистим темп
NOP //550ns
NOP //600ns
NOP //650ns
CPI Nraz, 0x06 //700ns и 750ns считаем 6 умпульсов
BRLO _out_ADRES_OUT //800ns Nrz < 6 переход по "меньше"
//-------------------------------------------------
NOP
//-------------------------------------------------
// выдаем на PORTB.0 8 разрядов байта DATA_L
//-------------------------------------------------
_out_DATA_L:
OUT PORTB, temp //50ns в регистр ввода-вывада (РВВ) передаем R16 PORTB
ROR DATA_L //100ns
BRCS C_3 //150ns Выдаем
SBR temp, (1<<PB1) // если бит SREG.С=0 то выдаем в выдаем в порт только синхросигнал
RJMP C_2
C_3:SBR temp, (1<<PB1)+(1<<PB0)// если бит SREG.С=1 то выдаем в выдаем в порт синхросигнал и сам бит
NOP
C_2:NOP
INC Nraz //400нс увеличиваем счетчик разрядов на +1
//_________________________________________
OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB
CLR temp //500ns чистим темп
NOP //550ns
NOP //600ns
NOP //650ns
CPI Nraz, 0x0E //700ns и 750ns считаем 6+8 умпульсов
BRLO _out_DATA_L //800ns Nrz < 6+8 переход по "меньше"
//-------------------------------------------------
NOP
//-------------------------------------------------
// выдаем на PORTB.0 8 разрядов байта DATA_H
//-------------------------------------------------
_out_DATA_H:
OUT PORTB, temp //50ns в регистр ввода-вывада (РВВ) передаем R16 PORTB
ROR DATA_H //100ns
BRCS C_5 //150ns Выдаем
SBR temp, (1<<PB1) // если бит SREG.С=0 то выдаем в выдаем в порт только синхросигнал
RJMP C_4
C_5:SBR temp, (1<<PB1)+(1<<PB0)// если бит SREG.С=1 то выдаем в выдаем в порт синхросигнал и сам бит
NOP
C_4:NOP
INC Nraz //400нс увеличиваем счетчик разрядов на +1
//_________________________________________
OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB
CLR temp //500ns чистим темп
NOP //550ns
NOP //600ns
NOP //650ns
CPI Nraz, 0x16 //700ns и 750ns считаем 6+8+8 умпульсов
BRLO _out_DATA_H //800ns Nrz < 6+8+8 переход по "меньше"
//-------------------------------------------------
// КОНЕЦ ВЫДАЧИ СЛОВА
NOP
OUT PORTB, temp // ставим на линию данных 0 и на линию синхро тоже 0
CLR Nraz // обнуляем счетчик разрядов
INC Nsl // увеличиваем счетчик слов на +1
CLR temp
RET // Выход из процедуры _peredacha_slova_PRD RET=4 маш. циклов
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Процедура _peredacha_slova_PRM
//----------------------------------------------------------------------------
// передаем слово ведомому и принимаем от него информацию
_peredacha_slova_PRM:
CLR ADRES_IN
CLR DATA_L
CLR DATA_H
//-------------------------------------------------
// выдаем на PORTB.0 6 младших разрядов байта ADRES_OUT
// принимаем на PORTB.2 6 младших разрядов байта ADRES_IN
//-------------------------------------------------
_out_ADRES_OUT_and_in_ADRES_IN:
OUT PORTB, temp //50ns в регистр ввода-вывада (РВВ) передаем R16 PORTB
ROR ADRES_OUT //100ns сдвигаем ADRES_OUT вправо причем SREG.C=ADRES_OUT.0
BRCS C_7 //150ns Выдаем
SBR temp, (1<<PB1) // если бит SREG.С=0 то выдаем в выдаем в порт только синхросигнал
RJMP C_6
C_7:SBR temp, (1<<PB1)+(1<<PB0)// если бит SREG.С=1 то выдаем в выдаем в порт синхросигнал и сам бит
NOP
C_6:LSR ADRES_IN
INC Nraz //400нс увеличиваем счетчик разрядов на +1
//_________________________________________
OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB
CLR temp //500ns чистим темп
NOP //550ns
SBIC PINB, PB2 //600ns если PINB.2=0 то пропускаем следующую команду
SBR ADRES_IN, (1<<7) //650ns ставим 1 в 7 разряде ADRES_IN
CPI Nraz, 0x06 //700ns и 750ns считаем 6 умпульсов
BRLO _out_ADRES_OUT_and_in_ADRES_IN //800ns Nrz < 6 переход по "меньше"
//-------------------------------------------------
NOP
//-------------------------------------------------
// принимаем на PORTB.2 8 разрядов байта DATA_L
//-------------------------------------------------
_in_DATA_L:
OUT PORTB, temp //50ns в регистр ввода-вывада (РВВ) передаем R16 PORTB
LSR DATA_L //100ns
NOP //150ns
NOP //200ns выдаем в выдаем в порт только синхросигнал
NOP //250ns
NOP //300ns
SBR temp, (1<<PB1) //300ns
INC Nraz //400нс увеличиваем счетчик разрядов на +1
//_________________________________________
OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB
CLR temp //500ns чистим темп
NOP //550ns
SBIC PINB, PB2 //600ns если PINB.2=0 то пропускаем следующую команду
SBR DATA_L, (1<<7) //650ns ставим 1 в 7 разряде DATA_L
CPI Nraz, 0x0E //700ns и 750ns считаем 6+8 умпульсов
BRLO _in_DATA_L //800ns Nrz < 6+8 переход по "меньше"
//-------------------------------------------------
NOP
//-------------------------------------------------
// выдаем на PORTB.0 8 разрядов байта DATA_H
//-------------------------------------------------
_in_DATA_H:
OUT PORTB, temp //50ns в регистр ввода-вывада (РВВ) передаем R16 PORTB
LSR DATA_H //100ns
NOP //150ns
NOP //200ns выдаем в выдаем в порт только синхросигнал
NOP //250ns
NOP //300ns
SBR temp, (1<<PB1) //300ns
INC Nraz //400нс увеличиваем счетчик разрядов на +1
//_________________________________________
OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB
CLR temp //500ns чистим темп
NOP //550ns
SBIC PINB, PB2 //600ns если PINB.2=0 то пропускаем следующую команду
SBR DATA_H, (1<<7) //650ns ставим 1 в 7 разряде DATA_H
CPI Nraz, 0x16 //700ns и 750ns считаем 6+8+8 умпульсов
BRLO _in_DATA_H //800ns Nrz < 6+8+8 переход по "меньше"
//-------------------------------------------------
NOP
// КОНЕЦ ПРИЕМА СЛОВА
OUT PORTB, temp // ставим на линию данных 0 и на линию синхро тоже 0
CLR Nraz // обнуляем счетчик разрядов
INC Nsl // увеличиваем счетчик слов на +1
LSR ADRES_IN
LSR ADRES_IN // сдивагаем 2 раза чтобы получить 1р адреса в 0р байта (ПОДГОНЯЕМ ПОД ФОРМАТ)
LDI DATA_L, 0xAA
LDI YH, 0x01
LDI temp, 0x03
MUL temp, ADRES_IN
MOV YL, R0
ST Y+, ADRES_IN
ST Y+, DATA_L
ST Y+, DATA_H
CLR YL
; CLR ADRES_IN
; CLR DATA_L
; CLR DATA_H
CLR temp
RET // Выход из процедуры _peredacha_slova_PRD RET=4 маш. циклов
//----------------------------------------------------------------------------
ЭТО ЧУДО у меня в протеусе сегодня заработало
КОРОЧЕ в посылке у МАСТЕРА сначало 33 слово только на передачу (СЛАЙВ в это время принимает, складывает это все в ОЗУ и формирует ответ ввиде АДРЕС+2 ПУСТЫХ БАЙТА (НАХРЕНА НЕЗНАЮ)) далее перерыв в 300 мкс и МАСТЕР выдает еще 33 слова на передачу и прием (тоесть формирует для СЛАЙВА синхро сигнал и принимает от него данные) затем идет 6*1,28 мс пауза и все заново начинаеться