Более интересна работа таймера/счетчика 0 через прерывания. Сразу скажу, что программа на С в которой используются прерывания зависима от компилятора. Нельзя взять программу написанную в CVAVR и откомпилировать в WinAVR.
У таймера/счетчика 0 ATtiny2313 предусмотрено три прерывания: прерывание по переполнению и два прерывания по совпадению.
CODE:
/* Timer/Counter Interrapt Mask Register */
/* регистр маски прерываний таймеров/счетчиков */
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK = 0b00000000;
/* *************************************
TOIE0 - разрешает прерывание по переполнению таймера/счетчика 0
OCIE0A - разрешает прерывание по совпадению счетного регистра TCNT0 с регистром сравнения OCR0A таймера/счетчика 0
OCIE0B - разрешает прерывание по совпадению счетного регистра TCNT0 с регистром сравнения OCR0B таймера/счетчика 0
************************************* */
Для того, чтобы прерывания выполнялись необходимо глобальное разрешение прерываний. В CVAVR это делается с помощью
Обрабатываются прерывания в специальных функциях. Для CVAVR это
CODE:
/* прерывание при переполнении таймера/счетчика 0 */
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/* код */
}
/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0A таймера/счетчика 0 */
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
/* код */
}
/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0В таймера/счетчика 0 */
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
/* код */
}
И в заключении пример работающей (надеюсь ) с прерываниями программы
CODE:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.8a Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 05.09.2010
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATtiny2313
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
/* прерывание при переполнении таймера/счетчика 0 */
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/* код */
PORTB ^= 0b00000001;
}
/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0A таймера/счетчика 0 */
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
/* код */
PORTB ^= 0b00000010;
}
/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0В таймера/счетчика 0 */
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
/* код */
PORTB ^= 0b00000100;
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
/* все выводы порта B сконфигурировать как выходы */
DDRB = 0b11111111;
PORTB = 0b00000000;
/* Timer/Counter 0 Control Register A */
/* регистр управления таймером/счетчиком 0 А */
/* биты регистра:
COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00 */
TCCR0A = 0b00000000;
/* Timer/Counter 0 Control Register B */
/* регистр управления таймером/счетчиком 0 В */
/* биты регистра:
FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00 */
TCCR0B = 0b00000010;
/* Timer/Counter 0 */
/* счётный регистр таймера/счетчика 0 */
TCNT0 = 0;
/* Output Compare Register А */
/* регистр сравнения таймера/счетчика 0 А */
OCR0A = 100;
/* Output Compare Register В */
/* регистр сравнения таймера/счетчика 0 В */
OCR0B = 200;
/* Timer/Counter Interrapt Mask Register */
/* регистр маски прерываний таймеров/счетчиков */
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK = 0b00000111;
/* глобальное разрешение прерываний */
#asm("sei")
while (1)
{
/* код */
}
}
Все возможности таймера/счетчика 0 подробно описаны в datasheet ATtiny2313. На английском языке его можно найти на официальном сайте Atmel http://www.atmel.com/
Посмотрите перевод datasheet ATmega128 http://www.gaw.ru/html.cgi/txt/d...arh128/index.htm
(Добавление)
zatmenie пишет:А как в CVAVR с помощью генератора кода можно настроить Т0
Генератора кода CVAVR не делает ничего сверх естественного. Он просто записывает нужные значения в биты регистров. Назначение регистров и их битов я описал. Создавайте шаблон программы и проверяйте значения битов регистров
PS Спасибо за теплые слова.(Отредактировано автором: 05 Сентября, 2010 - 20:05:38) |