ATmega32:SPI:Помогите понять

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

Как правильно организовать связь двух МК АТмега32 по SPI ? Можно ли просто соединить 4 соотв-ие ножки одного МК к ножкам другого ? или нужны какие то хитрости ? и вообще может кто-нибудь поделится нормальный алгоритмом работы двух устройств по SPI а то в датащите то написано все но вот как организовать передачу конкретно не написано.
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

Для того чтоб мастеру передать данные слейву ему надо поставить 0 на SS. Записать байт в регистр данных и тем самым запустить передачу. В режиме 0 по переднему фронту SCK слейв начнет принимать данные. Если данные переданы мастер должен убрать SS. Слейв, если так настроено, переходит на подпрограмму обработки прерывания по завершению передачи. В ней нужно сохранить данные из регистра данных SPI куда-нибудь. Потом слейв выходит из этой подпрограммы и продолжает заниматься своими делами.
Вопрос: при получении данных слейвом с момента установки SS=0 мастером до момента перехода на прерывание слейв может выполнять какую то другую программу ?
Если нет то как заставить слейва перейти на программу получения данных от мастера ? Ведь установка SS=0 не вызывает прерывания а лишь активирует SPI.
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Встал на лапы
Аватара пользователя
Сообщения: 84
Зарегистрирован: Пн ноя 12, 2007 20:53:05
Откуда: Одесса

Сообщение biDE »

MegaRazoR писал(а):Вопрос: при получении данных слейвом с момента установки SS=0 мастером до момента перехода на прерывание слейв может выполнять какую то другую программу ?
Да, слейв может выполнять какую-то другую программу. Прерывания по SPI будут происходить после приема каждого байта.
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

Мне надо понять что означает вот этот код (прерывание по окончанию передачи SPI):

.CSEG
_spi_isr:
ST -Y,R17
IN R17,15
LD R17,Y+
RETI

если кому не сложно объясните по шагам что здесь происходит ?
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

MegaRazoR писал(а):Мне надо понять что означает вот этот код (прерывание по окончанию передачи SPI):
Справка по ассемблеру AVR на русском языке - http://asm-avr.narod.ru
добавьте в избранное !
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

а что такое косвенное сохранение ? и как жестко задать начальный адрес памяти выделяемой под массив ?
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

MegaRazoR писал(а):а что такое косвенное сохранение ? и как жестко задать начальный адрес памяти выделяемой под массив ?
Косвенное сохранение (по крайней мере в данном случае) это сохранения данных (байта) в память по адресу содержащемуся в указателе. В вашем случае команда ST -Y,R17 приводит к следующему
а) декремент указателя (регистр Y)
б) сохранение байта, содержащегося в регистре R17, по адресу содержащемуся в указателе Y
Соответственно команда LD R17,Y+ расшифровывается так:
а) Загружаем в регистр R17 байт расположенный по адресу, содержащемуся в Y
б) инкрементируем указатель Y

По-поводу начального адреса памяти - тут вопрос на чем вы пишете.

По поводу вашего предыдущего поста - командами ST и LD похоже организован стек. Т. е. при входе в прерывания R17 сохраняется в стеке, затем в R17 читаются даныые из порта с адресом 15 (подозреваю что регистр данных SPI) затем R17 восстанавливается из стека. Т. е. данные, полученные чтением порта затираются.
Далее конечно флуд, но поскольку при программировании на АСМ обычнно пользуются стеком "предоставленным" разработчиками контроллера (это тот который инициализируется в начале, а далее загружается/выгружается командами push pop) и используют символьные имена портов, можно сделать вывод, что данная подпрограмма - результат дизассемблирования программы, возможно (судя по организации стека) написанной на С.
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Даю перевод:
smac писал(а): а) декремент указателя (регистр Y)
Вычитаем 1 из того что было в Y и помещаем в Y
smac писал(а): б) инкрементируем указатель Y
прибавляем 1 к тому что было в Y и помещаем в Y
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

этот код сгенерирован компилятором CodeVision.
а значение програмного счетчика в прерывании не надо сохранять ?
пишу на ассемблере. просто чтоб с нуля не писать в начале написал на си в кодвижн а щас пытаюсь понять чего он такого нафантазировал. Может конечно я ошибаюсь но мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
2 tych спасибо это мне известно )

И еще можно ли доверять расчетам времени в Proteus ?
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

MegaRazoR писал(а): мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
Естественно ! Это ж УНИВЕРСАЛЬНОЕ решение, оно ОБЫЧНО проигрывает в качестве СПЕЦИАЛЬНОМУ решению уоим является АСМ - но выбор инструмента делают не только по параметру "качество кода", но и по другим - скорость разработки, удобство, общая цена.
MegaRazoR писал(а): 2 tych спасибо это мне известно
Может публике будет интересно.
MegaRazoR писал(а): можно ли доверять расчетам времени в Proteus ?
Да, но с головой.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение Foks »

Кстати, при соединении двух микроконтроллеров нет смысла управлять программно линией SS. Достаточно повесить резистор на общий к этой линии у слейва.
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

Типа слейв начинает принимать данные по переднему фронту SCK ?
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Прорезались зубы
Аватара пользователя
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

Инкремент переменной integer (16 bit):

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

MOVW R30,R4               
	ADIW R30,1
	MOVW R4,R30
Как работает команда MOVW ? Есть ли жесткая привязка между R4 и R5 ? Могу ли я указать здесь R5 вместо R4 с целью использования пары R5 R6 ?
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Закрыто

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