при этом отпадает необходимость прописывать <interrupts.h>
Если вы в своём заголовочном файле пропишете, заголовочные файлы, что там использованы, потом в основном как раз не нужно будет думать о том что прописывать.
Вроде так.
DX168B писал(а):Я обычно пишу хейдеры, в которых просто пишу свои функции.
вы делаете неправильно. в хидерах не должно быть реализаций функций, должны быть только заголовки (прототипы, описания). разве что inline-функции или макросы-функции могут там быть в виде исключения...
вот пасибо, а то тоже задавался вопросом как все организовать
Мастер на все руки, кручу, кручу, кручу и матерюсь Повелитель паяльной станции, лома, и пинцета!!!
Общем так. Если OCR2=0xff (макс значение) то прерывание по переполнению Т2 не срабатывает. При этом прерывание Т2 по совпадению - прекрасно работает. Почему так?
Я понимаю так. Когда OCR2=0xff и TCNT2=0xff то одновременно наступают события для генерации и по совпадению Т2, и по переполнению Т2. Так как у прерывания по совпадению вектор выше, то первым обрабатывается оно, а после выхода из этого прерывания должно сразу же начать обрабатываться по переполнению.
Что подскажите?
ERRATA
Interrupts may be lost when writing the timer registers in the asynchronous timer
The interrupt will be lost if a timer register that is synchronous timer clock is written when the
asynchronous Timer/Counter register (TCNTx) is 0x00.
Problem Fix/Workaround
Always check that the asynchronous Timer/Counter register neither have the value 0xFF nor
0x00 before writing to the asynchronous Timer Control Register (TCCRx), asynchronous
Timer Counter Register (TCNTx), or asynchronous Output Compare Register (OCRx).
Не стоит менять указанные регистры при значениях счетчика 0x00 или 0xFF в асинхронном режиме
— Не говорите мне что делать и я не скажу куда Вам идти...
Мега8А. Асинхронный режим.
и что ничего нельзя сделать??
пробовал так - внутри обработчика по совпадению пишу if (OCR2==0xfе) OCR2=0; - всё работает, но теряется одно прерывание по совпадению.
пробовал принудительно подымать флаг прерывания по переполнению Т2 - if (OCR2==0xff) TIFR|=0b01000000; ничего не помогает.
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
++OCR2;
// тут обработка преывания «compare» как и был ораньше
if (OCR2 == 0) { // или 1, смотря какая фаза нужна, может как раз и нужно когда _стало_ 1, было 0
sei(); // следующее прерывание по compare сможет прервать это,
// сюда второй раз все равно не зайдёт.
// тут как бы обработка прерывания «overflow», то, что было на том векторе
// а вектор overflow и не трогать вообще
}
}
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
uint8_t compare_processing_enable;
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
++OCR2;
if (compare_processing_enable) {
// тут обработка прерывания «compare» как и было раньше
}
if (OCR2 == 0) { // или 1, смотря какая фаза нужна, может как раз и нужно когда _стало_ 1, было 0
sei(); // следующее прерывание по compare сможет прервать это,
// сюда второй раз все равно не зайдёт.
// тут как бы обработка прерывания «overflow», то, что было на том векторе
// а вектор overflow и не трогать вообще
}
}
и вместо разрешения/запрещения прерывания по compare устанавливать/сбрасывать переменную compare_processing_enable. Да, это немного затратнее по коду и времени, зато будет работать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
O-LED писал(а):у меня прерывания идут каждый тик таймера
!!! Тогда опиши алгоритм - который пытаешься реализовать. Прерывания по совпадению каждый тик это что-то...
Может логику работы проще изменить, чем так изгаляться над таймером?
ЗЫ: Тема как-бы "Вопросы по С/С++ (СИ)", а тут ... Может стоит перенести?
— Не говорите мне что делать и я не скажу куда Вам идти...
!!! Тогда опиши алгоритм - который пытаешься реализовать. Прерывания по совпадению каждый тик это что-то...
Может логику работы проще изменить, чем так изгаляться над таймером?
Общем так. Т2 в асинхронном режиме. Тактируется 256гц (32768\128) «overflow» наступает раз в секунду (отсчет времени). Также на Т2 решил сделать и динамическую индикацию на 4 разряда. если Т2 заставить срабатывать каждый тик («compare», OCR2++;) то имеем 256 сработок в секунду, (64 на каждую цифру, вполне подходит для динамической индикации). Если случится пропадание питание, то все прерывания кроме «overflow»Т2 выключаются и контроллер загоняется в power save.
В принципе дин индикацию можно и на Т0 или Т1 соорудить, но захотелось попробовать обойтись одним Т2 Так сказать, спортивный интерес
O-LED писал(а):Общем так. Т2 в асинхронном режиме. Тактируется 256гц (32768\128) «overflow» наступает раз в секунду (отсчет времени). Также на Т2 решил сделать и динамическую индикацию на 4 разряда. если Т2 заставить срабатывать каждый тик («compare», OCR2++;) то имеем 256 сработок в секунду, (64 на каждую цифру, вполне подходит для динамической индикации). Если случится пропадание питание, то все прерывания кроме «overflow»Т2 выключаются и контроллер загоняется в power save.
В принципе дин индикацию можно и на Т0 или Т1 соорудить, но захотелось попробовать обойтись одним Т2 Так сказать, спортивный интерес
Предлагаю:
Таймер тактируется 32768 без делителя, режим CTC, OCR2=127
в прерывании:
Спасибо.
я думал над таким вариантом, но тогда выйдет что при питании от батарее мы будем иметь в секунду 256 прерываний вместо одного. а это сильно увеличит потребление.
O-LED писал(а):Спасибо.
я думал над таким вариантом, но тогда выйдет что при питании от батарее мы будем иметь в секунду 256 прерываний вместо одного. а это сильно увеличит потребление.
А слабо при переходе в ждущий режим поменять код?:) (сменить делитель и прерывания)
в таком то коде похоже можно и T0 обойтись:) - ещё на PWM таймер останется.
Да на Т0 уже сделал, эт не проблема.... А хоцца только на Т2.
Зачем занимать такой функциональный таймер на решение такой простой задачи?Одного Т0 как раз хватит. Ведь там не нужно использовать прерывание по совпадению, а в Т0 его нет.
Всем привет! Может кто подскажет нашел пример программы для индикатора (7-сегментного) с общим катодом, как переделать прогаммку для индикатора с общим анодом? Я так понимаю, что подаю +5В с обоих сторон.