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

Помогите написать программу


Евгений61

Рекомендуемые сообщения

Здравствуйте. Хочу попросить помощи у имевших дело с STM. В общем вопрос такой. Как можно реализовать прием информации (скажем одного байта) по длительности импульса. Т.Е. если на вход ножки поступает байт (какая то определенная команда) то нужно зажечь светодиод.

Нужен сам принцип реализации

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

48 минут назад, Евгений61 сказал:

Нужен сам принцип реализации

Принцип такой :

Подаём питание , программа начинает старт с функции main() , сразу идет инициализация периферии , в том числе и юарт. После инициализации попадает программа в бесконечный цикл. 

В прерывании юарт помещаем полученные байты в массив , а в бесконечном цикле ищем в массиве строковые совпадения с искомым , и если находим совпадение - включаем светодиод. Это принцип АТ команд . Это вкратце описан принцип работы .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я знаю что рано, программирование программирование пока осваиваю. Почему на стм невозможно?

3 минуты назад, artos5 сказал:

 

В прерывании помещаем полученные байты в массив , а в бесконечном цикле ищем в массиве строковые совпадения с искомым , и если находим совпадение - включаем светодиод. Это принцип АТ команд . Это вкратце описан принцип работы .

Это получается что сначала нужно записать код поторый получен скажем с ножки МК в память, потом уже искать нужное нам значение?

Ссылка на комментарий
Поделиться на другие сайты

Сначала в прерывании юарт загружаются приходящие на RX символы в массив скажем размером в 128 байт , потом в основном цикле ищем в этом массиве строки через case switch или if else нужные нам строки , и если нашли - выполняем действия и очищаем массив .

Но вам лучше начать с помигать светодиодом , а потом уже более сложное начинать .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

STM - не лучший выбор для начинающего. В нём очень много функций периферии реализовано "железно". Это разгружает ядро, но требует специфического подхода к программированию.Например, тот же UART работает независимо, складывая данные в память через DMA. Основная программа периодически просматривает этот буфер в памяти. Это и описал @artos5 . Большая часть программы - это настройка периферии, выделение памяти под буфер, то есть не относящаяся непосредственно к логике (получил нужный байт = зажёг светодиод). Как раз тут и засада для начинающих: нужно разобраться с тактированием разных частей периферии и ядра, работой DMA, UART. А внятной документации на русском языке нет. Придётся читать даташит и аппноуты на английском.
В AVR проще: USART после приёма одного байта вызывает прерывание, в нём и сравниваем принятый байт с нужным. Код получается короче  и понятнее для начинающего. Русской документации с примерами полно.

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, Евгений61 сказал:

Я знаю что рано, программирование программирование пока осваиваю. Почему на стм невозможно?

Это получается что сначала нужно записать код поторый получен скажем с ножки МК в память, потом уже искать нужное нам значение?

С какой, нафик :),  ножки, какой, нафиг, код!!! 

если у вас принимается какое-то значение, то это скорее всего байт. Принимается он конечно с ножки, но в процессоре вы сможете получить это значение(байт) только из соответствующего ПЕРИФЕРИЙНОГО МОДУЛЯ процессора, это скорее всего UART(USART) - Вы хоть знаете что это такое?. Чтобы этот модуль работал (просто включился) его надо инициализировать, и еще, наверно, определить прерывание, А это знаете что такое? - это НЕ язык-С - там нет прерываний и регистров нет, которые определяют состояние ПЕРИФЕРИЙНых МОДУЛей !

Так что вам сначала надо зажечь светодиод по факту приема этого кода. Найдите регистр и флаг который сообщает о приеме нового значения в UART(USART)  - это уже сверхзадача для вас, я думаю!

Когда найдете, можно будет обсуждать бесконечные циклы :)!

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

17 часов назад, Евгений61 сказал:

токо Си начал изучать

Учиться Си лучше начинать с ПК, а не МК

9 часов назад, oldmao сказал:

В AVR проще: USART после приёма одного байта вызывает прерывание, в нём и сравниваем принятый байт с нужным. Код получается короче  и понятнее для начинающего.

А в STM не так? Ровно точно так же и кода примерно столько же получается...

Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, BARS_ сказал:

USART

Мне нужно без подтверждения. т.е. микроконтроллер прянял код, обработал его и выполнил определенную команду. А с USART помоему нужно еще отправить типа МК принял команду. Поправьте если не так.

31 минуту назад, BARS_ сказал:

В AVR проще: USART после приёма одного байта вызывает прерывание, в нём и сравниваем принятый байт с нужным. Код получается короче  и понятнее для начинающего.

ТАк он сначала должен же записать его в память а потом достать и обработать?

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Евгений61 сказал:

А с USART помоему нужно еще отправить типа МК принял команду.

Может тогда стоит почитать описание интерфейса?

 

5 минут назад, Евгений61 сказал:

должен же записать его в память а потом достать и обработать?

Он записывает значение в РЕГИСТР, а что с ним будет дальше - забота программиста. И все таки надо начать с теории и 8-битных МК, тех же AVR. И обязательно на ассемблере.

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

Только что, Евгений61 сказал:

Поправьте если не так.

Конечно не так. С usart можно как угодно.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

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

Если возможно то как выглядит хотя бы примерный простейший код на си

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Евгений61 сказал:

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

Если возможно то как выглядит хотя бы примерный простейший код на си

К такому коду не применимо определение "простейший"!

Вам лучше думать, что это не возможно (на данном этапе вашей подготовки, по крайней мере :).

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

Надо все таки что то для начала почитать, а еще лучше пощупать, что бы вопросы, хоть, выглядели адекватными выбранному направлению работы-обучения.

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

BARS_, неправильная рекомендация ... Зачем ему лезть в ассемблер да еще под АВР ??? Ассемблер сильно привязан к архитектуре  и производителю МК. Это будет пустая трата времени. Я начинал из Си и ни минуты не жалею об Этом.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, artos5 сказал:

Ассемблер сильно привязан к архитектуре

Абсолютно нет. Команды там стандартные. А начинать с асма, чтобы появилось понимание, как и что хранится в МК.

 

29 минут назад, artos5 сказал:

Я начинал из Си

Я, можно сказать, тоже. Но у меня при этом не возникало вопросов про то, как и что хранится...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • #include <Wire.h> #include <Oregon_TM.h> #include <BME280I2C.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Скетч для устройства, передающего данные датчика BME280 в формате Oregon Scientific THGN132N //Принципиальная схема прилагается. //Для работы необходима библиотека https://github.com/finitespace/BME280/ //Устройство работает от 3-ех пальчиковых батареек, для экономии электричества заливать скетч нужно через ISP //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Также возможна передача данных в формате - THP (температура, влажность, давление, напряжение батареи) //Пример с приёмником поддерживает расшифоовку THP //////////////////////////////////////////////////////////////////////////////////////////////////////////// # define THGN_SEND 1 // Передавать ли данные в формате THGN132 # define THP_SEND 0 // Передавать ли данные в формате THP # define DEVICE_LOG 1 //Писать ли лог В Serial # define DONE_PIN 15 // вывод сигнала об окончании работы на таймер # define BME_WAIT 10 // Сколько мс ожидать датчик BME # define BATTERY_THR 3.5 // Порог напряжения для выставляения флага разряда батарейки (THGN) ///////////////////////////////////////////////////////////////////////////////////////////////// //Ниблы датчика THP //Во всех полях младшие ниблы идут вперёд!!! // 1-2 - тип (55) // 3 - канал (0-7) // 4-6 - (температура от -100С) * 10. Т.е. +25.1С = 1251 = 4E3h // 7-9 - Влажность *10 Т.е. 25.1% = 251 = 0FBh // 10-12 - (давление от 500ммртст) * 10. Т.е. 765мм = 2650 = A5Ah // 13-15 - данные с АЦП (A0) // 16-17 - CheckSUM // 18-19 - CRC8 (poly 0x07 start 0x00) ///////////////////////////////////////////////////////////////////////////////////////////////// Oregon_TM transmitter(4); BME280I2C bme; bool bme_present = false; float bme_temp(NAN), bme_hum(NAN), bme_pres(NAN); ///////////////////////////////////////////////////////////////////////////////////////////////// void setup() { digitalWrite(DONE_PIN, LOW); pinMode(DONE_PIN, OUTPUT); #ifdef DEVICE_LOG Serial.begin(115200); Serial.println("Waiting for BMEsensor..."); #endif //Обмен данными с BME////////////////////////////////// Wire.begin(); while(!bme.begin()) { if (millis() > BME_WAIT) break; } if (!bme.begin()) { #ifdef DEVICE_LOG Serial.println("No BME sensor found"); #endif bme_present = false; } else { switch(bme.chipModel()) { case BME280::ChipModel_BME280: bme_present = true; bme.read(bme_pres, bme_temp, bme_hum); #ifdef DEVICE_LOG Serial.println("Found BME280 sensor! Success."); Serial.print("Temperature = "); Serial.print(bme_temp, 1); Serial.println("C"); Serial.print("Humidity = "); Serial.print(bme_hum, 1); Serial.println("%"); Serial.print("Pressure = "); Serial.print(bme_pres * 0.75, 1); Serial.println("mmHg"); #endif break; default: #ifdef DEVICE_LOG Serial.println("Found UNKNOWN sensor! Error!"); #endif bme_present = false; } } //Напряжения батареи/////////////////////////////////////////// word battvotage = (word)(((float)(1.1 * 16368) / Vbg()) * 100); #ifdef DEVICE_LOG Serial.print("Battery voltage = "); Serial.println(battvotage,HEX); #endif //Подготовка и отправка данных THGN////////////////////////////////////// transmitter.protocol == 2; if (THGN_SEND) { transmitter.setType(THGN132); transmitter.setChannel(3); transmitter.setBatteryFlag(battvotage < BATTERY_THR); if (bme_present) { if (bme_hum > 98) bme_hum = 98; if (bme_hum < 2) bme_hum = 2; if (bme_temp > 70) bme_temp = 70; if (bme_temp < -50) bme_temp = -50; transmitter.setTemperature(bme_temp); transmitter.setHumidity(bme_hum); transmitter.setComfort(bme_temp, bme_hum); } else { transmitter.setTemperature(-49.9); transmitter.setHumidity(2); transmitter.setComfort(-49.9, 2); } transmitter.SendPacket(); } // Если отправляются оба формата пакетов, межу ними надо выдержать паузу if (THP_SEND && THGN_SEND) delay(100); //Подготовка и отправка данных THP////////////////////////////////////// if (THP_SEND) { transmitter.setType(THP); transmitter.setChannelTHP(1); transmitter.setBatteryTHP( battvotage); if (bme_present) { transmitter.setTemperatureTHP(bme_temp); transmitter.setHumidityTHP(bme_hum); transmitter.setPressureTHP(bme_pres * 0.75); // перевод Pa в mmHg } else { transmitter.setErrorTHP(); } transmitter.SendPacket(); } #ifdef DEVICE_LOG Serial.println(); Serial.print(millis()); Serial.println("ms"); Serial.println(); #endif //Команда на отключение питания digitalWrite(DONE_PIN, HIGH); } ///////////////////////////////////////////////////////////////////////////////////////////////// void loop(){} ///////////////////////////////////////////////////////////////////////////////////////////////// int Vbg() { ADMUX = (1<<REFS0)|(0<<REFS1)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0); long buffersamp=0; for (int n=0x0; n<=0xff; n++ ) { ADCSRA = 0xc7; while (bit_is_set(ADCSRA,ADSC)); buffersamp += ADC; } buffersamp >>=4; //16368 full scale 14bit ADCSRA &= ~(1 << ADEN); // отключаем АЦП return buffersamp; } Вот код программы. Пробовал по разному и от 5в запитывал и всю систему от 3,3 в. Причем голая ардуинка с таймером работает в нормальном режиме некоторое время, но потом все равно слетает и начинает питать мк постоянно( Причем это происходит всегда через разный промежуток времени.
    • На фото может быть название , характеристики и т.д. И по этому фото я смогу выбрать такой же в инете.. самому мне не собрать..
    • А что даст фотка? Тот же щуп, только чуть крупнее и с проводами питания.
    • Для меня наверное лучше купить готовый.. цель повысить чувствительность до 1 mV.. Наверное на Авто стоит покупать , мне бы фотку какую нить..такого активного щупа..))
    • Так на схемах обозначается подключение к сети 220 В.
    • Привет, радионарод! Вот, решил показать, рассказать и дать попробовать свою придумку, как я внешнюю синхронизацию к "ослику" прикрутил. DSO138 уже не так популярен, но кто-то пользуется, кому-то быть может пригодится. Подробной информации по таким доработкам в сети не встречал, так что делюсь, чем сам измыслился. Собственно, схема. Немного фоточек. С "ослика" не пугайтесь, не умею я делать красивые корпуса с красивыми мордами лица к ним. Двухканального функционального генератора с возможностью двигать фазу у меня нет, поэтому какая-то программа-генератор из Интернетов, звуковая карта и DSO138. Смотрим синус, т.к. меандр из звуковухи никакой. Конечно, видна погрешность в измерениях. Прибор-то - игрушка. Да и генератор не блещет точным сигналом. Полноценного аналога внешней синхронизации (как у аналоговых приборов) не получится, но даже в таком виде эта доработка расширяет функционал осциллографа и дает в некоторых случаях возможность изучать два сигнала. Как пользоваться. Из иных доработок. Как видите, дурацкие ползунковые переключатели заменены на сдвоенные галетники на три положения. Кнопки поставлены большие тактовые 12х12 мм. Подпаяны паралельно, старые удалять не нужно. Светодиод тоже в паралель. Питание батарейное, от аккумулятора старого "умнофона". Полтора ампер-часа, наверное. Плата зарядки, плюс повышайка с фильтрами по питанию. Корпус алюминиевый от "не-знаю-как-правильно-называется", там жесткий диск стоял с парой ветродуйчиков. Гетинакс, оргстекло.   Короче, удачи!
×
×
  • Создать...