так и происходит, если верить даташиту. ну, можно снять запрет. Тогда привет оверстек)) вроде в тех же даташитах написано, что в случае ОДНОВРЕМЕННОГО запроса на прерывание. Одновременно я понимаю как один машинный такт. В XMEGA и новых аттиньках есть и карусель, и приоритеты, и пропуск вперёд неприоритетных прерываний.
Хорошая заметка. Но зачем загонять себя в искусственные рамки? АВР изкаропки поддерживает 20 Мгц. Кто-то пишет, что и 25. А вот 30 - какие-то МК заводятся, какие-то нет. Ну и кварц должен быть не гармоническим.
Здравствуйте всем. спасибо за ответы. Собираюсь заново написать прошивку для дозиметра, используя полученные сокровенные знания. конечно еще много непонятого и неизведанного, но по крайней мере таймеры теперь не выглядят чем то фантастическим. (примерно как банка с тушенкой для людоеда племени "тумба юмба", который уже знает что такое банка и что внутри нее есть тушенка с перловкой, но пока не совсем понимает как эту банку правильно открывать). где то валялась моя старая тема про дозиметр, но лучше новую создам. Алгоритм видится не сильно сложный. прерывания по спаду на 2, 3 пине, по быстрому инкрементируют перемененную счетчика. по питанию выставить для компаратора внешнее опорное напряжение. внешние потому что неизвесто сколько выйдет после многомегаомного делителя с датчика. проще внешнее опорное подстроить чем ловить делителем 1.1в. при падении напряжения на компараторе ниже 395 в (5 вольт в запасе на всякий случай, как предохранение от повышенного напряжения) создам прерывание, которое быстренько выставит флаг, что нужно включить накачку. дальше в основном цикле по флагу включается шим на 5 ноге, от которого через мосфет и дроссель накачивается конденсатор датчика. едиственно пока не решил как сделать. оставить этот процесс просто в основном цикле или выделить в while цикл, чтоб пока не поднялось напряжение до нужного, Дуня ничем больше не занималась. Код (C++): while (X<395) { TCCR0B=TCCR0B&0b11111000|0x01; analogWrite(5, 20); } while условие сделать по простоянной проверке с АЦП или по флагу с компаратора когда поднимется выше нормы=> еще одно прерывание снятие флага накачки=>выход из цикла. в остальное время в основном цикле подсчет, вывод на экранчик. при таком подходе не должно быть пропусков регистрируемых импульсов с датчика. (очень хочется достичь этого, чтоб не высчитывать потом всякие поправочные коэффициенты, которые к тому же ни разу не линейны, но это идеал, мечта) в ранней теме про дозиметр, предлагали регистрацию импульсов построить исключительно на счетчиках. тогда я не осилил это предложение. сейчас немного вьезжая в тему могу предположить, что это не очень удобно. для замера фона и анализа образцов да вполне. счетчик считает импульсы раз в пол секунды забирать оттуда значения и дальше извращаться вычислениями. но такое решение неудобно для режима "поиск" где на первом месте идет регистрация импульсов в реальном времени. можно конечно вывод подсчитанных импульсов сделать раз 10 в секунду , но это будет уже не то, имхо. так что пока собираюсь писать скетчик по алгоритму, что написал выше. единственно не понял как красиво остановить генерацию шим. пока ничего умнее чем Код (C++): void setup() { TCCR0B=TCCR0B&0b11111000|0x01; analogWrite(5, 256); } void loop() { } не придумал. можно и таймер оставить, как я понял но это совсем не к чему. всем удачных выходных и отличного окучивания картошки
Доброй ночи всем, и на всякий случай доброго утра. Нубский вопрос. Код (C++): TCCR0B &= (~(Bit(CS00) | Bit(CS01) | Bit(CS02))) случайно аналогом этой записи не будет Код (C++): TCCR0B |= B11111000; ? 5старших бита выставил в единицы для примера. И ещё момент, изучая скетчи обратил внимание на момент иногда пишется простое присваивание, для примера Код (C++): TCCR0B = B11111111 Код (C++): А иногда TCCR0B |= B11111111 в чем ньюанс? Симулятор проглатывает и так и так, и все работает.
Первый случай - НЕТ, ибо там указанные биты заменяются нулями (остальные без изменений). Второй случай - ДА, второе можно заменить первым, но только для 0xFF!!! В плане скорости будет быстрее, но компилятор сам это оптимизирует. А вообще подучи булеву алгебру!!!
Пичаль((( в телефоне отключил автопроверку, чтоб не мешала всякие умности писать а по русскому (когда я учился его ещё преподавали в школе) были тройки(, по химии 2, зато физика и математика 5). Правда булеву алгебру мы не проходили даже в институте. Была высшая математика, но преподаватель вел какой то не от мира сего. Приходил что то писал на доске, что то бубня под нос. Иногда оборачивался спрашивал все ли понятно. Мы дружно кивали головой , говорили угу и продолжали играть в карты и пить растворы С2Н5ОН.
Все! Понял когда =, а когда |=. Помогла статья www.atmega8.ru/wiki/view/doc.20.html. одно плохо в симуляторе когда ставишь предделитель timer0 в 0, останавливается millis(), и скетч виснет вместе с симулятором). Некогда "железную" Дуню подключить проверить, что с ней будет при остановке таймера.
Ну так работа millis() зависит от Timer0. Этот таймер, а точнее его переполнение, как раз и используется для подсчёта миллисекунд с начала запуска МК. Переполнение возникает с частотой ~976 Гц, т.е. переполнение срабатывает примерно каждую миллисекунду. В обработчике прерывания по переполнению есть коррекция, что бы миллисекунды правильно считались.
Долго мучал моск. Пока придумал 2 выхода . Останавливать генерацию сигнала тупо Код (C++): analogWrite(5, 256); [/code или соображать счётчик времени на вачдоге, экзотика конечно , но на большее тяму не хватает. Можно генерировать ШИМ таймерами 1-2 , но они всего 31000 гц. Дают а этого мало. Нужно чтоб накачка занимала максимум 1-5 мс. Блин пойду спать мож приснится что
Все три таймера в ATmega328P (Arduino UNO) дают частоту 62.5 кГц, а при определённых настройках могут дать и 8 МГц.
Затем, что там какой-то millis встаёт. Если бы другое что вставало, я бы понял, а так на хер он нужен?
Ну тут, уже все определяться, что больше нужно, либо wiring и millis, что надежно работает, либо прямое программирование таймеров. А тут уже Вы несете ответственность за нарушение работы внутреннего функционала ардуино, работающего непосредственно с железом. Обычно, при первой попытке непосредственного программирования таймеров, натыкаешься на проблему с millis(), и если понял, дальше уже все гладко, если нет - люди возвращаются к wiging и millis().
90% просто копипастит чужой код. Из них чуть вносят подстройки под себя. Зачем съезжать с ардуино не будучи рабочим в этой области?