Jump to content
admin

Видеокурс по AVR-микроконтроллерам для начинающих

Recommended Posts

у меня есть электро велосипед сделанный самостоятельна с напряжением питания 48 вольт

вот и хочется сделать ампервольтомметр для него

обычный можно было поставить но есть в нем рекуперация когда я торможу велосипед то энергия возвращается обратно в аккумулятор

пускай и не вся вернется

но приятно что не зря и тормоза лишний раз не трутся

вот и спрашивал как реализовать мне измерения при разряде аккумулятора и заряде его

Share this post


Link to post
Share on other sites

Tantrum

показывайте схему в протеусе - уверен ошибка в ней


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

у меня тоже питание подходит к ножки 26 не превышающие 2.56 вольт

показывает отрицательное напряжение

post-180469-0-74708000-1399750605_thumb.jpg

Share this post


Link to post
Share on other sites

Вебинар "Разбор новых уникальных модулей FMAC и CORDIC в микроконтроллерах общего назначения STM32G4" (15.07.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре 15.07.2020, посвященном новому семейству микроконтроллеров общего назначения – STM32G4. Вебинар рассчитан на технических специалистов и тех, кто знаком с основами цифровой обработки сигналов. Мы разберем алгоритм работы CORDIC, а также рассмотрим пример создания цифрового фильтра на базе FMAC.

Зарегистрироваться на вебинар

так ребят. давайте так если хотите помощи - выкладываем скрин и код и архив с проектом студии и протеуса.

Я ж не могу по скрину схемы определить код и наоборот.

А перед тем как ето сделать пересмотрите урок! обратите анимание на детали. Гдето вы допускаете ошибку! если выводит отрицательное число - выводите отрезки и смотрите на полученное число оно должно быть строго в пределе 0...1023

если отличается ищем почему

И главное - не переписывайте мой код с экрана! Я знаю зачем у меня в коде каждая скобка и символ а вы - нет!

ПОСТАРАЙТЕСЬ ухватить смысл и написать по своему.

Зачем например использовать мои формулы и делители с 30 вольт на 2.56 - пробуйте свои!

Тренируйте мысль! - в конце концов - всегда можете подать на вход ацп 2.56 вольта с батарейки и посмотреть результат!

Может у вас Делитель/ОУ/Датчик - неверное настроен/расчитан

Судя по последним вопросам и их тематике - код у вас более или менее правильный на первый взгляд а вот пробои идут по схеме !

Edited by kobraz

коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites
                     

Новые контроллеры VIPerPLUS для ИП – видео и материалы вебинара STMicroelectronics

Видеозапись и материалы вебинара ST о семействе AC/DC регуляторов VIPerPLUS производства компании STMicroelectronics. Инженерами ST было детально рассмотрено новое семейство микросхем VIPerPLUS со встроенным транзистором, их возможности и топологии применения. Продемонстрировано испытание из лаборатории ST в Праге и моделирование в среде E-DesignSuite.

Подробнее

                     

Конденсаторы ECWFG от Panasonic: теперь и для высоковольтных применений

Компания Panasonic анонсировала существенное расширение серии пленочных конденсаторов ECWFG: на сегодняшний день диапазон рабочих напряжений серии составляет 630…1100 В (DC). Серия ECWFG поддерживает уникальную функцию микропредохранителей.

Подробнее

Как откуда, функция readADC() возвращает знаковое int. Кстати если преобразование 10-битное, то там конкретный косяк: при сорока измерениях вблизи верхней границы tmp тупо переполнится. И функция вывода, видимо, честно это выводит.

ЗЫ. Перепишите участок кода как

for (char i=0;i<32;i++){
ADCSRA |= (1<<ADSC);
while ((ADCSRA &(1<<ADSC)));
tmp +=ADC;
}
return tmp>>5;

Переполнения не будет, заодно и от деления ненужного избавитесь. При усреднении лучше выбирать числа кратные 2 в степени n. А потом сдвигами делить.

Edited by Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Share this post


Link to post
Share on other sites

Друзья, задам наверное глупый вопрос, но все же задам.=)

Пришел мне с ебэя программатор USBASP. Пока он шел, я вообще все позабыл про микроконтроллеры. Как мне подключить сам микроконтроллер к этому программатору? Есть инструкция какая-нибудь? Нужны ли резисторы или стабилизаторы? Что и к каким ногам цеплять? Может есть у кого печатка в Layout? Буду благодарен за ответы. Туплю чет вообще =)))

Такой программатор http://www.ebay.com/itm/141204958327?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Edited by sensor2

Share this post


Link to post
Share on other sites

Goodefine

Спасибо! Вы абсолютно правы! Перебор получился!

2 ALL

Ребята там действительно идет переполнение. Слишком большое число для такого типа переменной.

По сему - либо делаем меньше циклов, для среднеарифметического (например 20) либо меняем тип переменной temp

вместо

int temp=0;

пишем

unsigned long int temp=0;

Goodefine - еще раз спасибо!


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

sensor2

"Пока он шел, я вообще все позабыл про микроконтроллеры. " :shok:

Смысл Вам отвечать, если через день все равно забудете. :(

Не в ту тему обратились. Ищите ответы в иных топиках.

Edited by mvkarp

Share this post


Link to post
Share on other sites

Друзья, задам наверное глупый вопрос, но все же задам.=)

Пришел мне с ебэя программатор USBASP. Пока он шел, я вообще все позабыл про микроконтроллеры. Как мне подключить сам микроконтроллер к этому программатору? Есть инструкция какая-нибудь? Нужны ли резисторы или стабилизаторы? Что и к каким ногам цеплять? Может есть у кого печатка в Layout? Буду благодарен за ответы. Туплю чет вообще =)))

Такой программатор http://www.ebay.com/...984.m1497.l2649


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

читайте выше - нашли причину минуса 8 у меня не откроется


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

ADCSRA |= (1<<ADSC);

while ((ADCSRA &(1<<ADSC)));

Объясните зачем проверять бит adsc на единицу, судя по уроку там должен быть adif, ошибка?

Edited by rv3sbq

Share this post


Link to post
Share on other sites

нет. ошибки нет - это один из методов.

ADSC изнасально равен 0

После того как мы присваиваем ему 1 начинает выполнятся преобразование

после его окончания бит сбрасывается на 0

вот мы и ипользуем его что бы всегда дожидаться окончания преобразования перед следующим шагом


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

И снова не получается....

В протеусе выдает "-23,0" и "13,1". Вообще не пойму, откуда там отрицательное число взялось....

подстроечные резисторы RV1, RV2 попробуй выставить 60% +-1

Share this post


Link to post
Share on other sites

Dimka_ibn_Mishka

Выставил 60% показывает 23,5 и 12,3. Первое значение больше на 0,1 от источника. 61% дает результат со 100% точностью.

Share this post


Link to post
Share on other sites

Ну вот ! Пошли по маленьку... вот думаю стоит ли продолжать уроки или каждый сам уже соберет готовое устройство ?

Edited by kobraz

коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

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

Ну а вот если допустим мерять напряжение любое, которое поступает на ногу ADC0, например. Возьмем это напряжение за х:

Нам надо разделить х на опорное напряжение 2,56 и получим коефициент n. Для того, чтобы отобразить на дисплее нам нужно обратно n*х и по идее мы получим наше напряжения. Но нужно еще разделить на 1023?

Share this post


Link to post
Share on other sites

Чтобы перевести число с ADC в вольты, нужно опорное разделить на кол-во шагов (дискрет) ADC, получим вольт/дискрету, затем умножить на полученное с АЦП значение.

Математика 5 - пропорции ..., ёпрст...

Share this post


Link to post
Share on other sites

Вспомните в уроке момент про то как мы вычисляем сколько проедет автомобиль на заданном количестве литров если известен расход на сотку!

Тут точно тот же принцип!


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

Да тут обычная пропорция

Vref - 1024
 X  - ADC

Отсюда X найти - элементарно...

ЗЫ: Извините конечно за грубость, но человеку, непонимающему подобных элементарных вещей, в программировании делать просто нечего. Математика будет встречаться постоянно.

Share this post


Link to post
Share on other sites
как с цифровыми датчиками пользоваться
С какими конкретно ? Уточняйте...

Share this post


Link to post
Share on other sites

Андрей - подумайте логически:

Зачем вам урок ? Датчик или не датчик - возвращает какоето напряжение - которое вам нужно измерить и перевести к нормальному виду.

Предел измеряемого напряжение на АЦП от 0 до 2.56В (или если ИОН внешний 5В)

Значит вам нужно с датчика или ослабить (делитель) или усилить напряжение до такого что бы в максимальном значении датчика на вход ацп поступало напряжение не большее чем ИОН.

Вы не можете подать в качестве ИОН 220 вольт и сравнивать с ним...

Программирование ето прежде всего не умение написать операторы в студии! Это понимание и составление алгоритма!

Вот возьмите листик и ручку и напишите программу без формул - а своими словами ! Создайте логические блоки.

После того как сделате это - без прблем опишите ето уже на Си - НО !!!!

Для примера - мне надо написать программку которая будет каждую секунду пинговать гугл и если он не пингонулся - записать ето в лог.

Я знаю как это сделать в голове - поэтому мне всеравно на чем ее писать на Си или Python. Разница только в синтаксисе.

Может вам так не совсем очевидна мысль что я вам хочу донести - давайте рассмотрим еще пример:

Вы ремонтируете машины. Вы можете починить двигатель как на 2108 так и на 21099! Двигателя разные но принцып у них одинаковый. Потому что вы понимаете суть!

Так же и в программировании - нужно понимать суть - сам язык всего лишь метод вывода мысли на екран...

Кроме того тема у нас не сложная пока что и высшая математика не используется!

Для вас же не сложно вычислить расход бензина у автомобиля на 100 км ? В чем тогда трудность посчитать ацп если мы знаем что на 1023 метра мы тратим 2.56 литра бензина ?////


коплю на мечту - Днепр К750

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Спасибо, что честно  признались в том, что   параметрическая компенсация искажений - это  блажь теоретиков, не имеющая реального места в практическом применении... 
    • Почему не взял готовую (правильную) схему? Это не схема, это детский рисунок, который совершенно не сходится с текстом. Должно... Смотря какой диапазон воспроизведения. Для басового диапазона 20...100 Гц можно и один. Корпуса для такого динамика в домашнем исполнении хорошо играют - Экспо порт и обратнонагруженный рупор (ИМХО). Динамик должен соответствовать минимальным требованиям. Нельзя поставить в такой корпус динамик, с диапазоном воспроизведения от 100 Гц и резонансной частотой 150 Гц. Для звука во всём диапазоне ты выбрал верное направление - двухполосную систему. Вот только в двухполосной системе динамики должны быть соединены параллельно. И на каждый динамик требуется фильтр частоты. Один динамик должен воспроизводить от, допустим, 50 Гц до 5000 Гц, а второй должен воспроизводить от 5000 Гц до 18 кГц. Просто соединив параллельно или последовательно разные динамики ты ничего не получишь адекватного. Динамик, НЕ резистор. Его сопротивление 4 Ом - для постоянного тока. А когда динамик играет, то есть на него подаются сигналы разной частоты, у него сопротивление на резонансной частоте 20 Ом и более. В итоге, соединим два динамика последовательно, ты соединишь два резистора с сопротивлением 50 Ом и 6 Ом. То есть, играть не будет один из динамиков, и наоборот, другой динамик перестанет играть на другой частоте. Что касается стерео или моно - моно только для сабвуфера годится. Так как НЧ не локализуются, и обычно сабвуфер в комнате (маленького размера) приходится располагать в противоположном углу комнаты от слушателя (так как в центре помещения НЧ отсутствуют полностью). В ином случае напомню, что у человека обычно ДВА уха.  Соответственно, как ты собираешься слушать музыку одним ухом, мне не совсем понятно... Музыка, это инструменты, голос, и их расположение в пространстве. (хотя расположение образов в пространстве и формирует зрительная часть мозга, однако слуховой (мозговой) аппарат должен понимать, с какой стороны звучат инструменты). Вся музыка записывается в стерео, и глупо две РАЗНЫЕ партии инструментов соединять в одну - каша из одного динамика получается ведь.
    • а почему не 16? подключено же последовательно,а не паралельно
    • \r\n не пиши Новый софт: BLT_ZU_DEMO9600.apk  Прошивка baud 9600 Changer_v9.04bd9600.hex если не получается перевести 128000, а посмотреть охота. Прошивка baud 128000  Changer_v9.04.hex
    • гляньте расчет - а то я ша насчитаю) время t - 17 мкс U - 10 вольт(питание) I - 13.6А (3вольта /0.22 Ома (шунт) .) = 10*17/13.6 = 12.5 или 0.125милигенри и показания прибора - верно посчитал ?    
    • Это крайний ,  нежелательный вариант . А вообще конечно очень похоже , можно попросить ссылку на то что у Вас на картинке ?
  • Similar Content

    • By Rad TV
      Скетч простой и кислий. Сделан автором RadTV канал:https://www.youtube.com/channel/UC1k5elIKErFnmwTzIsRgQrA?view_as=subscriber
      Буду рад рокомендациях и помощи!Сделал сам проект должен бить простим и  что би влезло в ATtini85!
      Есть защита акб и просто парения (!!!Кнопка на розмикания!!!)
      Обновления будут!!!!
       
       
      RadMOD ver1.0.txt
    • By Prozac
      Здравствуйте, уважаемые форумчане! Вообще говоря, не имею такой привычки - донимать людей вопросами, и до всего стараюсь доходить самостоятельно. Но в данном случае без "помощи зала" совсем никак: перепробовал уже все, что только смог придумать - а "воз и ныне там! Поэтому и обращаюсь сюда - возможно, кто-то уже сталкивался с чем-то подобным, и сумел найти решение...
      Суть проблемы в следующем: решил построить ШИМ-контроллер для автомобильного вентилятора охлаждения ("карлсона"), но никак не могу заставить его работать - как только открываются VT2 и VT3, подключая нагрузку, МК уходит в резет или виснет (чаше - первое)!.. Сбросившись, опять пытается подключить нагрузку, и опять резетится, и так - без конца! Причем, изначально решил испытать схему не на индуктивной нагрузке (электромоторе), а на вполне себе пассивной 60Вт (около 3A по току) лампочке из фары - и та же фигня: МК пытается запуститься, сбрасывается, лампа моргает, дергается... Даже не ШИМ, а обычное мигание лампой с частотой 1Гц через несколько вспышек или вешает МК, или резетит его (что видно по сбою ритма моргания). При этом без нагрузки - по осциллографу, подключенному к ноге 5 МК или к нижнему (по схеме) выводу R7 - все отлично: наблюдается ровный и чистенький ШИМ-сигнал, изменяющийся согласно тестовой программе! Однако, стоит подать нагрузку, как осциллограмма начинает прыгать: появляются ШИМ-импульсы, затем ровная линия, затем снова импульсы с тем заполнением, которое должно быть в самом начале программы... Собственно, это наблюдение и позволило сделать вывод о том, что МК перезагружается.
      Естественно, первая мысль - слабый лабораторник (он у меня импульсный, самодельный, где-то на 3А - действительно слабый; но та же петрушка наблюдалась и при попытках питать устройство от трансформаторного ЗУ на 10А). Ну, пригнал машину, снял с нее аккум (100% свежий и не дающий просадок!), запитал от него - однако проблема повторилась... Значит, дело не в питании!.. Пробовал много различных танцев с бубном: отключал внешнюю цепочку сброса R2-C2 (результат - ноль), включал BOD микроконтроллера (стало еще хуже), подвешивал вместо C4 и C6 электролиты большей емкости (не помогло)... Думал, что, возможно, кондеи C4 и C6 разряжаются через R7 - экспериментировал с его сопротивлением (от 100 до 960 Ом), перекидывал его верхний вывод на анод VD1 (чтобы отсечь резистор от фильтрующих C4 и C6) - тщетно... Грешил даже на то, что какие-то проблемы вносит емкость затворов VT2 и VT3 - уменьшал сопротивление R10 и R12, дабы затвор быстрее "разряжался" - безрезультатно...
      Игрался с частотой МК и ШИМ - перебрал частоты ШИМ от 18 до 4687 Гц; пытался запускать нагрузку с разным заполнением ШИМ, от 10 до 40% - как глючило, так и глючит... Т.е., перелопатил, практически, всю схему!
      Удалось заставить устройство нормально работать на лампу, и даже на пару спаралеленных электродвигателей МЭ218 (от "печки") следующим образом: R8 был исключен (вместо него - перемычка), а C7 (изначально - К73-17В всего на 0,47мкФ) был заменен на пару электролитов по 1500мкФ, включенных плюс к плюсу последовательно (для устранения полярности кондеев). Нагрузка стала нормально подключаться, отрабатывать как на повышение, так и на убывание заполнения ШИМ. Двигатели отлично работали как при ступенчатом изменении ШИМ-заполнения, так и при плавном. Единственное, что при попытке подать на двигатели ШИМ с заполнением менее 20%, МК опять начинал дергаться и резетить, а так же резетил при резком отключении движков: если раскрутить их до 100%, а потом снять сигнал, то МК перезагружался; однако, если после 100% плавно понижать обороты где-то до 40%, и лишь потом снимать сигнал, то схема работала нормально. Плюс, очень сильно нагревались электролиты C7...
      Однако, когда принес схему в машину - для отладки непосредственно в "боевых условиях", и подключил мощный двигатель вентилятора, началась старая песня с резетами...
      Сейчас, вроде бы, "осенило" - поменял VD2 на Шоттки 1N5822 - лампочка запустилась на "ура" даже без С7; так же отлично и мягко стартовала спарка из МЭ218 - радостный побежал к машине... Но с "карлсоном" - опять мимо: МК вновь ушел в перезагрузку... Все: я не знаю, что тут делать - каждую деталь уже перелопатил, и кучу вариантов испробовал!!! Но ничего не понятно(( Вот и прошу помочь: может быть, кто-то уже был в такой ситуации, и как-то решил подобную проблему?
      VT2 и VT3 стоят "фирменные", IR-овские (не Китай) - из "Чип и Дипа". ATtiny13 - с Алиэкспресс; чтобы исключить возможность брака конкретной микросхемы, пробовал ставить в схему несколько разных экземпляров МК (из одной посылки). DS18B20 пока еще не подключал (нужно разобраться с ШИМ!). IRF3205 каскадированны для уменьшения нагрева (хотя его и так практически нет), и для дополнительной надежности (чтобы в случае выхода из строя одного транзистора не перегреть машину). Тестовую программу специально написал "китайским стилем", без циклов и т.п. - чтобы она была максимально простой, наглядной и линейной - для уверенности, что не в ней дело.
      Подскажите пожалуйста - откуда эти резеты, и как с ними бороться? Как заставить схему отрабатывать на мощную нагрузку? Заранее благодарю!!!
       
       
      ;*************ТЕСТОВАЯ ПРОГРАММА************* ;============ДИРЕКТИВЫ ТРАНСЛЯТОРУ=========== .device ATtiny13 .include "tn13def.inc" .list ;Обзывательство регистров .def Temp = R16 .cseg .org 0x00 ;=========ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ======== rjmp Begin //Начальный сброс reti //Внешнее прерывание INT0 reti //Изменение состояния любой линии reti //Переполнение T0 reti //Готовность EEPROM reti //Срабатывание компаратора reti //Совпадение в канале A таймера T0 reti //Совпадение в канале B таймера T0 reti //Переполнение сторожевого таймера reti //Завершение преобразования в АЦП ;============МОДУЛЬ ИНИЦИАЛИЗАЦИИ============ Begin: ;-----Инициализация стека ldi Temp, RAMEND out SPL, Temp ;-----Отключение компаратора ldi Temp, 0x80 out ACSR, Temp ;-----Настройка портов ldi Temp, 0b00000111 out DDRB, Temp //PB0 - на вывод ;-----Настройка ШИМ ldi Temp, 0b11000001 out TCCR0A, Temp //Режим - быстрый ШИМ с инверсией ldi Temp, 0b00000010 out TCCR0B, Temp //Делим тактирование таймера на 8 rjmp Start //При старте пропускаем 5-секундную задержку ;===============ТЕСТОВЫЙ ЦИКЛ================ PWM: ldi Temp, 0b00000000 out OCR0A, Temp //ШИМ=0% rcall Delay5sec //Ждем 5 сек ;-----Повышаем скорость Start: ldi Temp, 77 out OCR0A, Temp //ШИМ=30% rcall Delay2sec ldi Temp, 102 out OCR0A, Temp //ШИМ=40% rcall Delay2sec ldi Temp, 128 out OCR0A, Temp //ШИМ=50% rcall Delay2sec ldi Temp, 154 out OCR0A, Temp //ШИМ=60% rcall Delay2sec ldi Temp, 179 out OCR0A, Temp //ШИМ=70% rcall Delay2sec ldi Temp, 205 out OCR0A, Temp //ШИМ=80% rcall Delay2sec ldi Temp, 230 out OCR0A, Temp //ШИМ=90% rcall Delay2sec ldi Temp, 255 out OCR0A, Temp //ШИМ=100% rcall Delay2sec ;-----Понижаем скорость ldi Temp, 230 out OCR0A, Temp //ШИМ=90% rcall Delay2sec ldi Temp, 205 out OCR0A, Temp //ШИМ=80% rcall Delay2sec ldi Temp, 179 out OCR0A, Temp //ШИМ=70% rcall Delay2sec ldi Temp, 154 out OCR0A, Temp //ШИМ=60% rcall Delay2sec ldi Temp, 128 out OCR0A, Temp //ШИМ=50% rcall Delay2sec ldi Temp, 102 out OCR0A, Temp //ШИМ=40% rcall Delay2sec ldi Temp, 77 out OCR0A, Temp //ШИМ=30% rcall Delay2sec rjmp PWM //Возвращаемся, и начинаем с 5 сек "молчания" ;===========ПОДПРОГРАММЫ ЗАДЕРЖКИ============ ;-----Задержка в 2 секунды Delay2sec: ldi R17, 253 ldi R18, 75 ldi R19, 29 L1: subi R17, 1 sbci R18, 0 sbci R19, 0 brcc L1 nop ret ;-----Задержка в 5 секунд Delay5sec: ldi R17, 253 ldi R18, 61 ldi R19, 73 L2: subi R17, 1 sbci R18, 0 sbci R19, 0 brcc L2 nop ret  

    • By Дмитрий Чуков
      Необходимо составить программу, которая формирует сигнал с частотой 1 кГц и скважностью 4 при помощи таймера. В CodeVision AVR написать программу и после в протеусе проверить, целый день уже бьюсь, не могу разобраться с таймерами. Вроде задача не трудная, если бы увидел, как это должно выглядеть в коде... Как настроить таймер для ATMega8A и решить эту задачу?
    • By Стас73
      Доброй ночи, уважаемые.
      Прошу Вашего совета по следующей куче проблем для меня, т.к. не соображаю в электронике, схемах, резисторах и подобному, но дружу с компом и есть желание сделать определенный механизм, но пока нет наставления на путь истинный от специалистов)
      Задача состоит в следующем - хочу мотор стеклоочистителя подключить к Ардуино, но управлять им необходимо с кнопки. Шилд, например, который обрабатывает сигнал нажатия на кнопку (допустим кнопка записи), при ее активации, нажимаю на другую кнопку, которая дает команду движку вращаться по часовой стрелке. Отпускают ее, моторчик останавливается. Другая кнопка, вращение в противоположную сторону. Т.е. записал последовательность и продолжительность вращений,  нажимаю вновь на кнопку запись и мои действия сохраняются. Далее на 4 кнопку жму и моя игра с моторчиком автоматически воспроизводится. Если такое выполнимо с помощью плат и шилдов без доп программирования логики, то буду ОЧЕНЬ  признателен если расскажете как вкратце это осуществить или кинете ссылки к примеру на Али с нужными товарами. Если легковыполнимо, то в будущем наверное уже разберусь,  как обойтись без нажатия на 4 кнопку (воспроизведения записанных действий) и запускать этот процесс, подключив датчик движения или звука.
      Если необходимо описывать логику или создавать типа какого-то протокола, что шилд (?) умел понимать, что я от него хочу, то подскажите среду разработки для неба, что б там по минимуму было наворотов) В принципе с основами c++ для Ардуино скорее всего придется ознакомиться. 
      Заранее спасибо!
    • By Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
×
×
  • Create New...