ATmega32:SPI:Помогите понять
Как правильно организовать связь двух МК АТмега32 по SPI ? Можно ли просто соединить 4 соотв-ие ножки одного МК к ножкам другого ? или нужны какие то хитрости ? и вообще может кто-нибудь поделится нормальный алгоритмом работы двух устройств по SPI а то в датащите то написано все но вот как организовать передачу конкретно не написано.
спасибо вам за ваше терпение и ваши подробные ответы ! 
- Реклама
достаточно написано в даташите, не фантазируйте. и как соединять там показано, и прочее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Для того чтоб мастеру передать данные слейву ему надо поставить 0 на SS. Записать байт в регистр данных и тем самым запустить передачу. В режиме 0 по переднему фронту SCK слейв начнет принимать данные. Если данные переданы мастер должен убрать SS. Слейв, если так настроено, переходит на подпрограмму обработки прерывания по завершению передачи. В ней нужно сохранить данные из регистра данных SPI куда-нибудь. Потом слейв выходит из этой подпрограммы и продолжает заниматься своими делами.
Вопрос: при получении данных слейвом с момента установки SS=0 мастером до момента перехода на прерывание слейв может выполнять какую то другую программу ?
Если нет то как заставить слейва перейти на программу получения данных от мастера ? Ведь установка SS=0 не вызывает прерывания а лишь активирует SPI.
Вопрос: при получении данных слейвом с момента установки SS=0 мастером до момента перехода на прерывание слейв может выполнять какую то другую программу ?
Если нет то как заставить слейва перейти на программу получения данных от мастера ? Ведь установка SS=0 не вызывает прерывания а лишь активирует SPI.
спасибо вам за ваше терпение и ваши подробные ответы ! 
- Реклама
Справка по ассемблеру AVR на русском языке - http://asm-avr.narod.ruMegaRazoR писал(а):Мне надо понять что означает вот этот код (прерывание по окончанию передачи SPI):
добавьте в избранное !
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Косвенное сохранение (по крайней мере в данном случае) это сохранения данных (байта) в память по адресу содержащемуся в указателе. В вашем случае команда ST -Y,R17 приводит к следующемуMegaRazoR писал(а):а что такое косвенное сохранение ? и как жестко задать начальный адрес памяти выделяемой под массив ?
а) декремент указателя (регистр Y)
б) сохранение байта, содержащегося в регистре R17, по адресу содержащемуся в указателе Y
Соответственно команда LD R17,Y+ расшифровывается так:
а) Загружаем в регистр R17 байт расположенный по адресу, содержащемуся в Y
б) инкрементируем указатель Y
По-поводу начального адреса памяти - тут вопрос на чем вы пишете.
По поводу вашего предыдущего поста - командами ST и LD похоже организован стек. Т. е. при входе в прерывания R17 сохраняется в стеке, затем в R17 читаются даныые из порта с адресом 15 (подозреваю что регистр данных SPI) затем R17 восстанавливается из стека. Т. е. данные, полученные чтением порта затираются.
Далее конечно флуд, но поскольку при программировании на АСМ обычнно пользуются стеком "предоставленным" разработчиками контроллера (это тот который инициализируется в начале, а далее загружается/выгружается командами push pop) и используют символьные имена портов, можно сделать вывод, что данная подпрограмма - результат дизассемблирования программы, возможно (судя по организации стека) написанной на С.
Даю перевод:
Вычитаем 1 из того что было в Y и помещаем в Ysmac писал(а): а) декремент указателя (регистр Y)
прибавляем 1 к тому что было в Y и помещаем в Ysmac писал(а): б) инкрементируем указатель Y
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
этот код сгенерирован компилятором CodeVision.
а значение програмного счетчика в прерывании не надо сохранять ?
пишу на ассемблере. просто чтоб с нуля не писать в начале написал на си в кодвижн а щас пытаюсь понять чего он такого нафантазировал. Может конечно я ошибаюсь но мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
2 tych спасибо это мне известно )
И еще можно ли доверять расчетам времени в Proteus ?
а значение програмного счетчика в прерывании не надо сохранять ?
пишу на ассемблере. просто чтоб с нуля не писать в начале написал на си в кодвижн а щас пытаюсь понять чего он такого нафантазировал. Может конечно я ошибаюсь но мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
2 tych спасибо это мне известно )
И еще можно ли доверять расчетам времени в Proteus ?
спасибо вам за ваше терпение и ваши подробные ответы ! 
Естественно ! Это ж УНИВЕРСАЛЬНОЕ решение, оно ОБЫЧНО проигрывает в качестве СПЕЦИАЛЬНОМУ решению уоим является АСМ - но выбор инструмента делают не только по параметру "качество кода", но и по другим - скорость разработки, удобство, общая цена.MegaRazoR писал(а): мне кажется что сгенерированный кодвиженом код оооочень далек от оптимального.
Может публике будет интересно.MegaRazoR писал(а): 2 tych спасибо это мне известно
Да, но с головой.MegaRazoR писал(а): можно ли доверять расчетам времени в Proteus ?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Инкремент переменной integer (16 bit):
Как работает команда MOVW ? Есть ли жесткая привязка между R4 и R5 ? Могу ли я указать здесь R5 вместо R4 с целью использования пары R5 R6 ?
Код: Выделить всё
MOVW R30,R4
ADIW R30,1
MOVW R4,R30
спасибо вам за ваше терпение и ваши подробные ответы ! 


