Обсуждаем контроллеры компании Atmel.
Ответить

Вопрос по программированию МК AVR

Сб июл 03, 2021 05:22:23

Доброго времении суток уважаемые Котаны и Котанки, также Котанята)) Вопрос мой наверное самый Тупой, но ....

В общем есть проект в Atmel Studio. В том проекте несколько файлов DEF.h - где собраны все #дефайны, funct.h с функциями.

Код:
#define SSD1306_DISPLAYON                    0xAF



а в файле с функциями:
Код:
void LCD_Sleep(char set)
{
 ....
  if(set==1){LCD_Commmand(COMAND,SSD1306_DISPLAYON);}
}


Внутри функции #define не видим - вылезает ошибка. Можно ли как то сделать так чтобы можно было пользоваться этим #define и внутри функции?

Re: Вопрос по программированию МК AVR

Сб июл 03, 2021 17:34:40

Внутри функции #define не видим - вылезает ошибка.

Странно в функции тоже дефайны должны работать. А вы файлы эти с функциями и дефайнами куда подключаете? Попробуйте в файл с функциями подключить файл с дефайнами, а файл с функциями в проект.

Re: Вопрос по программированию МК AVR

Сб июл 03, 2021 17:41:46

Очевидно функция пытается скомпилироваться раньше чем были приняты дефайны. Если они вообще приложены. Либо переносите их содержимое перед функциями.
Что значит несколько? С одинаковым именем?

Re: Вопрос по программированию МК AVR

Сб июл 03, 2021 17:48:54

А вы как файлы подключали
#include <func. h> а затем #include <Def. h> или наоборот (какой первым подключали>

Добавлено after 31 second:
Попробуйте сначала Def. h

Re: Вопрос по программированию МК AVR

Вс июл 04, 2021 00:21:36

В общем есть проект в Atmel Studio. В том проекте несколько файлов DEF.h

Они в солюшн эксплорере добавлены к проекту?

Re: Вопрос по программированию МК AVR

Вт июл 27, 2021 11:49:44

Добрый день,у меня тоже вопрос по программированию МК в Atmel studio.
Вопрос такой:интересует алгоритм написания функции для МК AVR 32,
отправка показаний датчика через GSM модуль (SIM800C) по СМС на мобильник,
например:напряжение с АЦП(зарядное для акб.),
или запрос с мобильного баланса GSM модуля,
есть функция отправки смс с заранее написанными смс,
не могу понять как переделать функцию ,чтобы отправлять по смс ,
постоянно меняющиеся данные с датчика или запрос о балансе,
вот функция USART
void USART_SendString(char *str) /* Отправить строку функции данных USART */
{
int i=0;
while (str[i]!=0)
{
USART_TxChar(str[i]); /* Отправить каждый символ строки до NULL */
i++;
}
}

вот функция отправки смс:
void GSM_Send_Msg(char *num,char *sms)
{
char sms_buffer[35];
buffer_pointer=0;
sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
USART_SendString(sms_buffer); //*отправить команду AT+CMGS="Mobile No."\r */

while(1)
{
if(buff[buffer_pointer]==0x3e) //*ждать символа '>'*/
{
LCD_String_xy(1,0,"OTPRAVL1");
_delay_ms(3000);
LCD_Clear();
buffer_pointer = 0;
memset(buff,0,strlen(buff));
USART_SendString(sms); //* отправить сообщение на указанный nom. */
USART_TxChar(26);
USART_TxChar(0); //* отправьте Ctrl + Z, тогда будет передаваться только сообщение*/
break;
}
buffer_pointer++;
}

buffer_pointer = 0;
memset(buff,0,strlen(buff));
memset(sms_buffer,0,strlen(sms_buffer));
}

если не трудно объясните,что нужно дописать,
или скиньте ссылку на эту тему.

Re: Вопрос по программированию МК AVR

Ср июл 28, 2021 03:16:41

Ну так вызывай свою функцию GSM_Send_Msg в основном коде. Первый параметр это номер телефона, а второй текст. Только учти что на латинице можно отправить только 160 символов, а на других языках сначала нужно текст перекодировать и получить ограничение 70 символов (кроме немецкого и французского, там 140 символов).

Re: Вопрос по программированию МК AVR

Ср июл 28, 2021 10:50:20

Не много уточню вопрос.

вот функция запроса баланса:

void GSM_Balans_Out()
{

USART_SendString("AT+CUSD=1,\"#100#\"\r"); //AT_команда модулю, проверка баланса SIM
_delay_ms(3000); //Пауза для ответа модуля

int out=0;
_delay_ms(500);
buffer_pointer=0;
buffer_dannye=0;
while(1)
{

if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== '\n') //*исключить "\ r \ n", который является началом строки */
{

buffer_pointer++;
}
else
break;
}

LCD_String_xy(1,0,""); //LCD дисплей 1-строка,0-ячейка ответ о балансе//

if(strstr(buff,"+CUSD:")) //* "+CUSD:" чтобы проверить, получено ли сообщение "Balans_" * /
{

while(buff[buffer_pointer]!= ',')
{
buffer_pointer++;
}
buffer_pointer++;




while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{

msg_location[buffer_dannye]=buff[buffer_pointer];
buffer_pointer++;
buffer_dannye++;
LCD_Char(msg_location[buffer_dannye+2]); //Выводит текс на экран дисплея//

}

memset(buff,0,strlen(buff)); //* преобразовать строку позиции в целочисленное значение */
buffer_pointer=0;


}
status_flag = 0;

GSM_Send_Msg("+7987******", " msg_location[buffer_dannye]");

Вопрос как передать по смс данные из буфера,а не название буфера? :)

//=======================//


}

Re: Вопрос по программированию МК AVR

Ср июл 28, 2021 11:10:21

radteh писал(а):Первый параметр это номер телефона, а второй текст.
Неверно.
Код:
void GSM_Send_Msg(char *num,char *sms)
Первый и второй параметры - указатели.

A^ex, https://metanit.com/cpp/c/5.7.php

Re: Вопрос по программированию МК AVR

Ср июл 28, 2021 11:41:48

ST7FOX, спасибо ! перешёл по ссылке, всё чётко и понятно расписано!

Re: Вопрос по программированию МК AVR

Пт июл 30, 2021 22:58:32

Всем доброго времени.
Подскажите где ошибка в коде:


void USART_TxChar(char data) /* Функция передачи данных */
{
UDR = data /* Запись данных для передачи в UDR */
while (!(UCSRA & (1<<UDRE))); /* Подождите, пока передача данных и буфер не опустеют */
}

void GSM_Balans_Msg()
{
USART_SendString("AT+CUSD=1,\"#100#\"\r"); //AT_команда модулю, проверка баланса SIM
_delay_ms(3000); //Пауза для ответа модуля

buffer_pointer=0;
buffer_dannye=0;

while(1)
{

if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== '\n') //*исключить "\ r \ n", который является началом строки */
{

buffer_pointer++;
}
else
break;
}

if(strstr(buff,"+CUSD:")) //* "+CUSD:" чтобы проверить, получено ли сообщение "Balans_" * /
{

while(buff[buffer_pointer]!= ',')
{
buffer_pointer++;
}
buffer_pointer++;

while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{
msg_location[buffer_dannye]=buff[buffer_pointer++];

}
memset(buff,0,strlen(buff)); //* преобразовать строку позиции в целочисленное значение */
buffer_pointer=0;
status_flag = 0;

}
PORTA|=(1<<2);
_delay_ms(1000);

char num[14]={"+79*********"};
char sms_buffer[35];
buffer_pointer=0;

sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
USART_SendString(sms_buffer); //*отправить команду AT+CMGS="Mobile No."\r */
_delay_ms(200);

while(1)
{
if(buff[buffer_pointer]==0x3e) //*ждать символа '>'*/
{

//LCD_String_xy(1,0,"OTPRAVL1");
//_delay_ms(3000);
//LCD_Clear();
buffer_pointer = 0;
memset(buff,0,strlen(buff));
while(1)
{
buff[buffer_pointer]=msg_location[buffer_dannye++];

USART_TxChar(buff[buffer_pointer]);

if(buff[buffer_pointer]!= '\r')
{
USART_TxChar(0x1a); //*. Ctrl + Z */
break;
}
buffer_pointer++;
}

}
buffer_pointer++;
}

buffer_pointer = 0;
memset(buff,0,strlen(buff));
}

Код работает,смс приходит,но приходит постоянно одна цифра 5 и всё,
откуда цифра 5 берётся?
судя по функции: if(buff[buffer_pointer]!= '\r') данные с балансом там есть,
отправлял в терминал USART_TxChar(buff[buffer_pointer])
в терминале всё как положено:"Balance:27,35r"
в какое направление копать?

Re: Вопрос по программированию МК AVR

Сб июл 31, 2021 06:39:11

с таким оформлением твой код никто изучать не будет

Re: Вопрос по программированию МК AVR

Сб июл 31, 2021 13:15:59

slav0n,а что не так с оформлением кода,а как надо оформлять?
напишите пример оформления кода.
Это часть программы.
нашёл причину, в коде теряются данные

while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{

msg_location[buffer_dannye]=buff[buffer_pointer++];

}

оба буфера и переменные глобальные.
msg_location[buffer_dannye] до отправления в USART не обнуляю,

если записать:

while(buff[buffer_pointer]!= '\r') //Принятое сообщение о балансе SIM из буфера//
{

msg_location[buffer_dannye]=buff[buffer_pointer++];
USART_TxChar( msg_location[buffer_dannye]);

}

данные приходят,отладчика к сожалению нет,поэтому пользуюсь терминалом.

Вопрос по существу как сохранить данные в массиве,что бы не терялись даже после выхода из функции?
Повторю msg_location[buffer_dannye] и buff[buffer_pointer] глобальные.

Re: Вопрос по программированию МК AVR

Сб июл 31, 2021 14:13:30

ОТСТУПЫ
вот, пропустил твой код через "украшатель" https://beautifier.io/?without-codemirror
Последний раз редактировалось slav0n Сб июл 31, 2021 17:59:44, всего редактировалось 1 раз.

Re: Вопрос по программированию МК AVR

Сб июл 31, 2021 14:27:45

Красиво!теперь понятно,спасибо slav0n !

Re: Вопрос по программированию МК AVR

Сб июл 31, 2021 17:45:48

А если вместо тега [code] применить [code=php] то ещё и синтаксис подсветится. И длинные портянки лучше прятать под спойлер.

Re: Вопрос по программированию МК AVR

Сб июл 31, 2021 18:00:10

OK

Re: Вопрос по программированию МК AVR

Пн авг 02, 2021 03:45:03

A^ex, меня смущает вот этот кусочек кода:
Код:
        while (buff[buffer_pointer] != '\r') //Принятое сообщение о балансе SIM из буфера//
        {
            msg_location[buffer_dannye] = buff[buffer_pointer++];
        }

Ты каждый раз, одному и тому-же элементу массива msg_location присваиваешь новое значение. Так-же ты проверяешь один элемент, а присваиваешь следующий.

Re: Вопрос по программированию МК AVR

Пн авг 02, 2021 08:58:25

radteh, инкремент номера элемента (++) делается ПОСЛЕ присваивания, а не до него.

Re: Вопрос по программированию МК AVR

Пн авг 02, 2021 10:23:35

Starichok51, да хоть до, хоть после, хоть оба сразу. Счётчик buffer_dannye не меняется.
Ответить