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

Обсуждаем контроллеры компании Atmel.
N.guest
Родился
Сообщения: 1
Зарегистрирован: Сб июл 03, 2021 05:10:15

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

Сообщение N.guest »

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

В общем есть проект в 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 и внутри функции?
Михаил_avr
Встал на лапы
Сообщения: 80
Зарегистрирован: Вс фев 21, 2021 13:01:40
Откуда: Прокопьевск

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

Сообщение Михаил_avr »

[uquote="N.guest",url="/forum/viewtopic.php?p=4055927#p4055927"]Внутри функции #define не видим - вылезает ошибка.[/uquote]
Странно в функции тоже дефайны должны работать. А вы файлы эти с функциями и дефайнами куда подключаете? Попробуйте в файл с функциями подключить файл с дефайнами, а файл с функциями в проект.
Аватара пользователя
Рязанцев Владислав
Мудрый кот
Сообщения: 1781
Зарегистрирован: Пн июн 24, 2013 23:00:42
Откуда: Казахстан

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

Сообщение Рязанцев Владислав »

Очевидно функция пытается скомпилироваться раньше чем были приняты дефайны. Если они вообще приложены. Либо переносите их содержимое перед функциями.
Что значит несколько? С одинаковым именем?
Изображение
Ваши хотелки за ваши деньги
Михаил_avr
Встал на лапы
Сообщения: 80
Зарегистрирован: Вс фев 21, 2021 13:01:40
Откуда: Прокопьевск

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

Сообщение Михаил_avr »

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

Добавлено after 31 second:
Попробуйте сначала Def. h
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

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

Сообщение parovoZZ »

В общем есть проект в Atmel Studio. В том проекте несколько файлов DEF.h
Они в солюшн эксплорере добавлены к проекту?
A^ex
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 26, 2020 00:07:28

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

Сообщение A^ex »

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

если не трудно объясните,что нужно дописать,
или скиньте ссылку на эту тему.
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

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

Сообщение radteh »

Ну так вызывай свою функцию GSM_Send_Msg в основном коде. Первый параметр это номер телефона, а второй текст. Только учти что на латинице можно отправить только 160 символов, а на других языках сначала нужно текст перекодировать и получить ограничение 70 символов (кроме немецкого и французского, там 140 символов).
A^ex
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 26, 2020 00:07:28

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

Сообщение A^ex »

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

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

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]");

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

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


}
ST7FOX
Мучитель микросхем
Сообщения: 402
Зарегистрирован: Сб июл 10, 2021 19:33:25

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

Сообщение ST7FOX »

radteh писал(а):Первый параметр это номер телефона, а второй текст.
Неверно.

Код: Выделить всё

void GSM_Send_Msg(char *num,char *sms)
Первый и второй параметры - указатели.

A^ex, https://metanit.com/cpp/c/5.7.php
A^ex
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 26, 2020 00:07:28

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

Сообщение A^ex »

ST7FOX, спасибо ! перешёл по ссылке, всё чётко и понятно расписано!
A^ex
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 26, 2020 00:07:28

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

Сообщение A^ex »

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


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"
в какое направление копать?
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

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

Сообщение slav0n »

с таким оформлением твой код никто изучать не будет
ohmycode!
primuss3.com
A^ex
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 26, 2020 00:07:28

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

Сообщение A^ex »

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] глобальные.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

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

Сообщение slav0n »

ОТСТУПЫ
вот, пропустил твой код через "украшатель" https://beautifier.io/?without-codemirror
Спойлер

Код: Выделить всё

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));
} 
Последний раз редактировалось slav0n Сб июл 31, 2021 17:59:44, всего редактировалось 1 раз.
ohmycode!
primuss3.com
A^ex
Родился
Сообщения: 19
Зарегистрирован: Чт ноя 26, 2020 00:07:28

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

Сообщение A^ex »

Красиво!теперь понятно,спасибо slav0n !
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

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

Сообщение radteh »

А если вместо тега

Код: Выделить всё

 применить [code=php] то ещё и синтаксис подсветится. И длинные портянки лучше прятать под спойлер.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

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

Сообщение slav0n »

OK
ohmycode!
primuss3.com
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

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

Сообщение radteh »

A^ex, меня смущает вот этот кусочек кода:

Код: Выделить всё

        while (buff[buffer_pointer] != '\r') //Принятое сообщение о балансе SIM из буфера//
        {
            msg_location[buffer_dannye] = buff[buffer_pointer++];
        }
Ты каждый раз, одному и тому-же элементу массива msg_location присваиваешь новое значение. Так-же ты проверяешь один элемент, а присваиваешь следующий.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

radteh, инкремент номера элемента (++) делается ПОСЛЕ присваивания, а не до него.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
ST7FOX
Мучитель микросхем
Сообщения: 402
Зарегистрирован: Сб июл 10, 2021 19:33:25

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

Сообщение ST7FOX »

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

Вернуться в «AVR»