| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Управление мегой от ПК (через SPI) https://radiokot.ru/forum/viewtopic.php?f=20&t=15113 |
Страница 1 из 1 |
| Автор: | zi4rox [ Пн апр 06, 2009 19:35:48 ] | ||
| Заголовок сообщения: | Управление мегой от ПК (через SPI) | ||
Как управлять ATMega с компьютера, средствами SPI ? Необходимо твердо в этом вопросе разобраться и для себя уяснить что и как. Поэтому поставил себе следующие условия простой задачи: Мега, получает с ПК управляющий код (байт), анализирует его и выполняет какое то определенное действие (пускай будет моргать светодиодами на порту). Используется SPI, мега получается в режиме salve. Схема к данной задачи:
После моих проб, ошибок и советов добрых людей получилось 2 реализации: * Программирую в CodeVisionAVR 1. С использованием примера из даташита atmega16 (стр. 132) Код: #include <mega16> #define DDR_SPI DDRB #define DD_MISO PORTB.6 // Управляющие коды, которые могут быть переданы #define CMD1 0x01 #define CMD2 0x02 #define CMD3 0x03 #define CMD4 0x04 void SPI_SlaveInit(void) { /* Set MISO output, all others input */ DDR_SPI = (1 << DD_MISO); /* Enable SPI */ SPCR = (1 << SPE); } unsigned char SPI_SlaveReceive(void) { /* Wait for reception complete */ while(!(SPSR & (1 << SPIF))) ; /* Return data register */ return SPDR; } void main (void){ SPI_SlaveInit(); DDRA = 0xFF; // сделали порт A выходом while (1){ // анализируем полученный ответ switch(SPI_SlaveReceive()) { case CMD1: PORTA = 0x01; break; case CMD2: PORTA = 0x01; break; case CMD3: PORTA = 0x03; break; case CMD4: PORTA = 0x04; break; default: PORTA = 0xFF; break; } }; } 2. С использованием стандартных функций в spi.h (а также codewizard'а в cvavr): Код: #include <mega16>
#include <spi> // Управляющие коды, которые могут быть переданы #define CMD1 0x01 #define CMD2 0x02 #define CMD3 0x03 #define CMD4 0x04 unsigned char read; void main (void){ // инициализируем порты PORTB=0x00; DDRB=0x40; //тут SPI порт PORTF=0x00; DDRF=0xFF; // инициализируем SPI SPCR=0x40; SPSR=0x00; while (1){ read = spi(0x00); /* [b]вот здесь мне непонятно что писать в качестве аргумента spi()? [без аргумента выдает ошибку]. [/b]*/ switch(read) { case CMD1: PORTA = 0x01; break; case CMD2: PORTA = 0x02; break; case CMD3: PORTA = 0x03; break; case CMD4: PORTA = 0x04; break; default: PORTA = 0xFF; break; } }; } Проблема в том, что оба этих варианта не работают, и цели поставленной задачи достичь не удалось Прошу помочь, натолкнуть в сторону где можно найти ошибку.[/u]
|
|||
| Автор: | Aheir [ Пн апр 06, 2009 21:46:06 ] |
| Заголовок сообщения: | |
Мне кажется, что Вы не до конца понимаете принципы работы SPI и особенности его режимов. А зачем Reset к LPT подключен? MISO тоже можно не подключать, если Вы информацию на ПК не отправляете. |
|
| Автор: | BCluster [ Вт апр 07, 2009 12:14:34 ] |
| Заголовок сообщения: | |
Для zi4rox: MISO = Master In Slave Out MOSI = Master Out Slave In У spi() аргумент 0, как у Вас и написано. Этот код компилируется нормально, в чем ошибка? Как я уже писал, режимы работы SPI должны совпадать, иначе не будет синхронизации |
|
| Автор: | zi4rox [ Вс апр 19, 2009 11:09:47 ] |
| Заголовок сообщения: | |
[quote name='=GM=' post='573633' date='Apr 7 2009, 20:12']попробуйте просто принять любой байт и вывести его в портА на светодиоды[/quote] Так и делал PORTA = SPDR; На светодиоды выводит передаваемы байт. Т.е передача работает. Однако, не удается обработать полученный байт и уже оперировать им. Код наподобе этого, и вариации, что я перепробывал - отказываются работать: Код: while (1){ // анализируем полученный ответ switch(SPI_SlaveReceive()) { case CMD1: PORTA = 0x01; break; case CMD2: PORTA = 0x01; break; case CMD3: PORTA = 0x03; break; case CMD4: PORTA = 0x04; break; default: PORTA = 0xFF; break; } Так же не работает и попытка счиатать значение SPDR в переменную =( Код: unsigned char read;
read = SPDR; Подскажите, в чем здесь может быть заковырка? |
|
| Автор: | rapaks [ Сб июл 10, 2010 23:01:29 ] |
| Заголовок сообщения: | Re: Управление мегой от ПК (через SPI) |
Столкнулся с таокй же проблемой. Ваша схемка смахивает на программатор, может нужно/можно с LPT подавать сигналы как обычно на МК в Rxd и TxD ?, а то както боязно что то отправлять так: пытаясь зажесь светодиод можно перепрошить или запороть мк я думаю. Скиньте сюда пожалуйста полную схему сопряжения AVR-ов (ATmega8,16,..) к LPT ? |
|
| Автор: | Meteor [ Вс июл 11, 2010 08:38:39 ] |
| Заголовок сообщения: | Re: Управление мегой от ПК (через SPI) |
Насколько помнится в режиме помощника должен принимать участие еще и сигнал SS по которому мега определит что выбрали именно ее а не соседку |
|
| Автор: | uk8amk [ Вс июл 11, 2010 10:04:47 ] |
| Заголовок сообщения: | Re: Управление мегой от ПК (через SPI) |
read = spi(0x00); В справке по этому поводу: this function sends the byte data, simultaneously receiving a byte. Т.е. подразумевается то что мега работает мастером - сама генерит тактовый сигнал. А вам же нужно тактовый сигнал слушать. И как правильно заметил Meteor - задействовать сигнал SS - по нему принимающая сторона узнает когда начинается посылка байта. |
|
| Автор: | rapaks [ Вс июл 11, 2010 12:29:10 ] |
| Заголовок сообщения: | Re: Управление мегой от ПК (через SPI) |
А можно ли для общения МК с ЛПТ зайдествовать только 2 ноги ? Может в схеме оставить только 2 вывода : МОСИ и МИСО ? А может МОСИ либо МИСО и СЦК ? Нашел схему LPT - > I2C Вроде всего 2 выхода с ЛПТ - это хорошо, но есть вопросы: 1) Эти выходы с каким ножками МК соединять ? RxD & TxD подойдут ? или какието другие нужно задействовать ? 2) Как этоу схему упростить до уровня новичка и сделать на современной элементной базе ? Т.е. без всяких там оптических транзистров ОУ и чего там еще есть, я в них не разбираюсь увы. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


