Насчет "чистого Си" не ведаю... Однако в адуринье на основе АВРок любое прерывание "перекрывает кислород" функциям контроля времени. Ведь в прерывании ВЛОЖЕННЫЕ прерывания по умолчанию запрещены. Там или вложенные прерывания разрешать надо или делать тайм-слоты на основе программного подсчета тактов в командах.
Может для первичной обучалки адуринка сгодится? Там и симулятор приличный имеется с полным фаршем внешней аппаратной обвязки... https://www.sites.google.com/site/unoardusim/ И чего б поднабросать можно (правда не для тиньки - но основа алгоритмов одинакова будет... и просмотр пошаговый удобен...)...
Помимо прочего помним о предделителях счетчиков. Ибо те предделители тикают и переполняются сами по себе независимо - работает счетчик или нет. При запуске интервалометра необходимо предварительно сбрасывать предделитель соответствующего счетчика. Под ассемблером и с учетом тини13... Можно использовать цифровые компараторы таймера - заложить в них длительность положительной части измерямного импульса. С приходом фронта внешнего сигнала запуск таймера Прерывание по совпадению с одного компаратора - 0 (если не имело место большее по величине) - ставим флаг 0 Прерывание со второго - 1. ставим флаг 1 Общее прерывание по переполнению - ошибка интервала ставим флаг 3 и останов таймера по переполнению С момента фронта внешнего импульса запускаем программное ожидание спада положительного интервала. По окончании импульса останов счета и смотрим флаги, а уж по ним принимаем решение о том, что у нас было.
Последний раз редактировалось BOB51 Сб ноя 28, 2020 22:12:56, всего редактировалось 2 раз(а).
Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52 Сообщений: 2957 Откуда: Беларусь
Рейтинг сообщения:0
BOB51, с ардуинкой я дружу digitalwrite(), digitalread(). Кстати на ардуинке на а328 это все решено у меня с использованием библиотеке типа virtualwave или чтото похоже, ну немало я их перебла. пробовал даже в Тиньку13 прошил bootloader, но там ограниченный набор комманд, а переделка библиотек потребовала большей квалификации. Это все понятно. Но как бы чувствую в себе силы решить эту задачку на чисмтом С. Кажется, что хожу вокруг да олоко, но вот никак не могу нащупать как оно работает.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
ок, а зачем мне конролить переполнение есил я TTCR0B=0x05 делитель на 1024
В реальности всегда что-то может пойти не так. По какой-то причине "залипнет" импульс - получите непредсказуемый эффект. По-хорошему надо всегда предусматривать внештатные ситуации.
например если я подаю на вход частоту 50гц -это период 20мс. Это 2 длительности по 10м (high и low) счет 8 битный -256 значений (0-255) испльзуя делитель на 1024 =имею 1172 кгц. ОДин оборот счетчика даст мне вычислить длительность 0.000853*256=0.218с =218мс. Значит ожидаемо,что 256*10мс/0.218= примерно 11-12 единиц счетчика. А я получаю 92. Т.е 92*0.000853= пример 80 мс. Откуда эти 80мс хоть стрэляй не пойму. Кроче, что то не так а где концы искать по ка не знаю.
Такое впечатление, что у вас и правда CKDIV8 снят и тактовая просто 9.6 МГц, а не 1.2 МГц. Проверьте фьюзы. Раньше возможно прошивали их уже в этот МК и сняли этот бит.
// Настройка Timer0 TCCR0B= _BV(CS01) | _BV(CS00); // Частота счетчика: 4 800 000/256 = 75 000 Hz или 13.3mks // 13.33*256 = 3,413 ms максимальная длина,которую можно измерить
и начал думать
BOB51, dgrett, NStorm,
dgrett писал(а):
А помигать светиком да сравнить расчётную частоту с наблюдаемой? А может, все- таки 9,6 ?
да, так и сделал. Настроил счетчик, подключил осцилограф и начал считать клеточки.
в итого пришел сюда
тут стояло 9.6. Я поставил 4.8. И все у меня получилось -47 условных единиц счетчика на 10мс т.е 4.8/1024=4687.5 кгц или 21.3мкс. Это измеряемая длительность 256*21.3=54.6мс. Я измеряю 10мс, то должен получить на счетчике 256*10/54.6=46.8 Как в аптеке!
Цитата:
Такое впечатление, что у вас и правда CKDIV8 снят и тактовая просто 9.6 МГц, а не 1.2 МГц. Проверьте фьюзы. Раньше возможно прошивали их уже в этот МК и сняли этот бит.
это все пока в Протеусе.
устроил сразу небольшой брутфорс. Проверяю 3 имупльса на длительность. Если все 3 соответствуют пеерключаю лампочку.
Код:
ISR(PCINT0_vect)
{ // проверяю импульсы по LOw if ( !(PINB & (1<<BUTTON2)) == 0 ) // если встретился high То нужно сбросить счетчик что бы не учитывть длительность { statHigh=TCNT0; TCNT0=0x00; }
if (ii==0) { if ( (PINB & (1<<BUTTON2)) == 0) // если LOW { statLow=TCNT0; if (statLow==47){ii=ii++;} // измерим и получим первый имупльс ii=1; TCNT0=0x00; } }
if (ii==1) { if ( (PINB & (1<<BUTTON2)) == 0) // если LOW { statLow=TCNT0; if (statLow==47){ii=ii++;} // измерим и получим второй имупльс ii=2; TCNT0=0x00; } }
if (ii==2) { if ( (PINB & (1<<BUTTON2)) == 0) // если LOW { statLow=TCNT0; if (statLow==47){ii=ii++;} // измерим и получим второй имупльс ii=2; TCNT0=0x00; } }
if (ii==3) // Набралось 3 "правильных" импульса. Можно включать лампочку {
Ох так не стоит делать. Просто ii++; - это уже увеличит значение ii на 1. А то неровен час до вот этого дойти.
В реальном железе вместо ровно 47 проверку стоит проводить с допущением некоего отклонения. Хотя у вас довольно-таки долгие импульсы, всё-равно на +-1 стоит хотя бы допущение сделать.
Счетчик "правильных" импульсов стоит обнулять не только когда приходят 3 правильных, но и когда приходит любой "неправильный". Иначе из-за накопления какой-нибудь ошибки/помех и т.п. может опять не так как надо работать. Просто при проверке statLow добавить else ii = 0;
Добавлено after 7 minutes 15 seconds: И как я уже говорил - всегда предусматривайте внештатные ситуации и их обработку. В реальности всё не бывает так идеально, как в симуляторах. Еще стоит добавить прерывание по переполнению таймера, где как минимум сбрасывать ii тоже. В реальности у вас будет не идеальный генератор, а радио модуль. Там и эфирные помехи и чужой эфир может быть и т.д. Модуль может затупить, зависнуть. Много вариантов может быть. Их стоит предусматривать.
olegue, ко всему выражению. Вместо инверсии. Вы ведь пишете:
Цитата:
т.е получаем в данном конкретном случает 0b0000 0000
Вот к этому и относится. 0b00000000 = 0, поэтому выражение будет истиной. Если бы пин был в высоком уровне, получили бы: 0b00000001 & 1 = 1 Что уже НЕ РАВНО 0, поэтому условие IF не выполняется.
На самом деле лучше писать
Код:
if (!(PINB & (1<<PB0))) {}
когда надо проверить, что бит НЕ установлен и тоже самое, без !, когда надо проверить, что бит установлен. Потому что с ==0 еще будет работать, а когда захотите проверить что бит установлен и напишите == 1 оно будет работать только для PB0, где-то прям в этой теме я уже по-моему вам об этом писал.
для avr-gcc всех версий есть "стандартный" макрос bit_is_set (или его антогонист - bit_is_clear), который по меньшей мере при прочтении не введет в заблуждение:
Код:
if(bit_is_set(PINB, PB0)){ }
if(bit_is_clear(PINB, PB3){ }
понятно без комментариев каждому, кто знает 25 английских слов...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: Starichok51 и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения