Easyelectronics.ru

Электроника для всех
Текущее время: 12 дек 2018, 15:34

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




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: AtMega8 SPI отправить строку.
СообщениеДобавлено: 19 фев 2018, 15:16 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
Здравствуйте. Помогите пожалуйста начинающему. Дело в том что мне нужно отправить через интерфейс SPI строки типа Go, Stop, Left и тд. Но не могу сообразить как осуществить. Вот код отправки байта, взят с этого сайта.
Show


Вложения:
Снимок.PNG
Снимок.PNG [ 29.18 Кб | Просмотров: 1389 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 19 фев 2018, 16:14 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 01 дек 2013, 18:06
Сообщения: 163
Откуда: г. Волгоград.
Сам столкнулся с такой проблемой - аппаратный SPI на 8й меге в железе работает а при моделировании в протеусе нет (версия 8,6 SP2) так же не работает и MAX7219. Пробуйте в железе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 19 фев 2018, 16:49 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
losevew писал(а):
Сам столкнулся с такой проблемой - аппаратный SPI на 8й меге в железе работает а при моделировании в протеусе нет (версия 8,6 SP2) так же не работает и MAX7219. Пробуйте в железе.

Отправить байт и считать её у меня получается. Я не могу понять как отправлять строки :(


Вложения:
Снимок2.PNG
Снимок2.PNG [ 35.36 Кб | Просмотров: 1371 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 19 фев 2018, 17:25 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3059
Код:
void SPI_Send_string(const char * data){while (*data) SPI_Send_byte(*data++);}

ну и дергание CS логичнее тогда вынести из SPI_Send_byte в SPI_Send_string


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 19 фев 2018, 19:17 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
_pv писал(а):
Код:
void SPI_Send_string(const char * data){while (*data) SPI_Send_byte(*data++);}

ну и дергание CS логичнее тогда вынести из SPI_Send_byte в SPI_Send_string

Вы имеете в виду сделать?:
Код:
#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

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
}

void SPI_Send_string(const char * data){while (*data) SPI_Send_byte(*data++);}


int main(void)
{
   PORTC=0xFF;
   DDRC=0x00;
SPI_Init();
SPI_Send_string('Goo');
while(1)
{

}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 15:51 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
_pv писал(а):
Код:
void SPI_Send_string(const char * data){while (*data) SPI_Send_byte(*data++);}

ну и дергание CS логичнее тогда вынести из SPI_Send_byte в SPI_Send_string

Здравствуйте.
Пытаюсь передать строку. Но у меня почему то появляется только первая буква. Подскажите пожалуйста, где ошибка?
Код мастера:
Код:
#define F_CPU 8000000UL

#include
#include

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_String ( unsigned char str[])
{
PORTB &=~(1<<PB2); //Установить "0" на линии SS
unsigned char i=0;

while (str[i]!='\0') // Пока текущий символ не конец строки
{
SPDR = str[i]; //Отправить символ(байт)
while(!(SPSR&(1<<SPIF))) ; //Дождаться окончания передачи

i++; //Перейти к следующему
}

PORTB |=(1<<PB2); //Установить "1" на линии SS
}

int main(void)
{
SPI_Init();
SPI_Send_String("MKPROG.RU");

while(1)
{

};
}

Код ведомого:
Код:
#define F_CPU 8000000UL

#include
#include
#include
#include
#include
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)
{
char t=SPDR;
lcd_init_4d();
lcd_write_character_4d(t);

if(t=='G')
{
PORTC=0x01;
}
return ;
}

int main(void)
{
DDRC=0x01;
PORTC=0x00;
sei();
SPI_Init_Slave();
while(1)
{

}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 16:29 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 577
Откуда: GMT+6
Вы в ведомом очищаете дисплей функцией
Код:
lcd_init_4d();
, перенесите ее в main. А в мастере дождитесь инициализации дисплея ведомого (примерно 0,5 сек.), и только потом отправляйте строку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 17:01 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
Kelvin писал(а):
Вы в ведомом очищаете дисплей функцией
Код:
lcd_init_4d();
, перенесите ее в main. А в мастере дождитесь инициализации дисплея ведомого (примерно 0,5 сек.), и только потом отправляйте строку.

Спасибо что откликнулись.
Я пытался перенесите в main файл
Код:
lcd_init_4d();
, в этом случаи у меня вообще пропадает всё на дисплее.
если пишу
Код:
lcd_write_character_4d(t);
то на дисплее первая буква.
Пишу
Код:
lcd_write_string_4d("Hello World!");
на дисплее все буквы.
Пишу
Код:
lcd_write_string_4d(t);
на дисплее пусто.

Мозги уже себе сломал. Я только учу программирование и похоже не всё понимаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 17:49 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
Kelvin писал(а):
Вы в ведомом очищаете дисплей функцией
Код:
lcd_init_4d();
, перенесите ее в main. А в мастере дождитесь инициализации дисплея ведомого (примерно 0,5 сек.), и только потом отправляйте строку.

Так же получаю сообщение [AVR SPI] Переполнение данных - полученные данные теряются .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 17:57 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 577
Откуда: GMT+6
Azerhud писал(а):
Код:
lcd_write_string_4d(t);

Вы видимо пытаетесь записать строку, не заканчивающуюся нулём, попробуйте к строке t добавить в конец '\0'.

Azerhud писал(а):
Так же получаю сообщение [AVR SPI] Переполнение данных - полученные данные теряются .

Значит не дождались инициализации дисплея ведомого.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 20:37 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
Kelvin писал(а):
....

Спасибо за помощь. Почти всё получилось.
Код мастера:
Show

Код ведомого:
Show

Но появилась не большая проблема которую не получается решить.
С мастера отправляю:
Код:
SPI_Send_String("Go");

В ведомом считываю и вывожу на дисплей:
Код:
ISR(SPI_STC_vect)
{
   unsigned char *data;
   *data=SPDR;

lcd_write_string_4d(data++);
   
if(SPDR =="Go")
   {
      PORTC=0x01;
      }
   return ;
}

По ходу "включаю" светодиод
Код:
if(SPDR =="Go")
   {
      PORTC=0x01;
      }

И здесь у меня проблема.
Если с мастера отправляю только букву G, а в условии на ведомом зада. только одну букву
Код:
if(SPDR =="G")
   {
      PORTC=0x01;
      }

то нет пробоем, светодиод включается, но если отправляю две буквы типа
Код:
Go
и в условии ведомого задаю
Код:
if(SPDR =="Go")....
, светодиод не включается, посоветуйте пожалуйста решение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 21:18 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3059
strstr()


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 23 фев 2018, 23:42 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2012, 02:14
Сообщения: 685
Откуда: Вiльна та самостiйна Баварiя
Код:
if(SPDR =="Go")....
Я на Си не программирую, но здается мне, что здесь имеет место несовпадение размерности.
SPDR есть 8-битный регистр, в котором может находиться только один символ.
Строка "Go" - это уже два символа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 00:58 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 868
Fahivec писал(а):
Строка "Go" - это уже два символа.
три же, вроде... но в любом случае, сколько бы ни было в двойных кавычках, такое сравнение никуда не годится. Вообще-то компилятор должен выдавать предупреждения на такое (сравнение между целым и указателем, и что-то ещё).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 08:15 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
h4lf писал(а):
Fahivec писал(а):
Строка "Go" - это уже два символа.
три же, вроде... но в любом случае, сколько бы ни было в двойных кавычках, такое сравнение никуда не годится. Вообще-то компилятор должен выдавать предупреждения на такое (сравнение между целым и указателем, и что-то ещё).

Действительно, получаю кучу сообщений. Но не могу избавится от них.
Вложение:
Снимок.PNG
Снимок.PNG [ 14.08 Кб | Просмотров: 1056 ]

Избавился от них путём замены unsigned char на просто char.
Теперь предупреждений нет.


Вложения:
Снимок2.PNG
Снимок2.PNG [ 11.26 Кб | Просмотров: 1055 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 09:45 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 577
Вы программу пишете или с варнингами боретесь? Правильная программа сама от варнингов избавится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 09:58 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
VladislavS писал(а):
Вы программу пишете или с варнингами боретесь? Правильная программа сама от варнингов избавится.

Пытаюсь написать программу. Но пошли варнинги, попутно и от них избавляюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 10:18 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 577
Единственный совет - ДУМАТЬ что делает каждая написанная вами лексема. Например, "сравниваем переменную типа unsigned char со стоковой константой". Что будет в результате? Этого ли вы хотели? И так по началу с каждым кусочком кода. С опытом какие-то лексемы будет употреблять на автомате не думая, но это "не думая" будет основано на приобретённом ранее опыте.

А варнинги не для того чтобы от них избавляться, а чтобы обратить внимание на какие-то неоднозначности (непонятки) в коде и указать компилятору что же вы реально хотели.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 10:33 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2536
Откуда: Санкт-Петербург
Я бы посоветовал на время отложить в сторону микроконтроллер и взять в руки учебник по C (и какой-нибудь компилятор на PC, в котором можно тренироваться).
Просто ошибки уж больно характерные: путаете символы и строки, пытаетесь сравнивать строки через == (сравниваются указатели)... Это - незнание особенностей языка, и оно будет мешать разбираться с мк. Лучше вначале изучить язык, а потом уж взяться за мк.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 11:14 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
aamonster писал(а):
Я бы посоветовал на время отложить в сторону микроконтроллер и взять в руки учебник по C (и какой-нибудь компилятор на PC, в котором можно тренироваться).
Просто ошибки уж больно характерные: путаете символы и строки, пытаетесь сравнивать строки через == (сравниваются указатели)... Это - незнание особенностей языка, и оно будет мешать разбираться с мк. Лучше вначале изучить язык, а потом уж взяться за мк.

Спасибо за советы и отзывы. Я в принципе так и делаю. В данный момент читаю Прокопенко В.С. и пытаюсь понять кто к чему. Для закрепления материала я пытаюсь довести до конца произвольно выбранный проект и на нём отработать все нюансы.
Конкретно по этому проекту:
1. Передать символ из мастера ведомому и отобразить на LCD
2. Передать строку из мастера ведомому и отобразить на LCD
3. Получить от мастера определённые символы в строке типа "Go", "Stop" и тд и включить/выключить светодиоды.
4. Отправлять при помощи кнопок из мастера строки типа "Go", "Stop" и тд.
5. Подключить к мастеру и ведомому радиомодуль nrf24l01 и осуществить приём передачу.
7... Новый проект по созданию радиоуправляемой модели на Atmega и nrf24l01


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 11:27 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 577
Для осуществления задуманного вам прямо сейчас стоит изучить то что скрыто за #include <string.h> : strcmp(), strcpy(), strstr() и т.д.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 24 фев 2018, 13:50 
Старожил

Зарегистрирован: 18 июл 2016, 21:17
Сообщения: 746
Можно передавать команды не в текстовом, а в цифровом виде. Например 1- Go, 2-Stop и т.д.
Один байт передавать и принимать вы уже умеете, так что все должно получиться. А если хотите передавать несколько байт, то после приема первого байта, надо уходить на прием второго и т.д. Заносить их в массив, а потом анализировать его.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 25 фев 2018, 19:12 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
bw429 писал(а):
Можно передавать команды не в текстовом, а в цифровом виде. Например 1- Go, 2-Stop и т.д.
Один байт передавать и принимать вы уже умеете, так что все должно получиться. А если хотите передавать несколько байт, то после приема первого байта, надо уходить на прием второго и т.д. Заносить их в массив, а потом анализировать его.

Спасибо за совет. Но дело в том что я будущем планирую соединение двух микроконтроллеров через радиомодуль. И таких схем будет больше двух и если во всех них я буду использовать только цифры то при совпадении они будут мешать друг другу. Сами строки сейчас не важны, в будущем я заменю к примеру на 7XA2 и тд и тп.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 25 фев 2018, 19:22 
Только пришел

Зарегистрирован: 07 окт 2016, 07:02
Сообщения: 17
что я не могу понять, так это что конструкция:
Код:
 
char str1[10]="AAA";
char str2[10]="AAA";
 
   // Сравниваем первые пять символов двух строк
   if (strncmp (str1, str2,5)==0)
     {.......


работает.
A так не работает:
Код:
ISR(SPI_STC_vect)
   {
      char data[10];
      *data=SPDR;
         lcd_write_string_4d(data);
   
char str1=*data;
char str2[10]="AAA";
 
   // Сравниваем первые пять символов двух строк
   if (strncmp (str1, str2,5)==0)
     { ..........
 
   }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AtMega8 SPI отправить строку.
СообщениеДобавлено: 25 фев 2018, 21:03 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3059
*data = SPDR это тоже самое что и data[0] = SPDR
а что же там лежит в data[1], data[2] и т.д.? учитывая что data[10] - локальная неинициализированная переменная


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2  След.

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


Кто сейчас на конференции

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


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB