Страница 1 из 1

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

Добавлено: Пн окт 13, 2008 19:02:54
MegaRazoR
Как правильно организовать связь двух МК АТмега32 по SPI ? Можно ли просто соединить 4 соотв-ие ножки одного МК к ножкам другого ? или нужны какие то хитрости ? и вообще может кто-нибудь поделится нормальный алгоритмом работы двух устройств по SPI а то в датащите то написано все но вот как организовать передачу конкретно не написано.

Добавлено: Пн окт 13, 2008 20:45:18
ARV
достаточно написано в даташите, не фантазируйте. и как соединять там показано, и прочее.

Добавлено: Вт окт 14, 2008 19:50:25
MegaRazoR
Для того чтоб мастеру передать данные слейву ему надо поставить 0 на SS. Записать байт в регистр данных и тем самым запустить передачу. В режиме 0 по переднему фронту SCK слейв начнет принимать данные. Если данные переданы мастер должен убрать SS. Слейв, если так настроено, переходит на подпрограмму обработки прерывания по завершению передачи. В ней нужно сохранить данные из регистра данных SPI куда-нибудь. Потом слейв выходит из этой подпрограммы и продолжает заниматься своими делами.
Вопрос: при получении данных слейвом с момента установки SS=0 мастером до момента перехода на прерывание слейв может выполнять какую то другую программу ?
Если нет то как заставить слейва перейти на программу получения данных от мастера ? Ведь установка SS=0 не вызывает прерывания а лишь активирует SPI.

Добавлено: Вт окт 14, 2008 22:00:05
biDE
MegaRazoR писал(а):Вопрос: при получении данных слейвом с момента установки SS=0 мастером до момента перехода на прерывание слейв может выполнять какую то другую программу ?
Да, слейв может выполнять какую-то другую программу. Прерывания по SPI будут происходить после приема каждого байта.

Добавлено: Чт окт 23, 2008 11:27:15
MegaRazoR
Мне надо понять что означает вот этот код (прерывание по окончанию передачи SPI):

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

если кому не сложно объясните по шагам что здесь происходит ?

Добавлено: Чт окт 23, 2008 11:35:49
tych
MegaRazoR писал(а):Мне надо понять что означает вот этот код (прерывание по окончанию передачи SPI):
Справка по ассемблеру AVR на русском языке - http://asm-avr.narod.ru
добавьте в избранное !

Добавлено: Чт окт 23, 2008 21:02:56
MegaRazoR
а что такое косвенное сохранение ? и как жестко задать начальный адрес памяти выделяемой под массив ?

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

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

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

Добавлено: Пт окт 24, 2008 07:32:51
tych
Даю перевод:
smac писал(а): а) декремент указателя (регистр Y)
Вычитаем 1 из того что было в Y и помещаем в Y
smac писал(а): б) инкрементируем указатель Y
прибавляем 1 к тому что было в Y и помещаем в Y

Добавлено: Пт окт 24, 2008 13:30:19
MegaRazoR
этот код сгенерирован компилятором CodeVision.
а значение програмного счетчика в прерывании не надо сохранять ?
пишу на ассемблере. просто чтоб с нуля не писать в начале написал на си в кодвижн а щас пытаюсь понять чего он такого нафантазировал. Может конечно я ошибаюсь но мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
2 tych спасибо это мне известно )

И еще можно ли доверять расчетам времени в Proteus ?

Добавлено: Пт окт 24, 2008 14:00:34
tych
MegaRazoR писал(а): мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
Естественно ! Это ж УНИВЕРСАЛЬНОЕ решение, оно ОБЫЧНО проигрывает в качестве СПЕЦИАЛЬНОМУ решению уоим является АСМ - но выбор инструмента делают не только по параметру "качество кода", но и по другим - скорость разработки, удобство, общая цена.
MegaRazoR писал(а): 2 tych спасибо это мне известно
Может публике будет интересно.
MegaRazoR писал(а): можно ли доверять расчетам времени в Proteus ?
Да, но с головой.

Добавлено: Сб окт 25, 2008 21:35:45
Foks
Кстати, при соединении двух микроконтроллеров нет смысла управлять программно линией SS. Достаточно повесить резистор на общий к этой линии у слейва.

Добавлено: Пн окт 27, 2008 18:30:29
MegaRazoR
Типа слейв начинает принимать данные по переднему фронту SCK ?

Добавлено: Вт окт 28, 2008 05:19:00
MegaRazoR
Инкремент переменной integer (16 bit):

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

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