AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
27.04.2017, 00:29
|
|
Прохожий
Регистрация: 26.04.2017
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Простенький вопрос по 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.
Причина: не влезает код((
|
|
|
|
27.04.2017, 05:44
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Простенький вопрос по SPI и две ATMEGA8
ibro30, тэг [код] можете поставить? Нечитаемо. А лучше [PHP] - тогда немного цветов появится, парсить полегче будет...
Сообщение от ibro30
|
SPCR = 0; //Обнулить регистр SPCR
|
зачем писать такие бесполезные комментарии - и так понятно, что нуль записывается в SPCR. Написали бы уж "обнулить SPI Control Register", так хоть понятно будет его назначение.
Если так и написано:
То у вас тут идёт запись в порт, компилятор не предупреждает? Советую обращать внимание на предупреждения.
Окончание передачи надо смотреть по флагу 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;
}
|
|
|
|
|
27.04.2017, 11:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,070
Сказал спасибо: 3,052
Сказали Спасибо 3,224 раз(а) в 2,188 сообщении(ях)
|
Re: Простенький вопрос по SPI и две ATMEGA8
Помимо все уже указанного - а в чём вопрос-то? В этом?
Сообщение от ibro30
|
Правда при запуске в протеусе всё стопорится почему-то на SS... мистика))
|
Что значит "стопорится на SS"? У ведущего или ведомого?
Проштудируйте раздел "SS Pin Functionality" в документации.
__________________
Экзорцист 40-го уровня.
|
|
|
|
27.04.2017, 12:06
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,388
Сказал спасибо: 1,976
Сказали Спасибо 1,331 раз(а) в 579 сообщении(ях)
|
Re: Простенький вопрос по SPI и две ATMEGA8
Напомню еще - у слейва SS должен быть притянут к земле.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
30.04.2017, 23:50
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
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);//Гасим светодиод
}
}
}
|
|
|
|
|
30.04.2017, 23:51
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Простенький вопрос по SPI и две ATMEGA8
МВА, я точно вставлял нормальный код, но без тегов. что и требовалось доказать.
|
|
|
|
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
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Простенький вопрос по SPI и две ATMEGA8
МВА, да, я тоже вот только и заметил, когда ответ тут стал писать. Это форумный движок не выкидывает подозрительное (как он может сделать, чтобы не пропускать какие-нибудь XSS и тому подобное), а просто не отображает в обычном режиме.
PS: плохо, что предварительный просмотр отображает не совсем так, как будет выглядеть...
Последний раз редактировалось H4LF; 01.05.2017 в 15:02.
Причина: PS
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:02.
|
|