11.05.2022г. ВНИМАНИЕ! Если у вас не отображаются иллюстрации к статьям, для просмотра сайта используйте TOR браузер

ATmega8: Blink без delay на Си

разделы: AVR , дата: 30 июля 2015г.

Нулевой таймер на ATmega8 не имеет апаратного ШИМ'а, поэтому ему трудно придумать применение кроме как простого счетчика. На 16MГц кварце и делителем на 64, прерывание по переполнению счетчика будет вызаваться с частотой 1КГц, т.е. каждый вызов будет равняться одной миллисекунде. Разрядности unsigned long для счетчика должно хватить на 49 дней. В целом, такой счетчик мало годится для построения часов, но в качестве таймера для расчета разных задержек подойдет вполне.

/* timer.c LED Blink whitout delay via 8-bit Timer0 for AVR ATmega8 */
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile unsigned long millis;

ISR(TIMER0_OVF_vect)
{
	millis++;
}

int main(void)
{
        DDRB |= (1<<PB5); //  pinMode(13,OUTPUT); в Wiring

        TIMSK =(1<<TOIE0);  // timer0 enable
        TCCR0 = (1<<CS01) | (1<<CS00); // prescaler 1/64

	volatile unsigned  long curTime, lastTime, period;

	millis=0;
	lastTime=0;
	period=1000; // 1 sec

        sei();

        for (;;)
	{
		curTime=millis;
		if ((curTime -lastTime)> period)
		{
			PORTB ^= (1<<PB5);
			lastTime=curTime;
		}
	}

        return 0;
}