zombi 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба А вникать в особенности конкретного интерфейса и протокола мне лениво. Если нет синхры - делать ее руками. Если есть - разгребать, что приходит. Интересно сколько мы еще будем фантазировать??? Может лучше TSра дождаться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Может лучше TSра дождаться Или модератора, чтобы переместил эту тему в раздел для новичков, потому как по сути своей проблема примитивна до крайности ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Или модератора, чтобы переместил эту тему в раздел для новичков, потому как по сути своей проблема примитивна до крайности ... и это после Ваших слов: Пробуйте,только уж больно все это сомнительно выглядит ... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Кто-то здесь подсчитал, что при использовании прерываний будет задержка не менее 7 тактов, а при программном опросе (поллинге) - 0-5. Как-то непонятно мне почему так, вроде бы цикл опроса занимает 3 такта, значит и погрешность задержки должна быть не более 3-х. Попробовал сам написать, получил задержку погрешности не более 2-х тактов. Интересно, можно ли довести до 1-го такта. Никто не пробовал? Также интересно узнать количество тактов по занесению бита, принятого с любого пина порта, в байт, можно ли уложиться в один такт? Я уложился в два. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба а при программном опросе (поллинге) - 0-5. Не было такого! Было 3-5. Попробовал сам написать, получил задержку погрешности не более 2-х тактов. Код надеюсь не секретный? можно взглянуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба в общем от контроллера нужно 3 ноги: MOSI, SCK, T0. последние 2 замкнуты и сигнал на них подаем через резистор. по счетному входу считаем до 22, потом переводим его на выход и дергаем 2 раза Счетчик не нужен. Достаточно перед приемом дернуть SCK два раза, а потом принять три байта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Не было такого! Было 3-5. Код надеюсь не секретный? можно взглянуть? Ну откуда 3-5, если чтение идёт каждые 3 такта? Конечно покажу, чуть попозже, но хочется немного пообсуждать то, что уже показано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Счетчик не нужен. Достаточно перед приемом дернуть SCK два раза, а потом принять три байта. Действительно все гениальное просто! 777777 :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Действительно все гениальное просто! 777777 :beer: да, согласен. и от меня пиво :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Привет Господа!!!! Смотрю пока я на работе был вы тут во всю обсуждаете. Вообщем по SPI не кошерно такделать. Тобишь дергать ножкой до или после приема. Во вторых Синхро прерывистый по 22 шт в слове Мастера делаю на основе уже готового устройства. Мастер нужен для тестирования потом СЛАЙВА Какие еще вопросы ДА и еще как вы узнаете когда дергать надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Вообщем по SPI не кошерно такделать. Тобишь дергать ножкой до или после приема. ДА и еще как вы узнаете когда дергать надо аргументы? дергать сразу после инициализации и после приема очередного слова Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Мне надо на один пин выдавать ДАННЫЕ (АДРЕС+ПУСТОЙ БАЙТ+ПУСТОЙ БАЙТ) в тут же с другого пина принимать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба Мне надо на один пин выдавать ДАННЫЕ (АДРЕС+ПУСТОЙ БАЙТ+ПУСТОЙ БАЙТ) в тут же с другого пина принимать так у Вас дуплекс что-ли? вроде речь шла об обмене в одну сторону? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба так ведет себя МАСТЕР. СЛАЙВ в этот момент принимает ПОСТОЕ СЛОВО и на его основе формирует ответ. //---------------------------------------------------------------------------- // Процедура _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 мс пауза и все заново начинаеться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 13 апреля, 2011 Опубликовано 13 апреля, 2011 · Жалоба ЭТО ЧУДО у меня в протеусе сегодня заработало // Процедура _peredacha_slova_PRM // выдаем на PORTB.0 6 младших разрядов байта ADRES_OUT // принимаем на PORTB.2 6 младших разрядов байта ADRES_IN ... OUT PORTB, temp //450нс в регистр ввода-вывада (РВВ) передаем R16 PORTB CLR temp //500ns чистим темп NOP //550ns SBIC PINB, PB2 //600ns если PINB.2=0 то пропускаем следующую команду ... Т.е. Вы полагаете что слейв успеет за 150нс детектировать синхро, принять бит данных и еще на передачу чето выдать? :biggrin: Может стоит начать работу с написания слейва? тогда не пришлось бы тратить время на написание мастера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться