Мистика с Timer1 Attiny85
- Войдите на сайт для отправки комментариев
Всем здрасьте!
вопрос собственно вот в чем:
в своем проекте на 85 тиньке использую timer1, согласно даташиту настраиваю:
TCNT1 = 0; TCCR1 = 0; OCR1C = clock_RESET; OCR1A = OCR1C; TCCR1 |= (1 << CTC1); //режим CTC TCCR1 |= (1 << CS12) | (1 << CS11)| (1 << CS10); //clk/64 (prescaler)
управление таймером выполняю с помощью макросов:
#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #define TCNT_REG TCNT1 //register of timer-counter #define TIMER_INT ISR(TIMER1_COMPA_vect) //the timer interrupt service routine #define EN_TIMER {TCNT_REG=0; TIMSK |= (1 << OCIE1A); TIFR|=(1<<OCF1A);} //enable timer interrupt #define DIS_TIMER (TIMSK &= ~(1 << OCIE1A)) // disable timer interrupt #endif
таймер запускается аппаратным прерыванием и должен срабатывать исходя из:
#define OWT_RESET 480 #define clock_MC (F_CPU / 1000000L ) #define clock_RESET (OWT_RESET/(64/clock_MC)
по теории должно все работать, но на практике время через которое срабатывает прерывание таймера в разы больше (это первый вопрос), поэтому для теста ставлю OCR1A = OCR1C = 7, но, время срабатывания начинает "гулять" (т.е. пару мкСек в большую или меньшую сторону (и это второй вопрос)). по идее, можно бы было уменьшить деление (prescaler) до 32, и увеличить значение OCR1A и OCR1C в 2 раза, но на деле никакого результата не дает (и это третий вопрос).
Поиск в интернете ничего конкретного не дал, кроме того нашел калькулятор для расчета таймеров, за то убедился что что таймер инициализирую правильно. Кроме того на atmega328p timer2 работает как надо, а с тинькой такая вот беда, уже 3 дня голову ломаю. Люди добрые, подскажите что я делаю не так, век благодарен буду!
ссылка на калькулятор: https://www.arduinoslovakia.eu/application/timer-calculator
Полный код покажите ... Может вы боретесь с wiring за один и тот же таймер ....
согласно wiring.с milliis, micros и delay используют Timer0.
а тактируетесь от чего? ядро какое?
а тактируетесь от чего? ядро какое?
А, главное, тактовая-то какая?
а тактируетесь от чего? ядро какое?
А, главное, тактовая-то какая?
судя по иерархии заданных вопросов - да! ;-)))
8Mhz внутренний, без кварца
решил не мучиться и перешел на 16Мгц, таймер работает нормально, но теперь с delayMicroseconds() заморочка (держат больше раза в 2-3 чем надо), на ATmega328p такого нет, только на тиньках (84 и 85). Ассемблерные функции не спасают, подскажите есть ли выход из этой беды.
на Тиньке 84 проблемы с таймером 1 нет, но такая же беда с delayMicroseconds(). Использую ATTinyCore в ArduinoIDE.
И еще, есть ли возможность при инициализации библиотеки проверить реальную частоту ядра (без использования F_CPU / 1000000L), как то подсчитать количество тактов за единицу времени?
под этим Core эта программа использует все таймеры, частота 8 интернал, проблем нет
проблема с таймерами пропала, нужно решить как то проблему с delayMicroseconds
на Тиньке 84 проблемы с таймером 1 нет, но такая же беда с delayMicroseconds(). Использую ATTinyCore в ArduinoIDE.
Да, есть такая проблемка. Сам недавно столкнулся. https://arduino.ru/forum/programmirovanie/diy-attiny-core