Например TDA7294

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





Текущее время: Пн июн 17, 2024 00:12:31

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


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



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

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

Добавлено after 45 minutes 17 seconds:
Подключил я ATMEGA16 к компу и посмотрел через терминал что же всё таки там происходит. Но я конечно был удивлён увидев то что мега постоянно пачками засылает всякие разные команды, которые впринцепи должны вызываться только с нажатия кнопок. И вот я в очередной раз убеждаюсь что на кнопки обязательно нужно делать внешние резисторы подтяжки. Так как внутренние не помогают. Ещё конечно нужно перепроверить весь код может там чего не правильно записал. Вот и получается что от меги приходят постоянно целыми пачками команды и бедный модуль не успевает ничего сделать и постоянно перезагружается. Я уже сейчас понял что нужно отлаживать на компе всю отправку команд и уже только после того как будут правильно отправляться команды можно будет подключать к самому модулю и проверять уже совместную работу.

Добавлено after 31 minute 12 seconds:
Проверил ещё на плате уровни напряжений на пинах кнопок и на них по умолчанию сидел минус питания. Хотя должно быть +5 вольт и только при нажатии должен появляться минус. Поэтому тут нужно доработать в коде, но всё же на будущее я переделаю плату и схему добавив резисторы подтяжки для кнопок и кнопок побольше так как оказалось даже восьми кнопок будет мало.

Добавлено after 32 minutes 7 seconds:
В общем с кнопками я сейчас здесь всё наладил вот код на данный момент.
Спойлер
Код:
#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)
{
   /*
   //Команда AT+CT01 задаём модулю скорость 9600
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('T');
   send_UART('0');
   send_UART('1');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(2000);
   */
   //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('M');
   send_UART('0');
   send_UART('2');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(10);
   
   //Устанавливаем значение 2 в переменной mode
   mode=2;
   
   //Команда AT+CA15 задаём модулю уровень громкости на 15
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('A');
   send_UART('1');
   send_UART('5');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(2000);
   
   //Конвертируем значение уровня звука в ASCII
   vol = 15;
   dek = vol%10;
   def = vol/10;
   ind0 = dek+48;
   dek = def%10;
   def = def/10;
   ind1 = dek+48;
   
   //Выводим на дисплей уровень звука
   lcd_pos(0,11);
   lcd_str("VOL");
   lcd_pos(0,14);
   send_byte(ind1,1);
   lcd_pos(0,15);
   send_byte(ind0,1);
   
   //Команда AT+AA00 останавливаем воспроизведение
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('A');
   send_UART('A');
   send_UART('0');
   send_UART('0');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(100);
   
   //Команда AT+AA01 задаём модулю команду PLAY
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('A');
   send_UART('A');
   send_UART('0');
   send_UART('1');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(10);
   
   
}

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;
}

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();
   
   _delay_ms(500);
   send_UART('O');
   send_UART('K');
   send_UART('!');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(10);
   flags = 0;
   
   void bt201_start();
   
   while(1)
    {
        char i = 0;
      if (rx_buf[i] == 'M')
      {
         i++;
         if (rx_buf[i] == '1')
         {
            //M1 Номер текущего файла
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            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);
            _delay_ms(300);
         }
         else if (rx_buf[i] == '2')
         {
            //M2 Общее колличество звуковых файлов
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            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);
            _delay_ms(300);
         }
         else if (rx_buf[i] == 'T')
         {
            //MT Общее время воспроизведения
            
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            CharToDec(dec);
            _delay_us(1);
            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);
            _delay_ms(300);
         }
         /*else if (rx_buf[i] == 'K')
         {
            //MK Время воспроизведения текущего файла
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            CharToDec(dec);
            _delay_us(1);
            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);
            _delay_ms(300);
         }*/
         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);
            _delay_ms(300);
         }
         else if (rx_buf[i] == 'P')
         {
            //MP Текущее состояние плеера
            if (rx_buf[4] == 0)
            {
               //Стоп
               LED2_R1;
               LED2_G0;
               _delay_ms(300);
            }
            if (rx_buf[4] == 1)
            {
               //Воспроизведение
               LED2_G1;
               LED2_R0;
               _delay_ms(300);
            }
            if (rx_buf[4] == 2)
            {
               //Пауза
               LED2_R1;
               LED2_G0;
               _delay_ms(300);
               LED2_G1;
               LED2_R0;
               _delay_ms(300);
            }
         }
      }
      else 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_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);
            }
         }
      }
      /*
      //Команда AT+M1 запрос номера текущего файла
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('1');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      
      //Команда AT+M2 запрос общего колличества файлов
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('2');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      
      //Команда AT+MT запрос общего времени воспроизводимого файла
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('T');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      
      //Команда AT+MK запрос текущего времени воспроизводимого файла
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('K');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      */
      if (BTN_PREV)
      {
         //Команда AT+CD задаём модулю воспроизведение предыдущего трека
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('D');
         send_UART(0x0D);
         send_UART(0x0A);
         _delay_ms(500);
      }
      if (BTN_NEXT)
      {
         //Команда AT+CC задаём модулю воспроизведение следующего трека
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('C');
         send_UART(0x0D);
         send_UART(0x0A);
         _delay_ms(500);
      }
      if (BTN_VOL_MIN)
      {
         //Команда AT+CF задаём модулю уменьшение громкости
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('F');
         send_UART(0x0D);
         send_UART(0x0A);
         vol--;
         _delay_ms(200);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(0,11);
         lcd_str("VOL");
         lcd_pos(0,14);
         send_byte(ind1,1);
         lcd_pos(0,15);
         send_byte(ind0,1);
      }
      if (BTN_VOL_PLS)
      {
         //Команда AT+CE задаём модулю увеличение громкости
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('E');
         send_UART(0x0D);
         send_UART(0x0A);
         vol++;
         _delay_ms(200);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(0,11);
         lcd_str("VOL");
         lcd_pos(0,14);
         send_byte(ind1,1);
         lcd_pos(0,15);
         send_byte(ind0,1);
      }
      if (BTN_MODE)
      {
         if (mode == 3)
         {
            //Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('C');
            send_UART('M');
            send_UART('0');
            send_UART('1');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            //Устанавливаем значение 1 в переменной mode
            mode=1;
         }
         if (mode == 2)
         {
            //Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('C');
            send_UART('M');
            send_UART('0');
            send_UART('3');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(20);
            //Устанавливаем значение 3 в переменной mode
            mode=3;
         }
         if (mode == 1)
         {
            //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('C');
            send_UART('M');
            send_UART('0');
            send_UART('2');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(20);
            //Устанавливаем значение 2 в переменной mode
            mode=2;
         }
      }
      if (BTN_PLAY_PAUSE)
      {
         //Команда AT+CB даём модулю команду PLAY/PAUSE
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('B');
         send_UART(0x0D);
         send_UART(0x0A);
         _delay_ms(20);
      }
      if (BTN_REPEAT)
      {
         if (repeat == 2)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('0');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=2;
            //Команда AT+AC02 воспроизведение в цикле
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('2');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y1;
            LED4_B0;
         }
      }
      if (BTN_RAND)
      {
         if (repeat == 3)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('0');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=3;
            //Команда AT+AC03 воспроизведение в случайном порядке
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('3');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y0;
            LED4_B1;
         }
      }
    }
}

Но однако я заметил такую вещь при запуске не отрабатывает функция bt201_start();. Да и вообще почему то UART вне цикла не работает. Нужно чего то думать здесь как это всё поправить?


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

Карма: 19
Рейтинг сообщений: 517
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3235
Рейтинг сообщения: 0
Т.е. проблема все же в коде? Может знатоки AVR что-то подскажут.

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


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

Карма: 10
Рейтинг сообщений: 78
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1407
Откуда: Мелеуз
Рейтинг сообщения: 0
Зачем отправлять в модуль ОК?
После подачи питания надо ждать 3 сек минимум а потом подавать команды,а не 500 мсек
Чтоб работал bt201_start();. так и пишите,а не void bt201_start() ( перед while)
А лучше бросайте вы эту атмел студио,она вам не по плечу,изучайте ардуино


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Ср май 22, 2024 10:09:06 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Вс май 19, 2024 10:05:49
Сообщений: 35
Откуда: Россия Кемерово
Рейтинг сообщения: 0
Novice user, в модуль я не отправлял ОК это просто осталась тестовая запись. Я просто в терминале проверял отправку команды при старте. убрал её сейчас. А в общем так то да задержка перед функцией bt201_start() помогла. Теперь функция работает дальше уже всё должно работать. Теперь уже можно проверять конкретно ATMEGA16 в связке с BT201.
А вот насчёт ардуино это совершенно не моё и она мне нигде никаким боком не подходит в отличии от AVR. Поэтому я предпочитаю остаться на AVR и Atmel Studio 6.

Добавлено after 22 minutes 36 seconds:
В общем я сейчас сделал так паузу при запуске пришлось сделать даже больше чем сказали и только тогда получилось нормально запустить функцию bt201_start ().
Спойлер
Код:
#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)
{
   /*
   //Команда AT+CT01 задаём модулю скорость 9600
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('T');
   send_UART('0');
   send_UART('1');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(100);
   */
   _delay_ms(2000);
   
   //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('M');
   send_UART('0');
   send_UART('2');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(100);
   
   //Устанавливаем значение 2 в переменной mode
   mode=2;
   
   //Команда AT+CA15 задаём модулю уровень громкости на 15
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('A');
   send_UART('1');
   send_UART('5');
   send_UART(0x0D);
   send_UART(0x0A);
   _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(0,11);
   lcd_str("VOL");
   lcd_pos(0,14);
   send_byte(ind1,1);
   lcd_pos(0,15);
   send_byte(ind0,1);
   
   //Команда AT+AA00 останавливаем воспроизведение
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('A');
   send_UART('A');
   send_UART('0');
   send_UART('0');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(100);
   
   //Команда AT+AA01 задаём модулю команду PLAY
   send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('A');
   send_UART('A');
   send_UART('0');
   send_UART('1');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(10);
   
   
}

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;
}

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')
         {
            //M1 Номер текущего файла
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            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);
            _delay_ms(300);
         }
         else if (rx_buf[i] == '2')
         {
            //M2 Общее колличество звуковых файлов
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            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);
            _delay_ms(300);
         }
         else if (rx_buf[i] == 'T')
         {
            //MT Общее время воспроизведения
            
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            CharToDec(dec);
            _delay_us(1);
            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);
            _delay_ms(300);
         }
         /*else if (rx_buf[i] == 'K')
         {
            //MK Время воспроизведения текущего файла
            long dec = CharToInt(rx_buf[3]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[4]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[5]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[6]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[7]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[8]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[9]);
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);
            _delay_us(1);
            
            CharToDec(dec);
            _delay_us(1);
            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);
            _delay_ms(300);
         }*/
         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);
            _delay_ms(300);
         }
         else if (rx_buf[i] == 'P')
         {
            //MP Текущее состояние плеера
            if (rx_buf[4] == 0)
            {
               //Стоп
               LED2_R1;
               LED2_G0;
               _delay_ms(300);
            }
            if (rx_buf[4] == 1)
            {
               //Воспроизведение
               LED2_G1;
               LED2_R0;
               _delay_ms(300);
            }
            if (rx_buf[4] == 2)
            {
               //Пауза
               LED2_R1;
               LED2_G0;
               _delay_ms(300);
               LED2_G1;
               LED2_R0;
               _delay_ms(300);
            }
         }
      }
      else 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_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);
            }
         }
      }
      /*
      //Команда AT+M1 запрос номера текущего файла
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('1');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      
      //Команда AT+M2 запрос общего колличества файлов
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('2');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      
      //Команда AT+MT запрос общего времени воспроизводимого файла
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('T');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      
      //Команда AT+MK запрос текущего времени воспроизводимого файла
      send_UART('A');
      send_UART('T');
      send_UART('+');
      send_UART('M');
      send_UART('K');
      send_UART(0x0D);
      send_UART(0x0A);
      _delay_ms(300);
      */
      if (BTN_PREV)
      {
         //Команда AT+CD задаём модулю воспроизведение предыдущего трека
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('D');
         send_UART(0x0D);
         send_UART(0x0A);
         _delay_ms(500);
      }
      if (BTN_NEXT)
      {
         //Команда AT+CC задаём модулю воспроизведение следующего трека
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('C');
         send_UART(0x0D);
         send_UART(0x0A);
         _delay_ms(500);
      }
      if (BTN_VOL_MIN)
      {
         //Команда AT+CF задаём модулю уменьшение громкости
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('F');
         send_UART(0x0D);
         send_UART(0x0A);
         vol--;
         _delay_ms(200);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(0,11);
         lcd_str("VOL");
         lcd_pos(0,14);
         send_byte(ind1,1);
         lcd_pos(0,15);
         send_byte(ind0,1);
      }
      if (BTN_VOL_PLS)
      {
         //Команда AT+CE задаём модулю увеличение громкости
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('E');
         send_UART(0x0D);
         send_UART(0x0A);
         vol++;
         _delay_ms(200);
         
         //Конвертируем значение уровня звука в ASCII
         dek = vol%10;
         def = vol/10;
         ind0 = dek+48;
         dek = def%10;
         def = def/10;
         ind1 = dek+48;
         
         //Выводим на дисплей уровень звука
         lcd_pos(0,11);
         lcd_str("VOL");
         lcd_pos(0,14);
         send_byte(ind1,1);
         lcd_pos(0,15);
         send_byte(ind0,1);
      }
      if (BTN_MODE)
      {
         if (mode == 3)
         {
            //Команда AT+CM01 зададаём модулю режим воспроизведения с BLE
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('C');
            send_UART('M');
            send_UART('0');
            send_UART('1');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            //Устанавливаем значение 1 в переменной mode
            mode=1;
         }
         if (mode == 2)
         {
            //Команда AT+CM03 зададаём модулю режим воспроизведения с SD CARD
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('C');
            send_UART('M');
            send_UART('0');
            send_UART('3');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(20);
            //Устанавливаем значение 3 в переменной mode
            mode=3;
         }
         if (mode == 1)
         {
            //Команда AT+CM02 зададаём модулю режим воспроизведения с USB
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('C');
            send_UART('M');
            send_UART('0');
            send_UART('2');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(20);
            //Устанавливаем значение 2 в переменной mode
            mode=2;
         }
      }
      if (BTN_PLAY_PAUSE)
      {
         //Команда AT+CB даём модулю команду PLAY/PAUSE
         send_UART('A');
         send_UART('T');
         send_UART('+');
         send_UART('C');
         send_UART('B');
         send_UART(0x0D);
         send_UART(0x0A);
         _delay_ms(20);
      }
      if (BTN_REPEAT)
      {
         if (repeat == 2)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('0');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=2;
            //Команда AT+AC02 воспроизведение в цикле
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('2');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y1;
            LED4_B0;
         }
      }
      if (BTN_RAND)
      {
         if (repeat == 3)
         {
            repeat=0;
            //Команда AT+AC00 сбрасываем настройки воспроизведения по умолчанию
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('0');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y0;
            LED4_B0;
         }
         else
         {
            repeat=3;
            //Команда AT+AC03 воспроизведение в случайном порядке
            send_UART('A');
            send_UART('T');
            send_UART('+');
            send_UART('A');
            send_UART('C');
            send_UART('0');
            send_UART('3');
            send_UART(0x0D);
            send_UART(0x0A);
            _delay_ms(10);
            LED3_Y0;
            LED4_B1;
         }
      }
    }
}

Проверил мегу в связке с модулем. Модуль теперь хорошо стартует. Есть конечно некоторые косячки по командам внутри цикла, но это я уже сам с помощью терминала отлажу.


Вернуться наверх
 
Важные нюансы подбора литиевых ХИТ для разработчиков

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

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

Карма: 10
Рейтинг сообщений: 78
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1407
Откуда: Мелеуз
Рейтинг сообщения: 0
Вот наворотил,там и памяти атмега16 не хватит :)


Вернуться наверх
 
Литиевые батарейки и аккумуляторы от мирового лидера EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. EVE является поставщиком аккумуляторных элементов круглого формата для электрических моделей автомобилей. Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного.

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

Карма: 62
Рейтинг сообщений: 837
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5640
Откуда: Minsk
Рейтинг сообщения: 0
Напрашиваются циклы, массивы, подпрограммы - это должно быть в "сундучке" даже у начинающего программиста... :)

_________________
Изображение


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

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

Добавлено after 2 hours 51 minute 26 seconds:
В общем сейчас стоит такая задача модуль BT201 когда начинает воспроизводить мне отправляет по UART посылку данных о файле и прочее. Мне же нужно как то сделать захват этих данных целиком и уже после их обработать. Потому как на ходу я не успеваю их принять и обработать.

А приходит как то вот так
Изображение
Нужно вот теперь думать каким образом это всё принять и обработать. Такой объём данных с ходу не обработать. Нужно как то делать захват всех данных разом, а только потом их обрабатывать.


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

Карма: 10
Рейтинг сообщений: 78
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1407
Откуда: Мелеуз
Рейтинг сообщения: 0
Такой объём данных с ходу не обработать

Ну у всех получается "сходу обработать",а у tifaso нет,и это меня уже не удивляет...


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

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


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

Карма: 10
Рейтинг сообщений: 78
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1407
Откуда: Мелеуз
Рейтинг сообщения: 0
По опыту общения с тобой я тебе скажу-что толку тебе советовать если ты никого не слушаешь-я так не хочу/я так не буду делать/это у меня не работает(я про itoa),не читаешь даташиты,не изучаешь другие исходники,которых полно в сети
Удачи!


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

Карма: 28
Рейтинг сообщений: 1461
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 10895
Рейтинг сообщения: 0
Forsio писал(а):
Потому как на ходу я не успеваю их принять и обработать
да, это сложно. Понимаю Вас. Сам когда-то писал программу для обработки нескольких параллельных медиапотоков, мучался, специально железо под это дело подбирали. А тут аж 9600 и четверть килобайта данных... наверное, тоже нужно железо помощнее, может, парочку 8-ядерных ARMов? Или не хватит?


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

Карма: 19
Рейтинг сообщений: 517
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3235
Рейтинг сообщения: 0
Forsio, на плате вашего модуля установлен 32-битный микроконтроллер с мегабайтом памяти и с тактовой частотой 480 мегагерц. Вы же к нему зачем-то прикручиваете древнюю полудохлую мегу.

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


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

Карма: 28
Рейтинг сообщений: 1461
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 10895
Рейтинг сообщения: 0
Т.е. проблема все же в коде?


Каждая команда посылается блоком:
Код:
send_UART('A');
   send_UART('T');
   send_UART('+');
   send_UART('C');
   send_UART('M');
   send_UART('0');
   send_UART('2');
   send_UART(0x0D);
   send_UART(0x0A);
   _delay_ms(100);

ТС не видит способа оформить в функцию.

далее:

Код:
dek = s%10;
   def = s/10;
   ind0 = dek+48;
  ...
   dek = def%10;
   def = def/10;
   ind7 = dek+48;


и здесь:

Код:
            dec = dec*16 + CharToInt(rx_buf[3]);
            _delay_us(1);
           ...
            _delay_us(1);
            dec = dec*16 + CharToInt(rx_buf[10]);


показывает, что ТС не понимает циклы, массивы, указатели. Это я даже не смотрел собственно алгоритм.
Так что, дело не в коде, а в обучении.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: BT201 последовательность комманд
СообщениеДобавлено: Пт май 24, 2024 18:01:28 
Это не хвост, это антенна

Карма: 10
Рейтинг сообщений: 78
Зарегистрирован: Вт янв 05, 2016 10:14:25
Сообщений: 1407
Откуда: Мелеуз
Рейтинг сообщения: 0
Я ему давал свой пример но tifaso его отверг,потому что у него так не работает
Правда си я не знаю,только поверхностно,но у меня работало замечательно (проверял в протеусе с реальным BT201)
И зачем лишний раз ставить задержки? Обработка принятых данных должна быть быстрой,пока не пошла следующие данные

Asmodey и как к такому 32-битному микроконтроллеру с мегабайтом памяти и с тактовой частотой 480 мегагерц без знаний как этот микроконтроллер программировать прикрутить дисплей,управление с пульта,доп кнопки?


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

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

Я конечно не знаю, но всё же предполагаю что мне нужно сейчас расширить буфер данных и захватывать туда уже весь пакет данных и только потом их обрабатывать. другого варианта я уже и не вижу. Может конечно и есть способы, но я не знаю.


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

Карма: 19
Рейтинг сообщений: 517
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3235
Рейтинг сообщения: 0
Forsio, курсач? Тем не менее загляните в л/с.

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


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

Карма: 28
Рейтинг сообщений: 1461
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 10895
Рейтинг сообщения: 0
предполагаю что мне нужно сейчас расширить буфер данных и захватывать туда уже весь пакет данных и только потом их обрабатывать.

Нет. Вам нужно научиться мыслить, как программист. Я выше привёл куски Вашего кода, как образец плохого. Вместо множества одинаковых
Код:
send_UART('A');
send_UART('T');
send_UART('+');
... // здесь четыре строчки, которые меняются
send_UART(0x0D);
send_UART(0x0A);
_delay_ms(100);

начинающий программист просто обязан был бы написать одну функцию, где аргументом передаются только 4 байта команды. Далее программист должен задуматься, не проще ли и читабельнее и удобнее было бы написать как-то так: Send_Command("AT+CM01\r\n")?
и в итоге получить что-то типа:

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

Я совершенно не изменил алгоритм, но целый кусок "портянки" Вашего кода сократился до:

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

По крайней мере, теперь можно читать Вашу программу


И далее - куча char indх. Сделайте их массивом и обращайтесь по индексу в цикле.


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

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


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

Карма: 19
Рейтинг сообщений: 517
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 3235
Рейтинг сообщения: 0
массивы работают только в цикле
Чё??? :shock:

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


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

Карма: 28
Рейтинг сообщений: 1461
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 10895
Рейтинг сообщения: 0
Forsio, массив можно рассматривать как набор переменных, значит, любой элемент массива суть переменная, и значит, с ним можно обращаться как с переменной. Область видимости ограничивается циклом только для его счётчиков, и то, если они объявлены при инициализации цикла.

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


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

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


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

Сейчас этот форум просматривают: AlexS4 и гости: 53


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

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


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