Например TDA7294

Форум РадиоКот :: Просмотр темы - Управление мегой от ПК (через SPI)
Форум РадиоКот
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;
}
         };
}


Проблема в том, что оба этих варианта не работают, и цели поставленной задачи достичь не удалось :cry:

Прошу помочь, натолкнуть в сторону где можно найти ошибку.[/u]

Вложения:
Комментарий к файлу: Схема к задаче
mega-pc.gif [9.35 KiB]
Скачиваний: 688

Автор:  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/