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

tifaso

Members
  • Постов

    2 048
  • Зарегистрирован

  • Посещение

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

    1

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

  1. @korsajЧего то я не совсем понимаю как данную функцию вызывать проверять с конкретными данными. Тем более что у меня в большей части данные которые я буду получать я не знаю полученную информацию там только известны первые символы и последние символы, а в середине хранятся данные которые каждый раз разные. Вот в том то и вся суть приёма данных. Чтобы можно было получить данные и вывести на индикаторы. Так что вариант сравнения строк тут наверное мало поможет. Тут как я понимаю нужно сравнивать конкретные символы и всю информацию между этими символами отдавать уже в обработку программе для вывода на индикацию. Потому как известно что сколько символов занимают данные то есть длинна принятой посылки всегда одинакова для определённого типа информации. Сейчас разбираюсь с UART в меге на передачу я уже всё сделал и оно работает, но на приём пока есть некоторые сложности.
  2. Да скорость в модуле я сразу переключил на 9600 при помощи терминала из компа.
  3. @korsaj Так сейчас вчитывался ещё раз и ничего как то на ум так и не идёт. Сложновато получается. Данную функцию да тем более с массивами на сравнение я точно не осилю.
  4. @korsaj Ну согласно твоих слов и этот код примерно тоже самое и получается. Я и не вижу особых отличий. Но нужно только как то доработать чтоб оно работало. В том то всё и дело что оно не работает. А учитывая как раз таки что мне нужны будут определённые фрагменты где хранятся данные, то это очень хорошее решение, но нужно его доработать до рабочего состояния.
  5. @Yurkin2015 Этот код по какой то причине не отрабатывает. Хотя конечно логика данного кода мне вполне понятна.
  6. Вот здесь надеюсь поможешь. Вот из за чего и поднимался весь этот вопрос с UART что какой то приём тут не полноценный получился вначале. Это для меня очень сложно с функциями, а тем более библиотеками ещё сложней. Далеко не каждая библиотека встаёт в программу и начинаются ошибки в следствии этого. Поэтому я конечно выберу вариант с функцией и без библиотек. Весь код в одном файле. Когда несколько файлов тоже какие то ошибки часто вылетают.
  7. Признак окончания приема на усмотрение @tifaso Как вариант вполне так можно использовать. И ещё я так понимаю полученную инфу нужно будет как то обрезать от всяких префиксов в начале и конце передачи при этом для каждого типа информации нужно делать это индивидуально.
  8. @korsaj Поправил у себя в коде как ты написал. Так вроде бы всё нормально, но как теперь проверять эти строки? То есть мне нужен пример самого условия на проверку строки буквенно цифровую как в плеере приём команды, а то как я не пытаюсь у меня кроме цифр от 0 до 9 ничего не принимает.
  9. @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 формате. Мне же нужно каким то образом принять эти данные и обработать их соответствующим образом. Но при этом и нужно учитывать так же что плеер может сам отправить эти данные по началу воспроизведения трека. Вот в этом сейчас и стоит основная задача. Чего я и пытаюсь получить в итоге.
  10. @korsaj Спасибо завтра на свежую голову всё проверю и посмотрю что и как получится.
  11. Ну это итак понятно, а далее то что и как делается? Написать можешь. А то я так и не соображу никак.
  12. @korsaj Да там пока и показать то нечего. Я во первых не совсем понимаю ещё в какое место правильно будет вписать этот код, а во вторых не совсем понятно как его записать. Из этого текста разве что понятно что нужно в каком то месте создать массив и сделать ограничитель по завершению команды. А вот как и куда конкретно вписать вот это и не могу сообразить?
  13. @korsaj В голове так прокручиваю написаный тобою сценарий вроде бы всё так, но в код у меня никак не получается это всё записать. Я разве что знаю как массив записать и всё тут. Так что ситуация для меня тут далеко не простая.
  14. @korsaj Сейчас попробовал разобраться как это всё записать, но как то не получается данный код записать. Толи чего то я не понимаю в этом. Далеко не всё понятно как всё тобой сказанное записать в виде кода. Попытался записать и на второй же строчке вошёл в ступор из за не понимания как это правильно записать.
  15. @korsaj Хорошо сейчас попробую такое написать.
  16. Ладно и что ты предлагаешь? Как это делается? Покажи пример что ли.
  17. Так всё же и как принимаются данные? К примеру мы получаем буквенно цифровую комбинацию от другого устройства. Как нужно записать чтоб обработать этот код? И что ты предлагаешь? Как это делать?
  18. @КЭС Спасибо за наводку буду изучать как и что и смотреть дальше.
  19. Так ладно в общем нужно до конца разобраться с 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 эта вещь такая очень нужна без него не сделать управление плеером.
  20. Вот именно такой пример я и пробовал но. Всё от дисплея я отказался не нужно тему засорять. Мне сейчас нужно будет до конца с UART разобраться. Там тоже есть вопросы. Позднее как сформулирую все вопросы напишу. Нужно ещё кое что проверить. Есть свои сложности. Оно как сказать работает, но не во всех случаях. Пока что буду смотреть и изучать документацию дополнительно.
  21. Не вижу особого смысла в этом. Самая основная проблема там в написании кода, а именно в функциях на которые студия бьёт постоянные ошибки на каждом шагу. Хотя я это всё брал из примера с одной статьи на каком то сайте. Адреса уже не помню. Возится с библиотеками так ещё сложней будет. Пусть сделаю так с семисегментниками и всё на этом. Будет и проще и понятней.
  22. @Нэцкэ Не знаю я дисплей так и не понял по программной части и от него отказался. Очень там всё сильно замудрёно.
  23. Сейчас рассматриваю эти варианты. До этого вообще не знал о существовании таких вещей. Сейчас рассматриваю и изучаю эту тему. Напрямую с микроконтроллером работать без самой микросхемы мультиплексора достаточно сложно. Однако можно попробовать поставить микросхему этого самого мультиплексора и тем самым экономить вывода. Я всё же по изучаю эту тему более подробнее.
  24. Ну что же могу сказать собрал пробную макетку не по плееру пока что просто для запуска и проверки UART написанным мною в ATMEGA16. Но впринцепи там всё совпадает по местоположению и после я допаяю эту макетку и уже проверю с плеером. А это нужно было чтоб проверить UART. Проверка показала что он вполне так хорошо работает как на передачу так и на приём. Проверял я в связке с компом через FT232. Сделал на той же скорости 9600 и внешним кварцем на 7.3728 MHz. Теперь же как я думаю нужно будет уже подсобрать дальше макетку под плеер и как то пока с компом отлаживать передачу и приём команд UART и строить свой сценарий работы плеера оперируя данными командами. После черновой наброски можно будет и к самому плееру подключаться и проверять уже с ним.
  25. По поводу самого плеера. Я всё же так подумал нужно будет собрать (запаять) временную тестовую плату на макетках и наверное всё же отладить схему самого плеера и только потом уже браться за изготовление плат плеера в устройство на постоянку. Потому как да тут нужна будет отладка и проверка плеера с моей прошивкой. И только когда я буду полностью уверен в работе можно будет собирать его в финалочку.
×
×
  • Создать...