Например TDA7294

Форум РадиоКот • Просмотр темы - Управление мегой от ПК (через SPI)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт окт 10, 2025 02:58:42

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Управление мегой от ПК (через SPI)
СообщениеДобавлено: Пн апр 06, 2009 19:35:48 
Первый раз сказал Мяу!

Зарегистрирован: Ср апр 16, 2008 21:13:04
Сообщений: 32
Рейтинг сообщения: 0
Как управлять 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
Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 06, 2009 21:46:06 
Модератор
Аватар пользователя

Карма: 27
Рейтинг сообщений: 58
Зарегистрирован: Пн апр 03, 2006 11:43:25
Сообщений: 4517
Откуда: Санкт - Петербург
Рейтинг сообщения: 0
Медали: 3
Получил миской по аватаре (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Мне кажется, что Вы не до конца понимаете принципы работы SPI и особенности его режимов.
А зачем Reset к LPT подключен? MISO тоже можно не подключать, если Вы информацию на ПК не отправляете.

_________________
Оптимизм х (Опыт + Знания) = const


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 07, 2009 12:14:34 
Собутыльник Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 47
Зарегистрирован: Пн апр 06, 2009 19:33:29
Сообщений: 2512
Откуда: Молдова, Кишинев
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Для zi4rox:
MISO = Master In Slave Out
MOSI = Master Out Slave In

У spi() аргумент 0, как у Вас и написано. Этот код компилируется нормально, в чем ошибка?

Как я уже писал, режимы работы SPI должны совпадать, иначе не будет синхронизации


Вернуться наверх
 
Не в сети
 Заголовок сообщения:
СообщениеДобавлено: Вс апр 19, 2009 11:09:47 
Первый раз сказал Мяу!

Зарегистрирован: Ср апр 16, 2008 21:13:04
Сообщений: 32
Рейтинг сообщения: 0
[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;


Подскажите, в чем здесь может быть заковырка?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление мегой от ПК (через SPI)
СообщениеДобавлено: Сб июл 10, 2010 23:01:29 
Первый раз сказал Мяу!

Зарегистрирован: Сб июл 10, 2010 19:50:14
Сообщений: 37
Рейтинг сообщения: 0
Столкнулся с таокй же проблемой.

Ваша схемка смахивает на программатор, может нужно/можно с LPT подавать сигналы как обычно на МК в Rxd и TxD ?,
а то както боязно что то отправлять так: пытаясь зажесь светодиод можно перепрошить или запороть мк я думаю.


Скиньте сюда пожалуйста полную схему сопряжения AVR-ов (ATmega8,16,..) к LPT ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление мегой от ПК (через SPI)
СообщениеДобавлено: Вс июл 11, 2010 08:38:39 
Друг Кота
Аватар пользователя

Карма: 9
Рейтинг сообщений: 96
Зарегистрирован: Пн июл 13, 2009 14:37:39
Сообщений: 3961
Откуда: Московская область, наукоград.....
Рейтинг сообщения: 0
Насколько помнится в режиме помощника должен принимать участие еще и сигнал SS по которому мега определит что выбрали именно ее а не соседку

_________________
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление мегой от ПК (через SPI)
СообщениеДобавлено: Вс июл 11, 2010 10:04:47 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
read = spi(0x00);

В справке по этому поводу:

this function sends the byte data, simultaneously receiving a byte.

Т.е. подразумевается то что мега работает мастером - сама генерит тактовый сигнал. А вам же нужно тактовый сигнал слушать.

И как правильно заметил Meteor - задействовать сигнал SS - по нему принимающая сторона узнает когда начинается посылка байта.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Управление мегой от ПК (через SPI)
СообщениеДобавлено: Вс июл 11, 2010 12:29:10 
Первый раз сказал Мяу!

Зарегистрирован: Сб июл 10, 2010 19:50:14
Сообщений: 37
Рейтинг сообщения: 0
А можно ли для общения МК с ЛПТ зайдествовать только 2 ноги ?

Может в схеме оставить только 2 вывода : МОСИ и МИСО ? А может МОСИ либо МИСО и СЦК ?


Нашел схему LPT - > I2C

Вроде всего 2 выхода с ЛПТ - это хорошо, но есть вопросы:

1) Эти выходы с каким ножками МК соединять ? RxD & TxD подойдут ? или какието другие нужно задействовать ?
2) Как этоу схему упростить до уровня новичка и сделать на современной элементной базе ? Т.е. без всяких там оптических транзистров ОУ и чего там еще есть, я в них не разбираюсь увы.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y