Проэкт под Attiny, "как-бы так начать програмировать"
#4

Вариант с таймером. Аналогичным же образом "осваиваем" конфигурационные регистры таймера "номер" 0

#define TCCR0A_RESET_VALUE ( (0 << COM0A1) + (0 << COM0A0) + (0 << COM0B1) + (0 << COM0B0) + (0 << WGM01) + (0 << WGM00)) //Timer mode
#define TCCR0B_RESET_VALUE ( (0 << WGM02) + (0 << CS02) + (0 << CS01) + (1 << CS00)) //Normal mode, prescaler 1
#define TIMSK0_RESET_VALUE ( (0 << OCIE0B) + (0 << OCIE0A) + (0 << TOIE0))

Впринципе TCCR0A и TIMSK0 останутся в исходном значении, так что их можно и не прописывать, но хорошо иметь заготовку на будущее. В CCR0B запишем единичку что соответвует отсутствию деления частоты клока перед таймером.
В этом режиме таймер будет считать ввех по кругу, и каждый раз при переполнении будет выставлятся флаг переполнения в регистре TIFR0. Для чтения этого бита зделаем заготовку:
#define TIMER0_OF() TIFR0 & 0x01
для зброса (поскольку делаем пока без прирывание, то флаг надо сбрасывать вручную записью туда еденицы):
#define TIMER0_OF_RESET() TIFR0 = 0x01

В цикл програмы добавим if который будет постоянно проверять флаг переполнения счетчика (а так же сбрасывать флаг и выполнять нужное действие):
if (TIMER0_OF())
{
TIMER0_OF_RESET();
PINA |= (1 << REL) + (1 << LED0);
}
Такой способ работы с таймером (да и со всем остальным) называется полингом, т.е. постоянным опросом.
Итого код выглядит так:

#include <avr/io.h>

#define COUNTER_RESET_VALUE 0x02
#define REL PA0
#define DC PA1
#define LED0 PA5
#define LED1 PA4
#define FAULT PA7
#define ADC_IN3 PA3
#define ADC_IN2 PA2
#define RESET PB3

#define TCCR0A_RESET_VALUE ( (0 << COM0A1) + (0 << COM0A0) + (0 << COM0B1) + (0 << COM0B0) + (0 << WGM01) + (0 << WGM00)) //Timer mode
#define TCCR0B_RESET_VALUE ( (0 << WGM02) + (0 << CS02) + (0 << CS01) + (1 << CS00)) //Normal mode, prescaler 1
#define TIMSK0_RESET_VALUE ( (0 << OCIE0B) + (0 << OCIE0A) + (0 << TOIE0))

#define TIMER0_OF() TIFR0 & 0x01
#define TIMER0_OF_RESET() TIFR0 = 0x01
#define TIMER0_MATCH() TIFR0 & 0x02
#define TIMER0_MATCH_RESET() TIFR0 = 0x02

#define ENABLE_TIMER0_INT() TIMSK0 |= (1 << TOIE0)
#define DISABLE_TIMER0_INT() TIMSK0 &= ~(1 << TOIE0)

#define DDRA_RESET_VALUE ( (1 << REL) + (1 << LED0) + (1 << LED1) + (0 << ADC_IN3) + (0 << ADC_IN2) + (0 << FAULT) + (0 << DC))

int main(void)
{
DDRA = DDRA_RESET_VALUE;
PORTA |= (1 << REL) + (1 << LED0);

TCCR0A = TCCR0A_RESET_VALUE;
TCCR0B = TCCR0B_RESET_VALUE;
TIMSK0 = TIMSK0_RESET_VALUE;

while(1)
{
if (TIMER0_OF())
{
TIMER0_OF_RESET();
PINA |= (1 << REL) + (1 << LED0);
}
}
}

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

"Найкраще сало то ковбаса." (с)
The following 2 users say Thank You to БендеровецЪ for this post:
  • EDWARD (09-03-2014), flipper (03-14-2017)
Ответ


Сообщения в этой теме
Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 07-11-2014, 02:59 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 07-11-2014, 05:03 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 07-11-2014, 07:22 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 07-12-2014, 05:40 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 07-12-2014, 06:33 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от begemot - 07-12-2014, 07:16 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 07-12-2014, 06:52 PM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от БендеровецЪ - 11-02-2014, 05:51 PM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от Black_Jack - 03-13-2017, 10:13 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от EDWARD - 03-13-2017, 11:01 AM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от goiihik - 03-13-2017, 12:06 PM
RE: Проэкт под Attiny, "как-бы так начать програмировать" - от Black_Jack - 03-14-2017, 02:15 AM

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)