Перейти к содержанию

tifaso

Members
  • Постов

    1 996
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Весь контент tifaso

  1. @korsaj Сегодня попробовал сделать как ты посоветовал. Получился следующий код. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) #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; volatile start=1, flags; char b; ISR(USART_RXC_vect) { b=UDR; if(!(flags & FLAG_END_RX)) { rx_buf[buf_index]=UDR; 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; } } } 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; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Ну как сказать всё работает, но вот меня очень интересует приём команд на саму ATMEGA16. Он так и работает только с цифрами. Более ничего корректно принять не получается даже используя таблицу ascii. А мне нужно будет принимать команды и посложней чем просто буквенно - цифровые. Потому как возвращаясь к командам самого плеера там в этих командах хранятся различные данные. Вот примерно так это всё выглядит. AT+QM \ r \ n Запрос режима работы [0: Bluetooth], [1: MP3] AT+M1 \ r \ n Номер текущего файла AT+M2 \ r \ n Общее количество звуковых файлов AT+MD \ r \ n Источник музыки USB или SD Card AT+MT \ r \ n Общее время воспроизведения текущего файла AT+MK \ r \ n Время воспроизведения текущего файла AT+MP \ r \ n Текущее состояние плеера [0]Стоп, [1]Воспроизведение, [2]Пауза К примеру при отправке команды AT+M1 \ r \ n в ответ мы получим M1 + 000002 \ r \ n при этом здесь может быть любое число в hex формате. Мне же нужно каким то образом принять эти данные и обработать их соответствующим образом. Но при этом и нужно учитывать так же что плеер может сам отправить эти данные по началу воспроизведения трека. Вот в этом сейчас и стоит основная задача. Чего я и пытаюсь получить в итоге.
  2. @korsaj Спасибо завтра на свежую голову всё проверю и посмотрю что и как получится.
  3. Ну это итак понятно, а далее то что и как делается? Написать можешь. А то я так и не соображу никак.
  4. @korsaj Да там пока и показать то нечего. Я во первых не совсем понимаю ещё в какое место правильно будет вписать этот код, а во вторых не совсем понятно как его записать. Из этого текста разве что понятно что нужно в каком то месте создать массив и сделать ограничитель по завершению команды. А вот как и куда конкретно вписать вот это и не могу сообразить?
  5. @korsaj В голове так прокручиваю написаный тобою сценарий вроде бы всё так, но в код у меня никак не получается это всё записать. Я разве что знаю как массив записать и всё тут. Так что ситуация для меня тут далеко не простая.
  6. @korsaj Сейчас попробовал разобраться как это всё записать, но как то не получается данный код записать. Толи чего то я не понимаю в этом. Далеко не всё понятно как всё тобой сказанное записать в виде кода. Попытался записать и на второй же строчке вошёл в ступор из за не понимания как это правильно записать.
  7. Ладно и что ты предлагаешь? Как это делается? Покажи пример что ли.
  8. Так всё же и как принимаются данные? К примеру мы получаем буквенно цифровую комбинацию от другого устройства. Как нужно записать чтоб обработать этот код? И что ты предлагаешь? Как это делать?
  9. @КЭС Спасибо за наводку буду изучать как и что и смотреть дальше.
  10. Так ладно в общем нужно до конца разобраться с UART. Сейчас я выкладываю весь код и всю информацию что у меня есть. Сначала поясню что по схеме. Микроконтроллер у меня ATMEGA16. На PD2 и PD3 установлены светодиоды, На PC0 и PC1 установлены кнопки. Также установлен внешний кварц на частоту 7.3728 MHz. Теперь собственно сам код по UART. Код был взят из одного примера в просторах инета. Первоначально он был под ATMEGA8, но он вполне подошёл и на ATMEGA16. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) volatile start=1; char b; ISR(USART_RXC_vect) { b=UDR; } 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(); } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Здесь я пробовал этот код UART конечно в таком виде работает, но здесь есть некоторая непонятная ситуация. На микроконтроллер почему то принимаются значения только в цифровом виде. По другому он отказывается работать. Возможно нужно как то перенастроить что то не совсем это понимаю. А UART эта вещь такая очень нужна без него не сделать управление плеером.
  11. Вот именно такой пример я и пробовал но. Всё от дисплея я отказался не нужно тему засорять. Мне сейчас нужно будет до конца с UART разобраться. Там тоже есть вопросы. Позднее как сформулирую все вопросы напишу. Нужно ещё кое что проверить. Есть свои сложности. Оно как сказать работает, но не во всех случаях. Пока что буду смотреть и изучать документацию дополнительно.
  12. Не вижу особого смысла в этом. Самая основная проблема там в написании кода, а именно в функциях на которые студия бьёт постоянные ошибки на каждом шагу. Хотя я это всё брал из примера с одной статьи на каком то сайте. Адреса уже не помню. Возится с библиотеками так ещё сложней будет. Пусть сделаю так с семисегментниками и всё на этом. Будет и проще и понятней.
  13. @Нэцкэ Не знаю я дисплей так и не понял по программной части и от него отказался. Очень там всё сильно замудрёно.
  14. Сейчас рассматриваю эти варианты. До этого вообще не знал о существовании таких вещей. Сейчас рассматриваю и изучаю эту тему. Напрямую с микроконтроллером работать без самой микросхемы мультиплексора достаточно сложно. Однако можно попробовать поставить микросхему этого самого мультиплексора и тем самым экономить вывода. Я всё же по изучаю эту тему более подробнее.
  15. Ну что же могу сказать собрал пробную макетку не по плееру пока что просто для запуска и проверки UART написанным мною в ATMEGA16. Но впринцепи там всё совпадает по местоположению и после я допаяю эту макетку и уже проверю с плеером. А это нужно было чтоб проверить UART. Проверка показала что он вполне так хорошо работает как на передачу так и на приём. Проверял я в связке с компом через FT232. Сделал на той же скорости 9600 и внешним кварцем на 7.3728 MHz. Теперь же как я думаю нужно будет уже подсобрать дальше макетку под плеер и как то пока с компом отлаживать передачу и приём команд UART и строить свой сценарий работы плеера оперируя данными командами. После черновой наброски можно будет и к самому плееру подключаться и проверять уже с ним.
  16. По поводу самого плеера. Я всё же так подумал нужно будет собрать (запаять) временную тестовую плату на макетках и наверное всё же отладить схему самого плеера и только потом уже браться за изготовление плат плеера в устройство на постоянку. Потому как да тут нужна будет отладка и проверка плеера с моей прошивкой. И только когда я буду полностью уверен в работе можно будет собирать его в финалочку.
  17. Ну как сказать частично готово, но есть ещё не мало мест где нужно ещё поработать. По поводу сроков завершения пока не могу сказать, но скоро уже всё должно получится. Как максимум к концу года планирую всё доделать.
  18. Почему пульт будет, но в моей аудиосистеме свой пульт. И управление будет именно с него. Потому как этот плеер это всего лишь часть моей аудиосистемы. Но для начала нужно собрать, запустить и отладить уже весь плеер, а после уже заниматься интеграцией в мою аудиосистему.
  19. Мне это не важно. Там всё равно у меня стоит модуль и его я трогать не буду. Ведь я просто подключаюсь к этому модулю чтоб расширить возможности и перенастроить плеер под себя и не более. А схему чертил для себя чтобы у меня перед глазами была полная схема плеера, а то что кого то что то не устраивает не мои проблемы. Главное оно работать будет да собственно и работает.
  20. Если оно так начерчено в схеме самого модуля, то с чего я его буду убирать. И даже прозвонил сейчас в самом модуле антенна там звонится на землю. Так что в этом нет никакой ошибки.
  21. @x-revers Эта часть это схема самого модуля BT201. Антенна там стоит для приёма блютус. Так и нарисовано в оригинальной схеме модуля. BT201 schematic of kt1025a Bluetooth audio ble chip_V6 (1).pdf Я ничего своего туда не добавлял.
  22. Я делаю так как вижу со своей стороны чтоб сделать как можно проще и понятней для себя. При этом использовать то что у меня есть в наличии. Большое количество выводов меня не пугает. Ведь у меня как получается по последней схеме. Большая часть информации будет выводится через семисегментные индикаторы, а другая часть информации будет выводится на светодиоды вот и всё. Тут уже ничего сложного не будет.
  23. Там как я могу сказать питание на весь плеер через 7805 сделано которая будет питать, только этот плеер. Так что тока должно вполне хватить на все задачи. Было принято решение отказаться от него потому как он очень замудрёный в программной части. А чтоб никого не смущало надпись тоже затёр. Забыл сразу это сделать.
  24. Далеко не всегда мультиметр может включить светодиод. Уже не один раз в этом убедился.
×
×
  • Создать...