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

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

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

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

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

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

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

 
Опции темы

Простенький вопрос по SPI и две ATMEGA8

Непрочитано 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.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,512 раз(а) в 2,393 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Простенький вопрос по SPI и две ATMEGA8

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

Проштудируйте раздел "SS Pin Functionality" в документации.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 27.04.2017, 12:06  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,356 раз(а) в 591 сообщении(ях)
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.RUN
 
Регистрация: 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, время: 14:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.