Работа с интефейсом SSI

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Работа с интефейсом SSI

Сообщение wellcom »

Доброго времени суток всем. Помогите кто словом, кто кодом по решению следующей задачи. Есть относительный энкодер (http://www.sick-automation.ru/images/Fi ... _AFM60.pdf), выдает данные по шине SSI. Нужно с помощью Атмеги, например 16, создать сигнал синхронизации, принять с датчика 21 бит информации (см. рис.
SSI.JPG
Пояснения выдачи данных датчиком.
(116.93 КБ) 288 скачиваний
) и записать их в 32-х битную переменную типа long int. Пробовал создавать в CVAVR 2.05.0 данного типа переменную long int status;, однако почему то она выходит 16-ти битовая. С синхронизацией разобрался - поставил "0", затем "1", затем прочитал пин, подключеный к data, затем "0" и т.д. Мож у кого есть какие идеи? :shock:

Судя из справки CVAVR 2.05.0, данный тип (long) пока не поддерживается. "The current version of the CodeVisionAVR C compiler has the following limitations:
· the long long, double, _Complex and _Imaginary data types are not yet supported"
:solder: 32-х ядерный процессор из П213В
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Работа с интефейсом SSI

Сообщение uk8amk »

Написано что не поддерживается long long. А просто unsigned long status; не пробовали? По крайней мере в cvavr 125 точно работала как 32-битная. На крайняк можно эмулировать 32-битные переменные массивом байтов(что собственно за вас и делает компилятор).
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Работа с интефейсом SSI

Сообщение pyzhman »

long int поддерживается. Указанные тс нет.
Это из компилции:

Код: Выделить всё

;++status;
	LDI  R26,LOW(_status)
	RCALL __GETD1P_INC
            SUBI R30 , LOW ( - 1 )
            SBCI R31 , HIGH ( - 1 ) 
            SBCI R22 , BYTE3 ( - 1 )
            SBCI R23 , BYTE4 ( - 1 )
 	RCALL __PUTDP1_DEC
А это из мапа:
RAM Allocation
Variable Address Size
--------------------------------------------------------------------------------
status 00A8h 4
И выдача данных идет по 0/1, стало быть читать надо по 1/0 для надежности.
Docendo discimus
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: Работа с интефейсом SSI

Сообщение wellcom »

Читать по спаду согласен что надежнее, а как можно по 1-му байту залить 4-х байтовую переменную, скажем status. Предположим, я собрал 4 байта (побитно из 21 прочитаного бита) и записал их в масив. Теперь требуется, скажем mas[0] записать в старшие разряды status, mas[1] в более младшие и т.д. Каким образом лучше всего это сделать? :idea: Может сначала собрать 2-ве 2-х байтовые переменные (эт я уже знаю как делать), а потом их сложить каким то образом...?

P.S. Я начинающий С программер :roll:


Получилось сделать так: переменная типа unsigned long int компилится как 16ти битная, однако long int компилится как 32-х битная, таким образом я читаю порт (один вывод с лог.И) в переменную temp типа char, и каждый раз после чтения делаю сдвиг на 1 разряд влево и "лог. ИЛИ" с предыд. значением temp. В итоге выходит из одного цикла одна переменная temp с 8-ю значущими битами. Далее я беру status, и присваиваю ей ето значение, после чего сдвигаю его на 8 бит для след прочитанных 8ми бит, и так 4 раза. Правда код немного громоздкой получается.

Таким образом я сдвигаю первые 8 принятых бит в самые старшие разряды 32-х битной переменной, однако нужно, что бы заполнение status-a происходило, начиная с 20 по 0 бит. Как можно такое сделать? :shock:
:solder: 32-х ядерный процессор из П213В
Реклама
Эиком - электронные компоненты и радиодетали
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Работа с интефейсом SSI

Сообщение uk8amk »

Да, что-то вы перемудрили...
Пусть status - 32битная переменная, DAT- входной пин порта на кот. подаются данные.
STB- пин стробирования.

Код: Выделить всё

status=0;
STB=LO;
for(i=0;i<21;i++)
   {
    STB=HI;
    status<<=1;
    if(DAT==1)
       status|=0x01;
   STB=LO;
   };
STB=HI;
Примерно так. После сигналов стробировния может понадобится понатыкать задержек согласно максимально допустимой скорости тактирования для вашей микросхемы.
Реклама
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: Работа с интефейсом SSI

Сообщение wellcom »

спасибо за подсказку, таким образом получиль , и код поменьше
:solder: 32-х ядерный процессор из П213В
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»