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;
}

Читать дальше

ATmega8: таймер на компараторе, CTC режим

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

Второй 8-битный таймер ATmega8 - TIMER2. Кроме перывания по переполнению счетчика, расмотренное в предыдущем посте, TIMER2 имеет второе прерывание по значению компаратора. Т.е. не надо будет ждать переполнения счетчика, прерывание сработает когда счетчик достигнет определенного значения. Это позволяет более точно устанавливать частоту срабатывания и по сути является производным генератором частоты. Штука архиполезная, позволяет выставлять значения портов по какой либо-функции или наоборот снимать показания с портов с некой периодичностью. Используется для PWM, но PWM оставим на потом, сейчас будет полезно разобраться с CTC режимом работы компаратора, когда его можно использовать как счетчик.

CTC режим (Clear Timer on Compare Match Mode), это режим при котором зачение таймера сбрасывается при достижении занчения определенного в регистре OCR2. Для TIMER2 данный режим устанавливается в TCCR2 регистре флагом WGM21:

Читать дальше

ATmega8: счетчик на прерывании Timer/Counter overflow

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

Если посмотреть таблицу прерываний для ATmega8 из предыдущего поста, то видно, что почти половина из них, это прерывания для работы с таймерами/cчетчиками. Также для их конфигурации отведена значительная часть регистров:

Также для их конфигурации отведена значительная часть регистров:

Читать дальше

ATmega8: Вектора прерываний

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


В отсутствии многозадачного режима,
вектора прервываний это единнственный
способ реализовать многозадачность

В одном из предыдущих постов я дизассемлировал blink написаный на Си, и затем переписывал программу на ассемблере. Помнится тогда я выбросил таблицу прерываний под предлогом, что прерывания здесь не используются. Однако, в дальнейшем они будут активно использоваться и поэтому с ней следует разобраться.

Делать все буду на примере ATmega8, мне пока этот микроконтроллер кажется наиболее привлекательным.

В начале каждой программы на ассемблере должна идти таблица векторов прерываний, т.е. ссылок на продпрограммы, которые будут обрабатывать то или иное прерывание. Прерывание, это в свою очередь какое-то событие, при котором ход программы прерывается, и процесор бросается обработать это событите. Как не трудно догадаться, обрабатывать он это событие будет, с помощью той подпрограммы, ссылку на которую, мы запишем в таблице векторов прерывание.

Для каждой модели микроконтроллера набор прерываний свой, порядок их чередования задан на аппаратном уровне. Поэтому перед написанием первой программы для микроконтроллера, следует ознакомиться с этой таблицой в оффициальной документации. Дока на ATmega8: ATmega8/L datasheet. На странице 46 находим такую табличку:

Читать дальше