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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Возможность использования SPI, Возможно ли?..
Sergio66
сообщение Oct 19 2006, 06:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Есть некий контроллер (ПО недоступно), который управляет 4 семисегментными индикаторами при прмощи 4 регистров 74НС164 - последовательный вход, параллельный выход, соединенных последовательно. Т.е. есть стробирующая последовательность и есть последовательность данных. Работа ведется на частоте 100 кГц. Задача - подключиться к данному контроллеру ATMEGой 32 на частоое 16 МГц и перехватывать данные для индикации и выводить их на ЖКИ.
Вопрос: возможно ли для данной цели применить SPI модуль в SLAVE режиме. Понятно, что SS в данном случае придется принудительно занулить. Но возможна ли правильная работа модуля SPI без управляемого мастером SS. В доке сказано, что мастер высоким уровнем SS указывает на окончание посылки. В ланном случае SS будет постоянно в 0.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 19 2006, 06:15
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Sergio66 @ Oct 19 2006, 09:09) *
Есть некий контроллер (ПО недоступно), который управляет 4 семисегментными индикаторами при прмощи 4 регистров 74НС164 - последовательный вход, параллельный выход, соединенных последовательно. В доке сказано, что мастер высоким уровнем SS указывает на окончание посылки. В ланном случае SS будет постоянно в 0.

А может возможно зацепиться SS от паралельной загрузки одного из этих регистров ?
Или если между посылками есть пауза то попробовать засинхриться по ней ...
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Oct 19 2006, 06:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата
А может возможно зацепиться SS от паралельной загрузки одного из этих регистров ?
Или если между посылками есть пауза то попробовать засинхриться по ней ...

Да, засинхронизироваться по паузе не только можно, но просто нет другого варианта, т.к. от регистров толку мало. Хочу понять, работа SS необходима, или можно его тупо подтянуть к массае?
Go to the top of the page
 
+Quote Post
GinRider
сообщение Oct 19 2006, 06:31
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273



Может проще UARTом в синхронном режиме?
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 19 2006, 06:49
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Sergio66 @ Oct 19 2006, 09:27) *
Цитата

А может возможно зацепиться SS от паралельной загрузки одного из этих регистров ?
Или если между посылками есть пауза то попробовать засинхриться по ней ...

Да, засинхронизироваться по паузе не только можно, но просто нет другого варианта, т.к. от регистров толку мало. Хочу понять, работа SS необходима, или можно его тупо подтянуть к массае?


1 SS на массу, а в прерывании по таймеру паузы нужно переинициализировать SPI.
2 завести SS от OCRxx может так быстрее получиться инициализацию делать.
или поставить резистор и если не понравиться то пользовать 1 вариант.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Oct 19 2006, 06:56
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(&-rey @ Oct 19 2006, 10:49) *
Цитата(Sergio66 @ Oct 19 2006, 09:27) *

Цитата

А может возможно зацепиться SS от паралельной загрузки одного из этих регистров ?
Или если между посылками есть пауза то попробовать засинхриться по ней ...

Да, засинхронизироваться по паузе не только можно, но просто нет другого варианта, т.к. от регистров толку мало. Хочу понять, работа SS необходима, или можно его тупо подтянуть к массае?


1 SS на массу, а в прерывании по таймеру паузы нужно переинициализировать SPI.
2 завести SS от OCRxx может так быстрее получиться инициализацию делать.
или поставить резистор и если не понравиться то пользовать 1 вариант.

Интересно, а программное подключение PuP резистора к SS не приведет к инициализации SPI? Это было бы вааще красиво.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 19 2006, 07:09
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Sergio66 @ Oct 19 2006, 09:56) *
Интересно, а программное подключение PuP резистора к SS не приведет к инициализации SPI? Это было бы вааще красиво.

47-100 кОм cranky.gif ну не знаю, даже если сработает то рассчитывать на надежность такого варианта не хочется sad.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 19 2006, 14:17
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Sergio66 @ Oct 19 2006, 09:09) *
Есть некий контроллер (ПО недоступно), который управляет 4 семисегментными индикаторами при прмощи 4 регистров 74НС164 - последовательный вход, параллельный выход, соединенных последовательно. Т.е. есть стробирующая последовательность и есть последовательность данных. Работа ведется на частоте 100 кГц. Задача - подключиться к данному контроллеру ATMEGой 32 на частоое 16 МГц и перехватывать данные для индикации и выводить их на ЖКИ.
Вопрос: возможно ли для данной цели применить SPI модуль в SLAVE режиме. Понятно, что SS в данном случае придется принудительно занулить. Но возможна ли правильная работа модуля SPI без управляемого мастером SS. В доке сказано, что мастер высоким уровнем SS указывает на окончание посылки. В ланном случае SS будет постоянно в 0.


Во-первых надо посмотреть откуда сигнал поступает. То есть как он формируется. Если не SPI, а програмно, то не уверен.

Во-вторых. Честно говоря я не понимаю зачем брится топором. Зачем притягивать за уши лишнюю хрень. Можно даже на АЦП повесить и отслеживать осциллограмму входного сигнала, но зачем!

При частоте импульсов 100кГц и тактовой частоте меги 16М можно паралельно заниматься синтезом голоса и проговаривать что она там выводит.

Возьмите самое простое решение. Импульсы строба подайте на Int0 и при входе в прерывание читайте сигнал данных. Правильно определите нужный фронт.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Oct 19 2006, 15:22
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Во-первых надо посмотреть откуда сигнал поступает. То есть как он формируется. Если не SPI, а програмно, то не уверен.

Во-вторых. Честно говоря я не понимаю зачем брится топором. Зачем притягивать за уши лишнюю хрень. Можно даже на АЦП повесить и отслеживать осциллограмму входного сигнала, но зачем!

При частоте импульсов 100кГц и тактовой частоте меги 16М можно паралельно заниматься синтезом голоса и проговаривать что она там выводит.

Возьмите самое простое решение. Импульсы строба подайте на Int0 и при входе в прерывание читайте сигнал данных. Правильно определите нужный фронт.
[/quote]

К сожалению, это уже пройденный этап. При такой частоте, даже, если выбросить из программы все прочее, в там и работа всех 3 таймеров и задействованные остальные прерывания, (работает основная программа) Если писать на С, то по подсчетам, такая ф-я займет более 60 % ресурса. А это слишком много. Программа реально не успевает. Я пропускаю 20 -40 % импульсов. Вот так.
Go to the top of the page
 
+Quote Post
Gennadiy_
сообщение Oct 19 2006, 16:03
Сообщение #10


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

Группа: Свой
Сообщений: 79
Регистрация: 13-01-06
Из: Москва
Пользователь №: 13 133



В tiny26 SS должна отслеживать программа пользователя, его там просто нет, может вам подобрать подобный кристалл, судя по загрузке вашего камня (наверное привязано к железу), это предложение вам не подходит.

- не пишите на Си (простите если обидел, сам уже давно мечтаю на нем писать)

не до конца понял вашу схему, там кроме последовательности данных других сигналов нет?
но может из строба можно получить сигнал SS, поставить одновибратор, выделять паузу, или в место одновибратора счетчик и сбрасывать его этой последовательностью, может использовать таймер в качестве счетчика.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Oct 20 2006, 06:05
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(Gennadiy_ @ Oct 19 2006, 20:03) *
В tiny26 SS должна отслеживать программа пользователя, его там просто нет, может вам подобрать подобный кристалл, судя по загрузке вашего камня (наверное привязано к железу), это предложение вам не подходит.

- не пишите на Си (простите если обидел, сам уже давно мечтаю на нем писать)

не до конца понял вашу схему, там кроме последовательности данных других сигналов нет?
но может из строба можно получить сигнал SS, поставить одновибратор, выделять паузу, или в место одновибратора счетчик и сбрасывать его этой последовательностью, может использовать таймер в качестве счетчика.

Поясняю. Есть уже готовое серийное устройство, в которое невозможно допаивать ничего. Есть всего несколько свободных ног (INT2 и полностью SPI, хотя, вру, его тоже придется разводить программно - эти ноги управляют ЖКИ). Есть также потребность завести на данное устройство новую информацию с прибора, с которым можнообщаться вышеописанным способом. Так, что стааить одновибраторы, или нагромождать что-либо невозможно. Нужно просто подключиться и снимать данные.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 20 2006, 10:19
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Sergio66 @ Oct 19 2006, 18:22) *
К сожалению, это уже пройденный этап. При такой частоте, даже, если выбросить из программы все прочее, в там и работа всех 3 таймеров и задействованные остальные прерывания, (работает основная программа) Если писать на С, то по подсчетам, такая ф-я займет более 60 % ресурса. А это слишком много. Программа реально не успевает. Я пропускаю 20 -40 % импульсов. Вот так.


Не в обиду. smile.gif Не надо грешить на зеркало,если рожа кривая.

На скорости 14 я отличаю импульсы 2мкс от 4мкс + 2 таймера +Usart с автоопределением частоты и управлением потоком + сама работа. На 16 тоже + 10 програмных фильтров (выделяю DTMF) и преобразую звук из одного стандарта в другой на лету.

В вашем случае:
1. Перепишите прерывание (о котором я писал) на ASM. Типа

push wpl
in wpl,pinx
....

2. Во всех остальных прерываниях поставьте первой командой
__enable_interrupt(); Если у Вас сохраняется в этих прерываниях слишком большой контекст, то тоже придётся переписать на ASM


Ну и третье, - а может есть другой подход чем следить за динамической индикацией. Один раз мне принесли прибор фирмы "Овен" СИ-8 (по моему). Задача та же. Вынести индикацию на несколько метров. Причём предлагали абсолютно аналогичное решение. А, в тоже время, сам прибор располагает интерфейсом rs485. Я к разработчикам письмо. Они мне доку плохинькую. Разбирался-разбирался - не получаю ответа. Ещё письмо с примером своей команды - они мне ответ с исправленным CRC. Оказ. не весь пакет считается. Подправил и всё гуд. Можно посмотреть не только текущую индикацию, а полное состояние.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 20 2006, 10:59
Сообщение #13


Ambidexter
*****

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



Sergio66 Задача - подключиться к данному контроллеру ATMEGой 32 на частоое 16 МГц и перехватывать данные для индикации и выводить их на ЖКИ. Вопрос: возможно ли для данной цели применить SPI модуль в SLAVE режиме. Понятно, что SS в данном случае придется принудительно занулить. Но возможна ли правильная работа модуля SPI без управляемого мастером SS. В доке сказано, что мастер высоким уровнем SS указывает на окончание посылки. В данном случае SS будет постоянно в 0.

Ответ: возможно. После принятия восьми бит возникнет флаг приема SPIF, ну и соответствующее прерывание.

Если примените нижеприведенный код для обработки прерываний от ведомого SPI, то в буфере у вас все время будут последние 4 байта, принятые от вашего устройства, основной программе останется только читать их. Синхронизация будет автоматическая, если ваше устройство будет включаться позже, чем атмега16. Расходы по времени на прием одного байта ничтожные - порядка 16 тактов.

Код
           .dseg                ;
buffer:    .org   0x0100        ;
           .cseg                ;
spispy:    in     r10,SREG      ;
           in     r16,SPDR      ;
           st     x+,r16        ;
           andi   xl,0x03    ;
           out    SREG,r10      ;
           reti                 ;


Сообщение отредактировал =GM= - Oct 20 2006, 11:00


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 20 2006, 14:48
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



К GM.
Это простая реализация очереди. Она может применятся где угодно. Пожалуйста приведите пример инициализации SPI в таком режиме. Я, к сожалению, такого не нашёл. Насколько я понял необходимо забивать адрес слэйва. Похоже я понял неправильно.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 20 2006, 15:38
Сообщение #15


Ambidexter
*****

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



Цитата(SasaVitebsk @ Oct 20 2006, 13:48) *
К GM.
Это простая реализация очереди. Она может применятся где угодно. Пожалуйста приведите пример инициализации SPI в таком режиме. Я, к сожалению, такого не нашёл. Насколько я понял необходимо забивать адрес слэйва. Похоже я понял неправильно.

Адрес слейва не нужен(:-(. Это вы спутали с иис. Но сложного ничего нет. Инициализация приведена на с. 140 документа 2466м (на атмегу16). Для надежности можно еще сделать бит MSTR=0 в регистре SPCR, хотя это значение по умолчанию.

Я не понимаю, что такое "простая реализация очереди". У меня введен кольцевой буфер на 4 байта. Поскольку у автора топика четыре семисегментных индикатора (которые скорее всего работают в статике), то этого достаточно.

To Sergio66 Можно еще попробовать синхронизироваться с помощью SS. Подключите его к свободной ноге и коммутируйте время от времени с периодом кратным периоду одного бита. Так можно поймать начало передачи(:-). Из описания следует, что при переходе SS 0-1 содержимое приемника будет переписываться в буфер, невзирая на незавершенность.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

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

 


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


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