Перейти к содержанию
    

Программная реализация интерфейса

А вникать в особенности конкретного интерфейса и протокола мне лениво. Если нет синхры - делать ее руками. Если есть - разгребать, что приходит.

Интересно сколько мы еще будем фантазировать???

Может лучше TSра дождаться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может лучше TSра дождаться

 

Или модератора, чтобы переместил эту тему в раздел для новичков, потому как по сути своей проблема примитивна до крайности ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или модератора, чтобы переместил эту тему в раздел для новичков, потому как по сути своей проблема примитивна до крайности ...

и это после Ваших слов:

Пробуйте,только уж больно все это сомнительно выглядит ...

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-то здесь подсчитал, что при использовании прерываний будет задержка не менее 7 тактов, а при программном опросе (поллинге) - 0-5. Как-то непонятно мне почему так, вроде бы цикл опроса занимает 3 такта, значит и погрешность задержки должна быть не более 3-х. Попробовал сам написать, получил задержку погрешности не более 2-х тактов. Интересно, можно ли довести до 1-го такта. Никто не пробовал?

 

Также интересно узнать количество тактов по занесению бита, принятого с любого пина порта, в байт, можно ли уложиться в один такт? Я уложился в два.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а при программном опросе (поллинге) - 0-5.

Не было такого! Было 3-5.

 

 

Попробовал сам написать, получил задержку погрешности не более 2-х тактов.

Код надеюсь не секретный? можно взглянуть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в общем от контроллера нужно 3 ноги: MOSI, SCK, T0. последние 2 замкнуты и сигнал на них подаем через резистор. по счетному входу считаем до 22, потом переводим его на выход и дергаем 2 раза

 

Счетчик не нужен. Достаточно перед приемом дернуть SCK два раза, а потом принять три байта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не было такого! Было 3-5. Код надеюсь не секретный? можно взглянуть?

Ну откуда 3-5, если чтение идёт каждые 3 такта?

 

Конечно покажу, чуть попозже, но хочется немного пообсуждать то, что уже показано.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Счетчик не нужен. Достаточно перед приемом дернуть SCK два раза, а потом принять три байта.

Действительно все гениальное просто! 777777 :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно все гениальное просто! 777777 :beer:

да, согласен. и от меня пиво :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет Господа!!!!

Смотрю пока я на работе был вы тут во всю обсуждаете.

Вообщем по SPI не кошерно такделать. Тобишь дергать ножкой до или после приема.

Во вторых Синхро прерывистый по 22 шт в слове

Мастера делаю на основе уже готового устройства. Мастер нужен для тестирования потом СЛАЙВА

Какие еще вопросы

 

ДА и еще как вы узнаете когда дергать надо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем по SPI не кошерно такделать. Тобишь дергать ножкой до или после приема.

 

ДА и еще как вы узнаете когда дергать надо

аргументы? дергать сразу после инициализации и после приема очередного слова

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне надо на один пин выдавать ДАННЫЕ (АДРЕС+ПУСТОЙ БАЙТ+ПУСТОЙ БАЙТ) в тут же с другого пина принимать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне надо на один пин выдавать ДАННЫЕ (АДРЕС+ПУСТОЙ БАЙТ+ПУСТОЙ БАЙТ) в тут же с другого пина принимать

так у Вас дуплекс что-ли? вроде речь шла об обмене в одну сторону?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так ведет себя МАСТЕР. СЛАЙВ в этот момент принимает ПОСТОЕ СЛОВО и на его основе формирует ответ.

 

//----------------------------------------------------------------------------
//                  Процедура     _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 мс пауза и все заново начинаеться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЭТО ЧУДО у меня в протеусе сегодня заработало

//                  Процедура     _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: :biggrin: :biggrin:

Может стоит начать работу с написания слейва? тогда не пришлось бы тратить время на написание мастера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...