Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 27.04.2017, 00:29  
ibro30
Прохожий
 
Регистрация: 26.04.2017
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ibro30 на пути к лучшему
По умолчанию Простенький вопрос по SPI и две ATMEGA8

Всем здравствуйте!! По-тихоньку изучаю программирование на Меге. Я новичок, поэтому прошу сильно не бить.
Задачу поставил простую себе: 2 меги, Мастер передаёт слэйву 1 бит, Слэйв включает светодиод. Всё просто, но у слэйва, видимо, я написал неправильно в условиях вывода (скорее всего условие IF). Правда при запуске в протеусе всё стопорится почему-то на SS... мистика))
master:

void SPI_Init(void)
{
DDRB |=(1‹‹PB2)|(1‹‹PB3)|(1‹‹PB5); //Настроить выводы MOSI,SS,SCK на выход
PORTB|=(1‹‹PB2); //Установить "1" на линии SS

SPCR = 0; //Обнулить регистр SPCR
SPSR = 0; //Обнулить регистр SPSR

SPCR |= (1‹‹MSTR)|(1‹‹SPR0); //Режим мастер, F=Fosc/16
SPSR |=(1‹‹SPI2X); //F=Fosc/8

SPCR |=(1‹‹SPE);//Включить SPI
}

void SPI_Send_byte(char data)
{
PORTB &=~(1‹‹PB2); //Установить "0" на линии SS
SPDR = data; //Отправить байт
while(!(SPSR&(1‹‹SPIF))) ; //Дождаться окончания передачи
PORTB |=(1‹‹PB2); //Установить "1" на линии SS
}

int main(void)
{
SPI_Init();
SPI_Send_byte('1');
while(1)
{

}
}


слэйв:

void SPI_Init_Slave(void)
{
DDRB&= ~(1‹‹PB2) | ~(1‹‹PB3) |~(1‹‹PB5);
DDRB|=(1‹‹PB4);

SPCR=0;
SPSR=0;

SPCR |= (1‹‹SPR0)|(1‹‹SPIE);
SPSR |=(1‹‹SPI2X);

SPCR |=(1‹‹SPE);
}


ISR(SPI_STC_vect)
{
PORTB = SPDR; // вывод данных
return ;
}

int main(void)
{
sei();
SPI_Init_Slave();

DDRB|=(1‹‹PC0); //Настраиваем ножку PB2 в режим выхода
while(1) //бесконечный цикл
{
if(SPDR&=~0)//Если в SPDR поступил байт
{
PORTB|=(1‹‹PC0);//Зажигаем светодиод
}
else// если не поступил, тогда
{
PORTB&=~(1‹‹PC0);//Гасим светодиод
}
}
}
Реклама:

Последний раз редактировалось ibro30; 27.04.2017 в 00:32. Причина: не влезает код((
ibro30 вне форума  
Непрочитано 27.04.2017, 05:44  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

ibro30, тэг [код] можете поставить? Нечитаемо. А лучше [PHP] - тогда немного цветов появится, парсить полегче будет...

Сообщение от ibro30 Посмотреть сообщение
SPCR = 0; //Обнулить регистр SPCR
зачем писать такие бесполезные комментарии - и так понятно, что нуль записывается в SPCR. Написали бы уж "обнулить SPI Control Register", так хоть понятно будет его назначение.

Если так и написано:
PHP код:
if(SPDR&=~0
То у вас тут идёт запись в порт, компилятор не предупреждает? Советую обращать внимание на предупреждения.
Окончание передачи надо смотреть по флагу SPIF в регистре SPSR, потому он и "статус" называется[регистр]. Фух, чуть глаза не сломал, в следующий раз такое проигнорирую, и, думаю, не только я.

Будете больше читать - будут меньше бить на форумах. Синяки конечно добавляют мотивации, но не делают умнее... Вам, видимо, было лень читать DS на свою мегу, а ведь там даже примеры есть на асме и на Си:

PHP код:
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1‹‹DD_MISO);
/* Enable SPI */
SPCR = (1‹‹SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1‹‹SPIF)))
;
/* Return data register */
return SPDR;

H4LF вне форума  
Непрочитано 27.04.2017, 11:35  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,070
Сказал спасибо: 3,052
Сказали Спасибо 3,224 раз(а) в 2,188 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

Помимо все уже указанного - а в чём вопрос-то? В этом?
Сообщение от ibro30 Посмотреть сообщение
Правда при запуске в протеусе всё стопорится почему-то на SS... мистика))
Что значит "стопорится на SS"? У ведущего или ведомого?

Проштудируйте раздел "SS Pin Functionality" в документации.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 27.04.2017, 12:06  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,388
Сказал спасибо: 1,976
Сказали Спасибо 1,331 раз(а) в 579 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

Напомню еще - у слейва SS должен быть притянут к земле.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 30.04.2017, 23:50  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

Сообщение от МВА Посмотреть сообщение
Да не теряются такие скобки нигде, ни в каких текстах... кроме, как когда вставляешь #include пропало в треугольных скобках avr/io.h . не веришь? попробуй сам написать такие скобки в любом месте и формате ответа.
Хорошо, попробую, но в эту тему, чтобы не засорять ту. Это интересно. У него там все сдвиги превратились в просто одинарный ‹ и не хватает точек с запятой и много чего ещё. Неужели ты думаешь, что он накопипастил с такими ошибками, да ещё как-то умудрился скомпилировать? И к тому же я уже видел такое на этом форуме, потому и не стал придираться.

void UARTInit(void) {
UBRRH = 0;
UBRRL = 51; //baud rate 9600
UCSRB = (1‹‹RXEN)|(1‹‹TXEN)|(1‹‹RXCIE);
UCSRC = (1‹‹URSEL)|(1‹‹UCSZ1)|(1‹‹UCSZ0); //8 bit, 1 stop bit
}

А вот тут - в режиме расширенного ответа - всё нормально выглядит, скопипащу как сюда:
Нажмите, чтобы открыть спойлер
PHP код:
void SPI_Init(void)
{
DDRB |=(1‹‹PB2)|(1‹‹PB3)|(1‹‹PB5); //Настроить выводы MOSI,SS,SCK на выход
PORTB|=(1‹‹PB2); //Установить "1" на линии SS

SPCR 0//Обнулить регистр SPCR
SPSR 0//Обнулить регистр SPSR

SPCR |= (1‹‹MSTR)|(1‹‹SPR0); //Режим мастер, F=Fosc/16
SPSR |=(1‹‹SPI2X); //F=Fosc/8

SPCR |=(1‹‹SPE);//Включить SPI
}

void SPI_Send_byte(char data)
{
PORTB &=~(1‹‹PB2); //Установить "0" на линии SS
SPDR data//Отправить байт
while(!(SPSR&(1‹‹SPIF))) ; //Дождаться окончания передачи
PORTB |=(1‹‹PB2); //Установить "1" на линии SS
}

int main(void)
{
SPI_Init();
SPI_Send_byte('1');
while(
1)
{

}
}


слэйв:

void SPI_Init_Slave(void)
{
DDRB&= ~(1‹‹PB2) | ~(1‹‹PB3) |~(1‹‹PB5);
DDRB|=(1‹‹PB4);

SPCR=0;
SPSR=0;

SPCR |= (1‹‹SPR0)|(1‹‹SPIE);
SPSR |=(1‹‹SPI2X);

SPCR |=(1‹‹SPE);
}


ISR(SPI_STC_vect)
{
PORTB SPDR// вывод данных
return ;
}

int main(void)
{
sei();
SPI_Init_Slave();

DDRB|=(1‹‹PC0); //Настраиваем ножку PB2 в режим выхода
while(1//бесконечный цикл
{
if(
SPDR&=~0)//Если в SPDR поступил байт
{
PORTB|=(1‹‹PC0);//Зажигаем светодиод
}
else
// если не поступил, тогда
{
PORTB&=~(1‹‹PC0);//Гасим светодиод
}
}

H4LF вне форума  
Непрочитано 30.04.2017, 23:51  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

МВА, я точно вставлял нормальный код, но без тегов. что и требовалось доказать.
H4LF вне форума  
Непрочитано 01.05.2017, 09:26  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

Сообщение от H4LF Посмотреть сообщение
МВА, я точно вставлял нормальный код, но без тегов. что и требовалось доказать.
void SPI_Init(void)
{
DDRB |=(1‹‹PB2)|(1‹‹PB3)|(1‹‹PB5); //Настроить выводы MOSI,SS,SCK на выход
PORTB|=(1‹‹PB2); //Установить "1" на линии SS

SPCR = 0; //Обнулить регистр SPCR
SPSR = 0; //Обнулить регистр SPSR

SPCR |= (1‹‹MSTR)|(1‹‹SPR0); //Режим мастер, F=Fosc/16
SPSR |=(1‹‹SPI2X); //F=Fosc/8

Странно, я скопировал с Вашего сообщения кусок кода и вставил в сообщение. Не кажется ли что это мистика? В предварительном просмотре все отображено нормально.
Тогда я не прав, прошу прощенья. Удалю свое предыдущее сообщение.

Последний раз редактировалось МВА; 03.05.2017 в 18:52.
МВА вне форума  
Непрочитано 01.05.2017, 14:47  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

МВА, да, я тоже вот только и заметил, когда ответ тут стал писать. Это форумный движок не выкидывает подозрительное (как он может сделать, чтобы не пропускать какие-нибудь XSS и тому подобное), а просто не отображает в обычном режиме.
PS: плохо, что предварительный просмотр отображает не совсем так, как будет выглядеть...

Последний раз редактировалось H4LF; 01.05.2017 в 15:02. Причина: PS
H4LF вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по atmega8 + spi + max7219 atsys Микроконтроллеры, АЦП, память и т.д 6 16.09.2010 14:01
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03
простенький вопрос MicroPIC Микроконтроллеры, АЦП, память и т.д 1 18.11.2007 15:23
Вопрос по SPI ezin Микроконтроллеры, АЦП, память и т.д 3 29.09.2007 22:27


Часовой пояс GMT +4, время: 06:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot