|
|
  |
Программная реализация интерфейса |
|
|
|
Apr 13 2011, 15:18
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Кто-то здесь подсчитал, что при использовании прерываний будет задержка не менее 7 тактов, а при программном опросе (поллинге) - 0-5. Как-то непонятно мне почему так, вроде бы цикл опроса занимает 3 такта, значит и погрешность задержки должна быть не более 3-х. Попробовал сам написать, получил задержку погрешности не более 2-х тактов. Интересно, можно ли довести до 1-го такта. Никто не пробовал?
Также интересно узнать количество тактов по занесению бита, принятого с любого пина порта, в байт, можно ли уложиться в один такт? Я уложился в два.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Apr 13 2011, 16:36
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 19-01-08
Пользователь №: 34 241

|
так ведет себя МАСТЕР. СЛАЙВ в этот момент принимает ПОСТОЕ СЛОВО и на его основе формирует ответ. Код //---------------------------------------------------------------------------- // Процедура _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 мс пауза и все заново начинаеться
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|