реклама на сайте
подробности

 
 
9 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> Программная реализация интерфейса
zombi
сообщение Apr 13 2011, 13:40
Сообщение #61


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(rx3apf @ Apr 13 2011, 17:18) *
А вникать в особенности конкретного интерфейса и протокола мне лениво. Если нет синхры - делать ее руками. Если есть - разгребать, что приходит.

Интересно сколько мы еще будем фантазировать???
Может лучше TSра дождаться
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 13 2011, 13:49
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(zombi @ Apr 13 2011, 16:40) *
Может лучше TSра дождаться


Или модератора, чтобы переместил эту тему в раздел для новичков, потому как по сути своей проблема примитивна до крайности ...
Go to the top of the page
 
+Quote Post
stells
сообщение Apr 13 2011, 14:05
Сообщение #63


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(kovigor @ Apr 13 2011, 17:49) *
Или модератора, чтобы переместил эту тему в раздел для новичков, потому как по сути своей проблема примитивна до крайности ...

и это после Ваших слов:
Цитата(kovigor @ Apr 11 2011, 22:36) *
Пробуйте,только уж больно все это сомнительно выглядит ...

sm.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 13 2011, 15:18
Сообщение #64


Ambidexter
*****

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



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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 13 2011, 15:29
Сообщение #65


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(=GM= @ Apr 13 2011, 19:18) *
а при программном опросе (поллинге) - 0-5.

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


Цитата(=GM= @ Apr 13 2011, 19:18) *
Попробовал сам написать, получил задержку погрешности не более 2-х тактов.

Код надеюсь не секретный? можно взглянуть?
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 13 2011, 15:52
Сообщение #66


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(stells @ Apr 13 2011, 17:18) *
в общем от контроллера нужно 3 ноги: MOSI, SCK, T0. последние 2 замкнуты и сигнал на них подаем через резистор. по счетному входу считаем до 22, потом переводим его на выход и дергаем 2 раза


Счетчик не нужен. Достаточно перед приемом дернуть SCK два раза, а потом принять три байта.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 13 2011, 15:59
Сообщение #67


Ambidexter
*****

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



Цитата(zombi @ Apr 13 2011, 14:29) *
Не было такого! Было 3-5. Код надеюсь не секретный? можно взглянуть?

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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 13 2011, 16:02
Сообщение #68


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(777777 @ Apr 13 2011, 19:52) *
Счетчик не нужен. Достаточно перед приемом дернуть SCK два раза, а потом принять три байта.

Действительно все гениальное просто! 777777 beer.gif
Go to the top of the page
 
+Quote Post
stells
сообщение Apr 13 2011, 16:15
Сообщение #69


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(zombi @ Apr 13 2011, 20:02) *
Действительно все гениальное просто! 777777 beer.gif

да, согласен. и от меня пиво beer.gif
Go to the top of the page
 
+Quote Post
stalknr
сообщение Apr 13 2011, 16:18
Сообщение #70


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 19-01-08
Пользователь №: 34 241



Привет Господа!!!!
Смотрю пока я на работе был вы тут во всю обсуждаете.
Вообщем по SPI не кошерно такделать. Тобишь дергать ножкой до или после приема.
Во вторых Синхро прерывистый по 22 шт в слове
Мастера делаю на основе уже готового устройства. Мастер нужен для тестирования потом СЛАЙВА
Какие еще вопросы

ДА и еще как вы узнаете когда дергать надо
Go to the top of the page
 
+Quote Post
stells
сообщение Apr 13 2011, 16:21
Сообщение #71


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(stalknr @ Apr 13 2011, 20:18) *
Вообщем по SPI не кошерно такделать. Тобишь дергать ножкой до или после приема.

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

аргументы? дергать сразу после инициализации и после приема очередного слова
Go to the top of the page
 
+Quote Post
stalknr
сообщение Apr 13 2011, 16:25
Сообщение #72


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 19-01-08
Пользователь №: 34 241



Мне надо на один пин выдавать ДАННЫЕ (АДРЕС+ПУСТОЙ БАЙТ+ПУСТОЙ БАЙТ) в тут же с другого пина принимать
Go to the top of the page
 
+Quote Post
stells
сообщение Apr 13 2011, 16:27
Сообщение #73


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(stalknr @ Apr 13 2011, 20:25) *
Мне надо на один пин выдавать ДАННЫЕ (АДРЕС+ПУСТОЙ БАЙТ+ПУСТОЙ БАЙТ) в тут же с другого пина принимать

так у Вас дуплекс что-ли? вроде речь шла об обмене в одну сторону?
Go to the top of the page
 
+Quote Post
stalknr
сообщение Apr 13 2011, 16:36
Сообщение #74


Частый гость
**

Группа: Участник
Сообщений: 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 мс пауза и все заново начинаеться
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 13 2011, 17:14
Сообщение #75


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(stalknr @ Apr 13 2011, 20:36) *
ЭТО ЧУДО у меня в протеусе сегодня заработало
Код
//                  Процедура     _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.gif biggrin.gif biggrin.gif
Может стоит начать работу с написания слейва? тогда не пришлось бы тратить время на написание мастера.
Go to the top of the page
 
+Quote Post

9 страниц V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01557 секунд с 7
ELECTRONIX ©2004-2016