Например TDA7294

Форум РадиоКот • Просмотр темы - BT201 последовательность комманд
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт сен 27, 2024 02:36:48

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 89 ]    , , 3, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пт май 24, 2024 21:15:19 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
Asmodey, По крайней мере у меня только так получается. Вне цикла с массива информацию не вытянуть. В своё время я долго с этим мучался. По итогу решил отказаться от массива и сделать несколько переменных.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пт май 24, 2024 21:31:56 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Что ж, тогда увы. Рискну посоветовать выбрать другое хобби (о профессии в данном случае речи и быть не может). Например, только паять-пилить-крутить, а программировать просить программистов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пт май 24, 2024 22:18:02 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
Martian, Так что же всё таки по поводу приёма данных. Вот мне главное с этим разобраться. Потому как это очень нужно.
А программировать никто не будет не от кого не дождёшься. Я итак уже два месяца ждал чтоб кто нибудь взялся за написание прошивки к этому модулю, но по итогу пришлось делать всё самому. Да и всё равно программировать по не многу нужно. Потому как в наше время это очень облегчает схемы. А с электроники я всё равно не уйду по крайней мере пока ближайшие несколько лет.

Это хорошо ещё было как то договорился один раз радиоприёмник мне на 8 меге написали. Я только сказал что мне конкретно нужно было и всё, но с этим модулем никто не хочет работать и писать прошивку под него.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Сб май 25, 2024 00:30:44 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Ну, я не могу ответить по приёму данных. Посмотрел лишь частный случай, из последних сообщений. Не вижу всей картины. Ща посмотрю.

Добавлено after 56 minutes 16 seconds:
Немного подправил. Код стал в два раза меньше. Вряд ли заработает сразу. Посмотрите. Оптимизируйте как это я сделал, там, где я не сделал. Обратите внимание, что многие места одинаковы, а значит, можно вынести в функцию. Заставьте это снова работать, как было до оптимизации. И обязательно разберитесь с _delay, мне сложно поверить, что они нужны, например, здесь:

Код:
char i = 0;
        if (rx_buf[i] == 'M')
        {
            i++;
            if (rx_buf[i] == '1')
            {
                // M1 Номер текущего файла
                long dec = CharToInt(rx_buf[3]);
                _delay_us(1);
                for (uint8_t x = 4; x < 11; x++)
                {                     
                    dec = dec * 16 + CharToInt(rx_buf[x]);
                    _delay_us(1);
                }


Добавлено after 1 hour 10 minutes 15 seconds:
Код:
char CharToDec(unsigned int s)
{
    unsigned int dec_chl = 0;
    dek = s % 10;
    def = s / 10;
    for (uint8_t i = 0; i < 8; i++)
    {
        ind[i] = dek + 48;
        dek = def % 10;
        def = def / 10;
    }
    return dec_chl;
}

Зачем здесь dec_chl? зачем CharToDec() возвращает результат, если ни где потом он не используется, функция вызывается трижды просто CharToDec(dec);?
Нужны ли dek и def глобально? Сомневаюсь.

далее:
Код:
// Конвертируем значение уровня звука в ASCII
    vol = 15;
    dek = vol % 10;
    def = vol / 10;
    ind[0] = dek + 48;
    dek = def % 10;
    def = def / 10;
    ind[1] = dek + 48;

сравните с этим вариантом:
Код:
// Конвертируем значение уровня звука в ASCII
    vol = 15;
    ind[0] = 5 + 48;
    ind[1] = 1 + 48;


Ок, оптимизировали, но смотрим дальше, теперь код такой:

Код:
    // Конвертируем значение уровня звука в ASCII
    vol = 15;
    ind[0] = 1 + 48;
    ind[1] = 5 + 48;

    // Выводим на дисплей уровень звука
    lcd_pos(0, 11);
    lcd_str("VOL");
    lcd_pos(0, 14);
    send_byte(ind[1], 1);
    lcd_pos(0, 15);
    send_byte(ind[0], 1);

И снова возникает вопрос: если нигде больше эти значения первых двух элементов массива не используются, то разве не лучше сделать так:
Код:
    vol = 15;
    // Выводим на дисплей уровень звука
    lcd_pos(0, 11);
    lcd_str("VOL");
    lcd_pos(0, 14);
    send_byte(53, 1);// вывод "5"
    lcd_pos(0, 15);
    send_byte(49, 1); // вывод "1"

Можно ли ещё оптимизировать? Конечно!

Код:
    vol = 15;
    // Выводим на дисплей уровень звука
    lcd_pos(0, 11);
    lcd_str("VOL 15");


Ещё:

Код:
if (rx_buf[i] == 'M')
            {
                // QM Режим работы плеера
                if (rx_buf[4] == 1)
                {
                    // Блютус
                    lcd_pos(0, 13);
                    lcd_str("BLE");

                    LED1_R1;
                    LED1_G0;
                    LED1_B0;
                    _delay_ms(300);
                }
                if (rx_buf[4] == 2)
                {
                    // USB Flash
                    lcd_pos(0, 13);
                    lcd_str("USB");

                    LED1_R0;
                    LED1_G1;
                    LED1_B0;
                    _delay_ms(300);
                }
                if (rx_buf[4] == 3)
                {
                    // SD Card
                    lcd_pos(0, 13);
                    lcd_str(" SD");

                    LED1_R0;
                    LED1_G0;
                    LED1_B1;
                    _delay_ms(300);
                }
            }


Наверняка можно так (не зная алгоритма, невозможно сказать точно, могут ли быть ещё состояния):
Код:
if (rx_buf[i] == 'M') // QM Режим работы плеера
            {               
                LED1_R0; LED1_G0; LED1_B0;               
                lcd_pos(0, 13);
                switch (rx_buf[4])
                {
                    case 1 :
                        lcd_str("BLE"); LED1_R1;
                        break;
                    case 2 :
                        lcd_str("USB"); LED1_G1;
                        break;
                    case 3 :
                        lcd_str(" SD"); LED1_B1;
                        break;
                }
                _delay_ms(300);
            }

Видите разницу? Я ухудшил читаемость, расположив несколько операторов на одной строке, но мой вариант всё равно читается значительно лучше!

Так что, приводите код в порядок. Берите книжку по Си, здесь в "Сундуке" их куча, и причёсывайте. С нормальным кодом помочь с алгоритмом желающих будет намного больше, но скорее всего, вопрос сам собой отпадёт: Вы сами увидите, что необходимо сделать.

И изучите структуры. Хранить громкость, режим, имя трека, его длительность и т.д. в них намного удобнее и проще. Такой код:
Код:
if (rx_buf[i] == 'Q')
{
    i++;
    if (rx_buf[i] == 'M') // QM Режим работы плеера

превратился бы в
Код:
if (Player.Mode == QM)
{


Вложения:
main.h [1.53 KiB]
Скачиваний: 25
main.c [15.78 KiB]
Скачиваний: 24
Вернуться наверх
 
Материалы вебинара «Пленочные конденсаторы Hongfa для источников питания и силовой электроники»

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Сб май 25, 2024 06:30:33 
Это не хвост, это антенна

Карма: 10
Рейтинг сообщений: 87
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1446
Откуда: Мелеуз
Рейтинг сообщения: 0
Tifaso Я тебе готовый код дал на том форуме,страница 32
И не надо врать-тебе многие помогали,но ты сам начинал-я так не хочу,я так не буду делать,у меня так не работает и т д и т п
Выше я тебе написал-убери задержки,тебе пофиг,тогда что толку советовать? Пока идёт задержка 300 мсек все пакеты летят мимо и в итоге у тебя просто будет не успевать обрабатывать


Вернуться наверх
 
Помехоподавляющие пленочные конденсаторы Hongfa для бытовых и промышленных сетей

Компания Hongfa - один из лидеров азиатского рынка пленочных конденсаторов с полным циклом производства. Она выпускает пять серий помехоподавляющих конденсаторов этого типа как для бытовой, так и для трехфазной промышленной сети, а также для автомобильного применения. Продукция компании по ассортименту, параметрам и количеству серий конденсаторов ЭМП не уступает другим крупным производителям этого сегмента и может легко заменить ассортимент ушедших из РФ брендов.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Сб май 25, 2024 15:43:34 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Novice user, можно ссылку на тот форум? а то, похоже, здесь просто бессмысленно...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Вс май 26, 2024 19:14:09 
Это не хвост, это антенна

Карма: 10
Рейтинг сообщений: 87
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1446
Откуда: Мелеуз
Рейтинг сообщения: 0
https://forum.cxem.net/index.php?/topic ... nt=3950867


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 11:54:07 
Сверлит текстолит когтями

Карма: -11
Рейтинг сообщений: 118
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1205
Рейтинг сообщения: 0
Novice user, можно ссылку на тот форум? а то, похоже, здесь просто бессмысленно...
Судя по тому форуму, ТС там около месяца пытался получить что-то с UART и вывести потом на LCD. При помощи целой группы неравнодушных товарищей. Но так и не добился корректного результата. Сомневаюсь что и у вас получится. :dont_know:
Как видно - ТС совершенно не изучал программирование, не понимает его, да и не желает изучать. В этом случае от любых объяснений толку не будет никакого. Только разве что если вы Д’Артаньян и полностью весь код сами за ТС напишете. :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 16:03:30 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Novice user, jcxz, да, ясненько... Тут нужен талантливый педагог, это точно не я.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 16:20:08 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 649
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3826
Рейтинг сообщения: 0
Еxel-моксель... майкрософт! С 8 марта жеж... Почти 3 месяца - четверть года :shock:

За это время какихнить Кернигана с Ритчи можно всех полностью перечитать.

_________________
Астролябия-сама меряет, было бы что мерять!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 18:47:02 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Тут, наверное, не Керниган с Ритчи нужен, а какой-то вариант Кнута для детей. После прочтения Кернигана и Ритчи у него появится более обширный инструментарий, но он будет им пользоваться всё равно абы как, не видя алгоритмов и картины в целом. Как только это исправится, начнутся возникать вопросы, как написать, и тогда пойдёт уже специфика языка


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 18:57:38 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 649
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3826
Рейтинг сообщения: 0
К слову, почему еще никто не посоветовал топикстартеру конструктор алгоритмов? Ему, и еще тому, который радиву с фонариком, часами и двустрочным дисплеем клепает.

_________________
Астролябия-сама меряет, было бы что мерять!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 19:04:25 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Дракона?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пн май 27, 2024 19:21:59 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 649
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3826
Рейтинг сообщения: 0
Я пользовался (и сейчас иногда пользуюсь) простенькой и древней прожкой Flowcharts. Но, рекомендовать ее никому не могу, она реально устарела. Сам просто привык к ней. Есть масса других, более современных программ, даже в состав MS Office что-то такое входит.

_________________
Астролябия-сама меряет, было бы что мерять!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Вт май 28, 2024 07:52:14 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
В общем убрал я задержки в приёме данных, но пока это не помогает. Нужно всё таки ещё раз посмотреть и отладить скрипты приёма данных. Похоже ещё и в них проблема. Ну что же а вот и получившийся на данный момент код.
Спойлер
Код:
#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1

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

#define MAIN_H_
#define LCD_H_

#define LCD_DDR DDRD
#define LCD_PORT PORTD
#define LCD_PIN PIND

#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA

#define BTN_DDR DDRC
#define BTN_PORT PORTC
#define BTN_PIN PINC

#define DATA 0b11110000
#define RS PD2
#define E PD3

#define E1 LCD_PORT|=(1<<E)
#define E0 LCD_PORT&=~(1<<E)

#define RS1 LCD_PORT|=(1<<RS)
#define RS0 LCD_PORT&=~(1<<RS)

#define LED1_R1 LED_PORT|=(1<<PA0)
#define LED1_R0 LED_PORT&=~(1<<PA0)

#define LED1_G1 LED_PORT|=(1<<PA1)
#define LED1_G0 LED_PORT&=~(1<<PA1)

#define LED1_B1 LED_PORT|=(1<<PA2)
#define LED1_B0 LED_PORT&=~(1<<PA2)

#define LED2_G1 LED_PORT|=(1<<PA3)
#define LED2_G0 LED_PORT&=~(1<<PA3)

#define LED2_R1 LED_PORT|=(1<<PA4)
#define LED2_R0 LED_PORT&=~(1<<PA4)

#define LED3_Y1 LED_PORT|=(1<<PA5)
#define LED3_Y0 LED_PORT&=~(1<<PA5)

#define LED4_B1 LED_PORT|=(1<<PA6)
#define LED4_B0 LED_PORT&=~(1<<PA6)

#define LED5_G1 LED_PORT|=(1<<PA7)
#define LED5_G0 LED_PORT&=~(1<<PA7)

#define BTN_PLAY_PAUSE (~PINC & (1<<PC0))
#define BTN_PREV (~PINC & (1<<PC1))
#define BTN_NEXT (~PINC & (1<<PC2))
#define BTN_VOL_MIN (~PINC & (1<<PC3))
#define BTN_VOL_PLS (~PINC & (1<<PC4))
#define BTN_RAND (~PINC & (1<<PC5))
#define BTN_REPEAT (~PINC & (1<<PC6))
#define BTN_MODE (~PINC & (1<<PC7))

#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20

char rx_buf[BUF_SIZE];
char buf_index = 0;
char rxb;

volatile start=1, flags;

uint8_t n=0;

char ind7=0;
char ind6=0;
char ind5=0;
char ind4=0;
char ind3=0;
char ind2=0;
char ind1=0;
char ind0=0;

char chl=0;

char min=0;
char sec=0;

char vol=0;
char mode=0;
char repeat=0;

unsigned int dec=0;
unsigned int def=0;
unsigned int dek=0;
unsigned int dec_chl=0;

void lcd_ini(void);
void lcd_str(char* str);
void lcd_pos(uint8_t line, uint8_t pos);
void lcd_num(uint8_t num, uint8_t line, uint8_t pos);
void bt201_start(void);

void bt201_start (void)
{
   _delay_ms(2000);
   
   //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
   Send_Command("AT+CM02\r\n");
   _delay_ms(100);
   
   //Устанавливаем значение 2 в переменной mode
   mode=2;
   
   //Команда AT+CA15 задаём модулю уровень громкости на 15
   Send_Command("AT+CA15\r\n");
   _delay_ms(100);
   
   //Конвертируем значение уровня звука в ASCII
   vol = 15;
   dek = vol%10;
   def = vol/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   
   //Выводим на дисплей уровень звука
   lcd_pos(1,11);
   lcd_str("VOL");
   lcd_pos(1,14);
   send_byte(ind1,1);
   lcd_pos(1,15);
   send_byte(ind0,1);
   
   //Команда AT+AA00 останавливаем воспроизведение
   Send_Command("AT+AA00\r\n");
   _delay_ms(100);
   
   //Команда AT+AA01 задаём модулю команду PLAY
   Send_Command("AT+AA01\r\n");
   _delay_ms(1);
}

void write(uint8_t n)
{
   n<<=4;
   E1;
   LCD_PORT&=~DATA;
   LCD_PORT|=n;
   _delay_us(1);
   E0;
}

void send_byte(uint8_t byte, uint8_t tip)
{
   if (tip) //если тип данные на линии RS 1
   {
      RS1;
   }
   else //иначе тип команда и на линии RS 0
   {
      RS0;
   }
   
   write(byte>>4); //передача старшего полубайта
   _delay_us(250);
   write(byte); //передача младшего полубайта
   _delay_us(250);
}

void lcd_ini(void)
{
   LCD_DDR|=DATA | (1<<RS) | (1<<E);
   _delay_ms(20);
   RS0;
   write(3);
   _delay_ms(5);
   write(3);
   _delay_us(150);
   write(3);
   _delay_us(50);
   write(2);
   _delay_us(50);
   
   send_byte(40,0);
   _delay_us(50);
   
   send_byte(12,0);
   _delay_us(50);
   
   send_byte(1,0);
   _delay_ms(2);
   
   send_byte(6,0);
   _delay_us(50);
}

void lcd_str(char* str)
{
   uint8_t n=0;
   while(str[n])
   {
      send_byte(str[n],1);
      n++;
   }
}

void lcd_pos(uint8_t line, uint8_t pos)
{
   uint8_t adress=(line*0x40+pos)|0x80;
   send_byte(adress,0);
   _delay_us(50);
}

void init_UART()
{
   UBRRL = UBRRL_value;
   UBRRH = UBRRL_value>>8;
   UCSRB|=(1<<TXEN);
   UCSRB|=(1<<RXEN);
   UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
   UCSRB|=(1<<RXCIE);
   sei();
   flags = 0;
}

void send_UART(char value)
{
   while(!(UCSRA&(1<<UDRE)));
   UDR=value;
}

void Send_Command(char *str)
{
   for(uint8_t i = 0; i < strlen(str); i++)
   {
      while(!(UCSRA&(1<<UDRE)));
      UDR=str[i];
   }
}

char CharToInt(char c)
{
   char chl=0;
   if ('0' <= c && c <= '9')
   {
      chl=c-48;
   }
   else if ('A' <= c && c <= 'F')
   {
      chl=c-55;
   }
   return chl;
}

char CharToDec(unsigned int s)
{
   unsigned int dec_chl=0;
   dek = s%10;
   def = s/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   dek = def%10;
   def = def/10;
   ind2 = dek+48;
   dek = def%10;
   def = def/10;
   ind3 = dek+48;
   dek = def%10;
   def = def/10;
   ind4 = dek+48;
   dek = def%10;
   def = def/10;
   ind5 = dek+48;
   dek = def%10;
   def = def/10;
   ind6 = dek+48;
   dek = def%10;
   def = def/10;
   ind7 = dek+48;
   return dec_chl;
}

char Time(unsigned int s)
{
   char min = s/60;
   char sec = s%60;
   
   dek = min%10;
   def = min/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   
   dek = sec%10;
   def = sec/10;
   ind2 = dek+48;
   dek = def%10;
   def = def/10;
   ind3 = dek+48;
   
   return min;
}

ISR(USART_RXC_vect)
{
   char rxb = UDR;
   if(!(flags & FLAG_END_RX))
   {
      rx_buf[buf_index]=rxb;
      if(rx_buf[buf_index] == 0x0D)
      {
         flags |= FLAG_END_RX;
         return;
      }
      buf_index++;
      if(buf_index >= BUF_SIZE)
      {
         buf_index = 0;
         flags |= FLAG_ERR_RX;
      }
   }
}

int main(void)
{
   BTN_PORT = 0b11111111;
   init_UART();
   lcd_ini();
   flags = 0;
   
   _delay_ms(5000);
   
   bt201_start();
   
   while(1)
    {
      char i = 0;
      if (rx_buf[i] == 'M')
      {
         i++;
         if (rx_buf[i] == '1')
         {
            dec=0;
            def=0;
            dek=0;
            
            ind7=0;
            ind6=0;
            ind5=0;
            ind4=0;
            ind3=0;
            ind2=0;
            ind1=0;
            ind0=0;
            
            //M1 Номер текущего файла
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            
            lcd_pos(1,0);
            send_byte(ind3,1);
            lcd_pos(1,1);
            send_byte(ind2,1);
            lcd_pos(1,2);
            send_byte(ind1,1);
            lcd_pos(1,3);
            send_byte(ind0,1);
            lcd_pos(1,4);
            send_byte('/',1);
         }
          else if (rx_buf[i] == '2')
         {
            dec=0;
            def=0;
            dek=0;
            
            ind7=0;
            ind6=0;
            ind5=0;
            ind4=0;
            ind3=0;
            ind2=0;
            ind1=0;
            ind0=0;
            
            //M2 Общее колличество звуковых файлов
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            
            lcd_pos(1,5);
            send_byte(ind3,1);
            lcd_pos(1,6);
            send_byte(ind2,1);
            lcd_pos(1,7);
            send_byte(ind1,1);
            lcd_pos(1,8);
            send_byte(ind0,1);
         }
          else if (rx_buf[i] == 'T')
         {
            dec=0;
            def=0;
            dek=0;
            
            ind7=0;
            ind6=0;
            ind5=0;
            ind4=0;
            ind3=0;
            ind2=0;
            ind1=0;
            ind0=0;
            
            min=0;
            sec=0;
            
            //MT Общее время воспроизведения
            
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            Time(dec);
            
            lcd_pos(0,7);
            send_byte(ind1,1);
            lcd_pos(0,8);
            send_byte(ind0,1);
            lcd_pos(0,9);
            send_byte(':',1);
            lcd_pos(0,10);
            send_byte(ind3,1);
            lcd_pos(0,11);
            send_byte(ind2,1);
         }
          else if (rx_buf[i] == 'F')
         {
            //MF Имя текущего файла
            lcd_pos(0,0);
            send_byte(rx_buf[4],1);
            lcd_pos(0,1);
            send_byte(rx_buf[5],1);
            lcd_pos(0,2);
            send_byte(rx_buf[6],1);
            lcd_pos(0,3);
            send_byte(rx_buf[7],1);
            lcd_pos(0,4);
            send_byte(rx_buf[8],1);
            lcd_pos(0,5);
            send_byte(rx_buf[9],1);
         }
         /*else if (rx_buf[i] == 'K')
         {
            //MK Время воспроизведения текущего файла
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            Time(dec);
            
            lcd_pos(0,7);
            send_byte(ind1,1);
            lcd_pos(0,8);
            send_byte(ind0,1);
            lcd_pos(0,9);
            send_byte(':',1);
            lcd_pos(0,10);
            send_byte(ind3,1);
            lcd_pos(0,11);
            send_byte(ind2,1);
         }*/
         /*
          else if (rx_buf[i] == 'P')
         {
            //MP Текущее состояние плеера
            if (rx_buf[4] == 0)
            {
               //Стоп
               LED2_R1;
               LED2_G0;
               _delay_us(250);
            }
            if (rx_buf[4] == 1)
            {
               //Воспроизведение
               LED2_G1;
               LED2_R0;
               _delay_us(250);
            }
            if (rx_buf[4] == 2)
            {
               //Пауза
               LED2_R1;
               LED2_G0;
               _delay_us(250);
               LED2_G1;
               LED2_R0;
               _delay_us(250);
            }
         }
         */
      }
      
      /*
      //i = 0;
      if (rx_buf[i] == 'Q')
      {
         //i++;
         if (rx_buf[i] == 'M')
         {
            //QM Режим работы плеера
            if (rx_buf[4] == 1)
            {
               //Блютус
               lcd_pos(0,13);
               lcd_str("BLE");
               
               LED1_R1;
               LED1_G0;
               LED1_B0;
               _delay_us(250);
            }
            if (rx_buf[4] == 2)
            {
               //USB Flash
               lcd_pos(0,13);
               lcd_str("USB");
               
               LED1_R0;
               LED1_G1;
               LED1_B0;
               _delay_us(250);
            }
            if (rx_buf[4] == 3)
            {
               //SD Card
               lcd_pos(0,13);
               lcd_str(" SD");
               
               LED1_R0;
               LED1_G0;
               LED1_B1;
               _delay_us(250);
            }
         }
      }
      */
      
      if (BTN_PREV)
      {
         //Команда AT+CD задаём модулю воспроизведение предыдущего трека
         Send_Command("AT+CD\r\n");
         _delay_ms(500);
      }
      if (BTN_NEXT)
      {
         //Команда AT+CC задаём модулю воспроизведение следующего трека
         Send_Command("AT+CC\r\n");
         _delay_ms(500);
      }
      if (BTN_VOL_MIN)
      {
         //Команда AT+CF задаём модулю уменьшение громкости
         Send_Command("AT+CF\r\n");
         vol--;
         _delay_ms(500);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(1,11);
         lcd_str("VOL");
         lcd_pos(1,14);
         send_byte(ind1,1);
         lcd_pos(1,15);
         send_byte(ind0,1);
      }
      if (BTN_VOL_PLS)
      {
         //Команда AT+CE задаём модулю увеличение громкости
         Send_Command("AT+CE\r\n");
         vol++;
         _delay_ms(500);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(1,11);
         lcd_str("VOL");
         lcd_pos(1,14);
         send_byte(ind1,1);
         lcd_pos(1,15);
         send_byte(ind0,1);
      }
      if (BTN_MODE)
      {
         if (mode == 3)
         {
            //Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
            Send_Command("AT+CM01\r\n");
            _delay_ms(500);
            //Устанавливаем значение 1 в переменной mode
            mode=1;
         }
         else if (mode == 2)
         {
            //Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
            Send_Command("AT+CM03\r\n");
            _delay_ms(500);
            //Устанавливаем значение 3 в переменной mode
            mode=3;
         }
         else if (mode == 1)
         {
            //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
            Send_Command("AT+CM02\r\n");
            _delay_ms(500);
            //Устанавливаем значение 2 в переменной mode
            mode=2;
         }
      }
      if (BTN_PLAY_PAUSE)
      {
         //Команда AT+CB даём модулю команду PLAY/PAUSE
         Send_Command("AT+CB\r\n");
         _delay_ms(500);
      }
      if (BTN_REPEAT)
      {
         if (repeat == 2)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            Send_Command("AT+AC00\r\n");
            _delay_ms(500);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=2;
            //Команда AT+AC02 воспроизведение в цикле
            Send_Command("AT+AC02\r\n");
            _delay_ms(500);
            LED3_Y1;
            LED4_B0;
         }
      }
      if (BTN_RAND)
      {
         if (repeat == 3)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            Send_Command("AT+AC00\r\n");
            _delay_ms(500);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=3;
            //Команда AT+AC03 воспроизведение в случайном порядке
            Send_Command("AT+AC03\r\n");
            _delay_ms(500);
            LED3_Y0;
            LED4_B1;
         }
      }
    }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Ср май 29, 2024 09:35:53 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
Сейчас ещё раз проверил код. Этот код все пришедшие данные обрабатывает при подключении к компу через терминал. И то есть такая особенность. Берёт он в обработку только первые данные которые примет остальное же не обрабатывается. Специально подавал команды на мегу в разных порядках чтобы проверить все скрипты обработки данных и вывод на дисплей. Всё работает, но на дисплей выводит только первые данные.
Пробовал запустить в связке с модулем там данные не выводит вообще. В чём тут ещё может быть проблема пока не понятно.

Спойлер
Код:
#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1

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

#define MAIN_H_
#define LCD_H_

#define LCD_DDR DDRD
#define LCD_PORT PORTD
#define LCD_PIN PIND

#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA

#define BTN_DDR DDRC
#define BTN_PORT PORTC
#define BTN_PIN PINC

#define DATA 0b11110000
#define RS PD2
#define E PD3

#define E1 LCD_PORT|=(1<<E)
#define E0 LCD_PORT&=~(1<<E)

#define RS1 LCD_PORT|=(1<<RS)
#define RS0 LCD_PORT&=~(1<<RS)

#define LED1_R1 LED_PORT|=(1<<PA0)
#define LED1_R0 LED_PORT&=~(1<<PA0)

#define LED1_G1 LED_PORT|=(1<<PA1)
#define LED1_G0 LED_PORT&=~(1<<PA1)

#define LED1_B1 LED_PORT|=(1<<PA2)
#define LED1_B0 LED_PORT&=~(1<<PA2)

#define LED2_G1 LED_PORT|=(1<<PA3)
#define LED2_G0 LED_PORT&=~(1<<PA3)

#define LED2_R1 LED_PORT|=(1<<PA4)
#define LED2_R0 LED_PORT&=~(1<<PA4)

#define LED3_Y1 LED_PORT|=(1<<PA5)
#define LED3_Y0 LED_PORT&=~(1<<PA5)

#define LED4_B1 LED_PORT|=(1<<PA6)
#define LED4_B0 LED_PORT&=~(1<<PA6)

#define LED5_G1 LED_PORT|=(1<<PA7)
#define LED5_G0 LED_PORT&=~(1<<PA7)

#define BTN_PLAY_PAUSE (~PINC & (1<<PC0))
#define BTN_PREV (~PINC & (1<<PC1))
#define BTN_NEXT (~PINC & (1<<PC2))
#define BTN_VOL_MIN (~PINC & (1<<PC3))
#define BTN_VOL_PLS (~PINC & (1<<PC4))
#define BTN_RAND (~PINC & (1<<PC5))
#define BTN_REPEAT (~PINC & (1<<PC6))
#define BTN_MODE (~PINC & (1<<PC7))

#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20

char rx_buf[BUF_SIZE];
char buf_index = 0;
char rxb;

volatile start=1, flags;

uint8_t n=0;

char ind7=0;
char ind6=0;
char ind5=0;
char ind4=0;
char ind3=0;
char ind2=0;
char ind1=0;
char ind0=0;

char chl=0;

char min=0;
char sec=0;

char vol=0;
char mode=0;
char repeat=0;

unsigned int dec=0;
unsigned int def=0;
unsigned int dek=0;

void lcd_ini(void);
void lcd_str(char* str);
void lcd_pos(uint8_t line, uint8_t pos);
void lcd_num(uint8_t num, uint8_t line, uint8_t pos);
void bt201_start(void);

void bt201_start (void)
{
   _delay_ms(2000);
   
   //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
   Send_Command("AT+CM02\r\n");
   _delay_ms(100);
   
   //Устанавливаем значение 2 в переменной mode
   mode=2;
   
   //Команда AT+CA15 задаём модулю уровень громкости на 15
   Send_Command("AT+CA15\r\n");
   _delay_ms(100);
   
   //Конвертируем значение уровня звука в ASCII
   vol = 15;
   dek = vol%10;
   def = vol/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   
   //Выводим на дисплей уровень звука
   lcd_pos(1,11);
   lcd_str("VOL");
   lcd_pos(1,14);
   send_byte(ind1,1);
   lcd_pos(1,15);
   send_byte(ind0,1);
   
   //Команда AT+AA00 останавливаем воспроизведение
   Send_Command("AT+AA00\r\n");
   _delay_ms(100);
   
   //Команда AT+AA01 задаём модулю команду PLAY
   Send_Command("AT+AA01\r\n");
   _delay_ms(1);
}

void write(uint8_t n)
{
   n<<=4;
   E1;
   LCD_PORT&=~DATA;
   LCD_PORT|=n;
   _delay_us(1);
   E0;
}

void send_byte(uint8_t byte, uint8_t tip)
{
   if (tip) //если тип данные на линии RS 1
   {
      RS1;
   }
   else //иначе тип команда и на линии RS 0
   {
      RS0;
   }
   
   write(byte>>4); //передача старшего полубайта
   _delay_us(250);
   write(byte); //передача младшего полубайта
   _delay_us(250);
}

void lcd_ini(void)
{
   LCD_DDR|=DATA | (1<<RS) | (1<<E);
   _delay_ms(20);
   RS0;
   write(3);
   _delay_ms(5);
   write(3);
   _delay_us(150);
   write(3);
   _delay_us(50);
   write(2);
   _delay_us(50);
   
   send_byte(40,0);
   _delay_us(50);
   
   send_byte(12,0);
   _delay_us(50);
   
   send_byte(1,0);
   _delay_ms(2);
   
   send_byte(6,0);
   _delay_us(50);
}

void lcd_str(char* str)
{
   uint8_t n=0;
   while(str[n])
   {
      send_byte(str[n],1);
      n++;
   }
}

void lcd_pos(uint8_t line, uint8_t pos)
{
   uint8_t adress=(line*0x40+pos)|0x80;
   send_byte(adress,0);
   _delay_us(50);
}

void init_UART()
{
   UBRRL = UBRRL_value;
   UBRRH = UBRRL_value>>8;
   UCSRB|=(1<<TXEN);
   UCSRB|=(1<<RXEN);
   UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
   UCSRB|=(1<<RXCIE);
   sei();
   flags = 0;
}

void send_UART(char value)
{
   while(!(UCSRA&(1<<UDRE)));
   UDR=value;
}

void Send_Command(char *str)
{
   for(uint8_t i = 0; i < strlen(str); i++)
   {
      while(!(UCSRA&(1<<UDRE)));
      UDR=str[i];
   }
}

char CharToInt(char c)
{
   char chl=0;
   if ('0' <= c && c <= '9')
   {
      chl=c-48;
   }
   else if ('A' <= c && c <= 'F')
   {
      chl=c-55;
   }
   return chl;
}

char CharToDec(unsigned int s)
{
   dek = s%10;
   def = s/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   dek = def%10;
   def = def/10;
   ind2 = dek+48;
   dek = def%10;
   def = def/10;
   ind3 = dek+48;
   dek = def%10;
   def = def/10;
   ind4 = dek+48;
   dek = def%10;
   def = def/10;
   ind5 = dek+48;
   dek = def%10;
   def = def/10;
   ind6 = dek+48;
   dek = def%10;
   def = def/10;
   ind7 = dek+48;
}

char Time(unsigned int s)
{
   char min = s/60;
   char sec = s%60;
   
   dek = min%10;
   def = min/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   
   dek = sec%10;
   def = sec/10;
   ind2 = dek+48;
   dek = def%10;
   def = def/10;
   ind3 = dek+48;
}

ISR(USART_RXC_vect)
{
   char rxb = UDR;
   if(!(flags & FLAG_END_RX))
   {
      rx_buf[buf_index]=rxb;
      if(rx_buf[buf_index] == 0x0D)
      {
         flags |= FLAG_END_RX;
         return;
      }
      buf_index++;
      if(buf_index >= BUF_SIZE)
      {
         buf_index = 0;
         flags |= FLAG_ERR_RX;
      }
   }
}

int main(void)
{
   BTN_PORT = 0b11111111;
   init_UART();
   lcd_ini();
   flags = 0;
   
   _delay_ms(5000);
   
   bt201_start();
   
   while(1)
    {
      char i = 0;
      if (rx_buf[i] == 'M')
      {
         i++;
         if (rx_buf[i] == '1')
         {
            dec=0;
            def=0;
            dek=0;
            
            ind7=0;
            ind6=0;
            ind5=0;
            ind4=0;
            ind3=0;
            ind2=0;
            ind1=0;
            ind0=0;
            
            //M1 Номер текущего файла
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            
            lcd_pos(1,0);
            send_byte(ind3,1);
            lcd_pos(1,1);
            send_byte(ind2,1);
            lcd_pos(1,2);
            send_byte(ind1,1);
            lcd_pos(1,3);
            send_byte(ind0,1);
            lcd_pos(1,4);
            send_byte('/',1);
         }
          else if (rx_buf[i] == '2')
         {
            dec=0;
            def=0;
            dek=0;
            
            ind7=0;
            ind6=0;
            ind5=0;
            ind4=0;
            ind3=0;
            ind2=0;
            ind1=0;
            ind0=0;
            
            //M2 Общее колличество звуковых файлов
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            
            lcd_pos(1,5);
            send_byte(ind3,1);
            lcd_pos(1,6);
            send_byte(ind2,1);
            lcd_pos(1,7);
            send_byte(ind1,1);
            lcd_pos(1,8);
            send_byte(ind0,1);
         }
          else if (rx_buf[i] == 'T')
         {
            dec=0;
            def=0;
            dek=0;
            
            ind7=0;
            ind6=0;
            ind5=0;
            ind4=0;
            ind3=0;
            ind2=0;
            ind1=0;
            ind0=0;
            
            min=0;
            sec=0;
            
            //MT Общее время воспроизведения
            
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            Time(dec);
            
            lcd_pos(0,7);
            send_byte(ind1,1);
            lcd_pos(0,8);
            send_byte(ind0,1);
            lcd_pos(0,9);
            send_byte(':',1);
            lcd_pos(0,10);
            send_byte(ind3,1);
            lcd_pos(0,11);
            send_byte(ind2,1);
         }
          else if (rx_buf[i] == 'F')
         {
            //MF Имя текущего файла
            lcd_pos(0,0);
            send_byte(rx_buf[4],1);
            lcd_pos(0,1);
            send_byte(rx_buf[5],1);
            lcd_pos(0,2);
            send_byte(rx_buf[6],1);
            lcd_pos(0,3);
            send_byte(rx_buf[7],1);
            lcd_pos(0,4);
            send_byte(rx_buf[8],1);
            lcd_pos(0,5);
            send_byte(rx_buf[9],1);
         }
         /*else if (rx_buf[i] == 'K')
         {
            //MK Время воспроизведения текущего файла
            long dec = CharToInt(rx_buf[3]);
            dec = dec*16 + CharToInt(rx_buf[4]);
            dec = dec*16 + CharToInt(rx_buf[5]);
            dec = dec*16 + CharToInt(rx_buf[6]);
            dec = dec*16 + CharToInt(rx_buf[7]);
            dec = dec*16 + CharToInt(rx_buf[8]);
            dec = dec*16 + CharToInt(rx_buf[9]);
            dec = dec*16 + CharToInt(rx_buf[10]);
            
            CharToDec(dec);
            Time(dec);
            
            lcd_pos(0,7);
            send_byte(ind1,1);
            lcd_pos(0,8);
            send_byte(ind0,1);
            lcd_pos(0,9);
            send_byte(':',1);
            lcd_pos(0,10);
            send_byte(ind3,1);
            lcd_pos(0,11);
            send_byte(ind2,1);
         }*/
         /*
          else if (rx_buf[i] == 'P')
         {
            //MP Текущее состояние плеера
            if (rx_buf[4] == 0)
            {
               //Стоп
               LED2_R1;
               LED2_G0;
               _delay_us(250);
            }
            if (rx_buf[4] == 1)
            {
               //Воспроизведение
               LED2_G1;
               LED2_R0;
               _delay_us(250);
            }
            if (rx_buf[4] == 2)
            {
               //Пауза
               LED2_R1;
               LED2_G0;
               _delay_us(250);
               LED2_G1;
               LED2_R0;
               _delay_us(250);
            }
         }
         */
      }
      
      /*
      //i = 0;
      if (rx_buf[i] == 'Q')
      {
         //i++;
         if (rx_buf[i] == 'M')
         {
            //QM Режим работы плеера
            if (rx_buf[4] == 1)
            {
               //Блютус
               lcd_pos(0,13);
               lcd_str("BLE");
               
               LED1_R1;
               LED1_G0;
               LED1_B0;
               _delay_us(250);
            }
            if (rx_buf[4] == 2)
            {
               //USB Flash
               lcd_pos(0,13);
               lcd_str("USB");
               
               LED1_R0;
               LED1_G1;
               LED1_B0;
               _delay_us(250);
            }
            if (rx_buf[4] == 3)
            {
               //SD Card
               lcd_pos(0,13);
               lcd_str(" SD");
               
               LED1_R0;
               LED1_G0;
               LED1_B1;
               _delay_us(250);
            }
         }
      }
      */
      
      if (BTN_PREV)
      {
         //Команда AT+CD задаём модулю воспроизведение предыдущего трека
         Send_Command("AT+CD\r\n");
         _delay_ms(500);
      }
      if (BTN_NEXT)
      {
         //Команда AT+CC задаём модулю воспроизведение следующего трека
         Send_Command("AT+CC\r\n");
         _delay_ms(500);
      }
      if (BTN_VOL_MIN)
      {
         //Команда AT+CF задаём модулю уменьшение громкости
         Send_Command("AT+CF\r\n");
         if (vol>0)
         {
            vol--;
         }
         _delay_ms(500);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(1,11);
         lcd_str("VOL");
         lcd_pos(1,14);
         send_byte(ind1,1);
         lcd_pos(1,15);
         send_byte(ind0,1);
      }
      if (BTN_VOL_PLS)
      {
         //Команда AT+CE задаём модулю увеличение громкости
         Send_Command("AT+CE\r\n");
         if (vol<30)
         {
            vol++;
         }
         _delay_ms(500);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(1,11);
         lcd_str("VOL");
         lcd_pos(1,14);
         send_byte(ind1,1);
         lcd_pos(1,15);
         send_byte(ind0,1);
      }
      if (BTN_MODE)
      {
         if (mode == 3)
         {
            //Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
            Send_Command("AT+CM01\r\n");
            _delay_ms(500);
            //Устанавливаем значение 1 в переменной mode
            mode=1;
         }
         else if (mode == 2)
         {
            //Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
            Send_Command("AT+CM03\r\n");
            _delay_ms(500);
            //Устанавливаем значение 3 в переменной mode
            mode=3;
         }
         else if (mode == 1)
         {
            //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
            Send_Command("AT+CM02\r\n");
            _delay_ms(500);
            //Устанавливаем значение 2 в переменной mode
            mode=2;
         }
      }
      if (BTN_PLAY_PAUSE)
      {
         //Команда AT+CB даём модулю команду PLAY/PAUSE
         Send_Command("AT+CB\r\n");
         _delay_ms(500);
      }
      if (BTN_REPEAT)
      {
         if (repeat == 2)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            Send_Command("AT+AC00\r\n");
            _delay_ms(500);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=2;
            //Команда AT+AC02 воспроизведение в цикле
            Send_Command("AT+AC02\r\n");
            _delay_ms(500);
            LED3_Y1;
            LED4_B0;
         }
      }
      if (BTN_RAND)
      {
         if (repeat == 3)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            Send_Command("AT+AC00\r\n");
            _delay_ms(500);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=3;
            //Команда AT+AC03 воспроизведение в случайном порядке
            Send_Command("AT+AC03\r\n");
            _delay_ms(500);
            LED3_Y0;
            LED4_B1;
         }
      }
    }
}

Честно я уже вообще не пойму в чём тут может быть проблема? У меня только напрашивается вывод что всё таки какие то разные скорости используются и потому не успевает обработать данные с модуля. Хотя я там устанавливал скорость на 9600 как и в меге, но на что думать уже не знаю.
Либо всё таки этот китайский модуль чем то слегка отличается от других. Ведь мне уже говорили ранее и я сам понял по некоторым признакам что это у меня всего лишь китайская подделка. Однако я недавно заказал ещё два таких модуля с другого магазина. Посмотрю что там придёт. Потому как я уже в сети находил инфу что люди также мучались с неработающими функциями этого модуля и как спецы указывали что скорей всего имеем дело с подделкой.
Так что возможно с другим модулем ситуация поменяется.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Ср май 29, 2024 09:51:54 
Друг Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 1787
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12034
Рейтинг сообщения: 0
Нет смысла обсуждать модуль, если как и прежде отсутствует работа с массивом, присутствуют миллион переменных и опять куча задержек, которые максимум должны быть при инициализации дисплея, а больше нигде. Пока программа не будет выглядеть программой, все Ваши сетования на аппаратную часть можно воспринимать как жалобы мартышки на неработающие очки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Ср май 29, 2024 10:29:15 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
Martian, от массива одни проблемы там как всегда сыпет кучу ошибок типа не правильно объявил массив или ещё какие то непонятные ошибки. Можешь хоть тогда по человечески написать как объявляются массивы. Вот с этим у меня вечная проблема и потом его нужно объявлять глобально потому как использовать приходится из разных участков программы. По другому то не сделать.
Ещё кое что это нужно после передачи данных обнулять массив. То есть очищать чтобы в дальнейшем можно было спокойно работать с ним.
Задержки используются только при старте, инициализации и на кнопках больше нигде их нет. В данных местах они обязательны, а больше нигде и не нужно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Ср май 29, 2024 13:04:24 
Сверлит текстолит когтями

Карма: -11
Рейтинг сообщений: 118
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1205
Рейтинг сообщения: 0
В чём тут ещё может быть проблема пока не понятно.
Что там непонятного? Достаточно взглянуть хотя бы на это:
Код:
ISR(USART_RXC_vect)
{
   char rxb = UDR;
   if(!(flags & FLAG_END_RX))
   {
      rx_buf[buf_index]=rxb;
      if(rx_buf[buf_index] == 0x0D)
      {
         flags |= FLAG_END_RX;
         return;
      }
      buf_index++;
      if(buf_index >= BUF_SIZE)
      {
         buf_index = 0;
         flags |= FLAG_ERR_RX;
      }
   }
}

int main(void)
{
   BTN_PORT = 0b11111111;
   init_UART();
   lcd_ini();
   flags = 0;
   
   _delay_ms(5000);
   
   bt201_start();
   
   while(1)
    {
      char i = 0;
      if (rx_buf[i] == &#39;M&#39;)
      {
         i++;
         if (rx_buf[i] == &#39;1&#39;)
         {
...

чтобы понять, что это безобразие не может работать в принципе.
Чего вы ожидали, написав такую галиматью???
Как видно по этому "коду" - вы даже не пытались продумать как в целом должно всё работать. Также как видно опять же по этой галиматье - вы так же совершенно не освоили даже самых основ языка программирования - ни про типы переменных не поняли (и в чём их различие) ни что такое volatile и зачем он нужен, ни про циклы. И т.д. Не говоря уже о том, что совершенно не понимаете - что такое прерывания и основной цикл, как они взаимодействуют.

Добавлено after 2 minutes 22 seconds:
Вот с этим у меня вечная проблема и потом его нужно объявлять глобально потому как использовать приходится из разных участков программы. По другому то не сделать.
Для начала вам следует взять учебник по программированию и освоить хотя бы самые основы. По другому не сделать. :dont_know:
Начинать нужно с самых основ. Разбирая примеры и пытаясь понять - почему сделано так, а не иначе.

Ну или идти в раздел "Предлагаю работу" и искать того, кто напишет вам программу.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Ср май 29, 2024 16:31:41 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
Да в том то и дело я когда брал этот модуль. Я сразу хотел кого нибудь попросить написать мне прошивку, но подождав какое то время так никто и не отозвался и пришлось писать программу самому, но слишком здесь всё сложно, то в одном месте, то в другом проблемы.
Ещё конечно нужно учитывать и то что модули немного разные и под них нужно тоже настраивать прошивку индивидуально. Однако я всё таки думаю так нужно дождаться пока придут ко мне ещё два модуля уже в конце этой недели должны быть в пункте выдачи. Посмотрю уже всё это через терминал чтобы понять что и как и нужно будет обязательно за скринить. После чего готовить так называемое тех задание и точную схему того что я хочу получить на выходе. Дисплей кстати тоже заказал на 2004 потому как уже понял что 1602 достаточно тесный для вывода инфы с данного модуля. Да всё таки наверное попробую составить тех задание и попросить чтоб мне кто нибудь написал прошивку по всем моим запросам, но для начала нужно как следует всё рассмотреть через терминал. Чтобы увидеть какие функции как отрабатывают что выводит модуль когда начинает воспроизводить музыку.
Сам я как видно не потяну такую ношу с написанием данной прошивки. Однако я получил не мало опыта в программировании освоил работу с дисплеем и также работу UART. Надеюсь народ согласится написать код для ATMEGA16 для управления модулем.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 89 ]    , , 3, ,  

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


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y