Рассмотрим подробнее настройку прерываний таймера 2



Прерывание представляет собой событие, при наступлении которого выполнение основной программы приостанавливается и вызывается функция, обрабатывающая прерывание определённого типа.

Прерывания делятся на внутренние и внешние. К источникам внутренних прерываний относятся встроенные модули микроконтроллера (таймеры, приёмопередатчик USART и т.д). Внешние прерывания возникают при поступлении внешних сигналов на выводы микроконтроллера (например сигналы на выводы RESET и INT). Характер сигналов, приводящих к возникновению прерывания задаётся в регистре управления MCUCR, в частности в разрядах - ISC00 (бит 0) и ISC01 (бит 1) для входа INT 0; ISC10 (бит2) и ISC11 (бит3) для входа INT1.

ISC00 ISC01 Значение
0 0 Прерывание вызывается по уровню лог.0 на входе INT0
0 1 Прерывание вызывается по ниспадающему фронту сигнала на входе INT0
1 1 Прерывание вызывается по возрастающему фронту сигнала на входе INT0

 

ISC10 ISC11 Значение
0 0 Прерывание вызывается по уровню лог.0 на входе INT1
0 1 Прерывание вызывается по возрастающему фронту сигнала на входе INT1
1 1 Прерывание вызывается по ниспадающему фронту сигнала на входе INT1

В микроконтроллере ATmega8 каждому прерыванию соответствует свой вектор прерывания (адрес в начале области памяти программ, в которой хранится команда для перехода к заданной подпрограмме обработки прерывания). В mega8 все прерывания имеют одинаковый приоритет. В случае одновременного возникновения нескольких прерываний первым будет обрабатываться прерывание с меньшим номером вектора.

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

Адрес Источник прерывания Описание
0x0000 RESET Сигнал сброса
0x0001 INT0 Внешний запрос на прерывание по входу INT0
0x0002 INT1 Внешний запрос на прерывание по входу INT1
0x0003 T/C1 Захват по таймеру T/C1
0x0004 T/C1 Совпадение с регистром сравнения A таймера T/C1
0x0005 T/C1 Совпадение с регистром сравнения B таймера T/C1
0x0006 T/C1 Переполнение счётчика T/C1
0x0007 T/C0 Переполнение счётчика T/C0
0x0008 SPI Передача данных по интерфейсу SPI завершена
0x0009 UART Приём данных приёмопередптчиком UART завершен
0x000A UART Регистр данных UART пуст
0x000B UART Передача данных приёмопередптчиком UART завершена
0x000C ANA_COMP Прерывание от аналогового компаратора

Управления прерываниями

За управление прерываниями в ATmega8 отвечают 4 регистра:

GIMSK (он же GICR) - запрет/разрешение прерываний по сигналам на входах INT0, INT1

GIFR - управление всеми внешними прерываниями

TIMSK, TIFR - управление прерываниями от таймеров/счётчиков

Регистр GIMSK(GICR)

7

6

5 4 3 2 1 0

INT1

INT0 - - - - - -
                 

INTx=1: прерывания по сигналу на входы INTx разрешены

Регистр GIFR

7 6 5 4 3 2 1 0
INTF1 INTF0 - - - - - -

INTFx=1: произошло прерывание на входе INTx. При входе в подпрограмму обработки прерывания INTFx автоматически сбрасывается в сотояние лог. 0

Регистр TIMSK

7 6 5 4 3 2 1 0
TOIE1 OCIE1A OCIE1B - TICIE - TOIE0 -

TOIE1=1: прерывание по переполнению T/C1 разрешено

OCIE1A=1: прерывание при совпадении регистра сравнения A с содержимым счётчика T/C1 разрешено

OCIE1B=1: прерывание при совпадении регистра сравнения B с содержимым счётчика T/C1 разрешено

TICIE=1: разрешено прерывание при выполнении условия захвата

TOIE0=1: прерывание по переполнению T/C0 разрешено

Регистр TIFR

7 6 5 4 3 2 1 0
TOV1 OCF1A OCF1B - ICF1 - TOV0 -

TOV1=1: произошло переполнение T/C1

OCF1A=1: произошло совпадение регистра сравнения A с содержимым счётчика T/C1 разрешено

OCF1B=1: произошло совпадение регистра сравнения B с содержимым счётчика T/C1 разрешено

ICF=1: выполнилось условия захвата

TOV0=1: произошло переполнение T/C0

При входе в подпрограмму обработки прерывания соответствующий прерыванию флаг регистра TIFR автоматически сбрасывается в сотояние лог. 0

Прерывания работают только тогда, когда в регистре состояния SREG разрешены общие прерывания (бит 7 = 1). В случае наступления прерывания этот бит автоматически сбрасывается в 0, блокируя выполнение последующих прерываний.

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0xC0;

 

 

Пример базовой настройки МК при помощи мастера :

 

#asm

.equ __lcd_port=0x12

#endasm

 

#include <lcd.h>

#include <stdio.h>

#include <delay.h>

#include <mega8.h>

 

#define M1_A PORTC.3 // вперед

#define M1_A2 PORTC.2 // вперед

#define M1_B PORTC.0 // назад

#define M1_B2 PORTC.1 // назад

 

 

unsigned char PWM_A1=0,PWM_B1=0;// первыйдвижок

 

 

char lcd_buffer[33];  

 

unsigned char pwm=0;

 

// Timer2 overflow interrupt service routine

interrupt [TIM2_OVF] void timer2_ovf_isr(void)

{

// Place your code here

 

 

 if (PWM_A1>0) {M1_A=1;M1_A2=0;} 

 else {M1_A=0;M1_A2=1;}

 

 if (PWM_B1>0) {M1_B=1;M1_B2=0;}

 else {M1_B=0;M1_B2=1;}

 

TCNT2=0x00;

}

 

// Timer2 output compare interrupt service routine

interrupt [TIM2_COMP] void timer2_comp_isr(void)

{

// Place your code here

if (PWM_A1>0) {M1_A=0;}

 if (PWM_B1>0) {M1_B=0;}

 

}

 

 

void anim(void)

 

{

    lcd_gotoxy(0,0);        

    sprintf(lcd_buffer,"PWM_A1 %i ",PWM_A1);

    lcd_puts(lcd_buffer);  

 

    lcd_gotoxy(0,1);     

    sprintf(lcd_buffer,"PWM_B1 %d ",PWM_B1);

    lcd_puts(lcd_buffer);

}

 

 

// Declare your global variables here

 

void main(void)

{ lcd_init(16);

// Declare your local variables here

 

// Input/Output Ports initialization

// Port B initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTB=0x00;

DDRB=0x00;

 

// Port C initialization

// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0xFF;

 

// Port D initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

TCCR0=0x00;

TCNT0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer1 Stopped

// Mode: CTC top=OCR1A

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x08;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x0C;

OCR1AL=0x35;

OCR1BH=0x00;

OCR1BL=0x00;

 

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: 15,625 kHz

// Mode: Normal top=0xFF

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x06;

TCNT2=0x00;

OCR2=0x00;

 

 

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

MCUCR=0x00;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0xC0;

 

// USART initialization

// USART disabled

UCSRB=0x00;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

 

// ADC initialization

// ADC disabled

ADCSRA=0x00;

 

// SPI initialization

// SPI disabled

SPCR=0x00;

 

// TWI initialization

// TWI disabled

TWCR=0x00;

 

// Global enable interrupts

#asm("sei")

 

while (1)

{

 

    if(PINB.0==0) { PWM_A1=200; PWM_B1=0; OCR2 =PWM_A1; delay_ms(300);anim();}

    if(PINB.1==0) { PWM_A1=0; PWM_B1=100; OCR2 =PWM_B1; delay_ms(300);anim();} 

 

 

}

}

 

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

 

 

Порядок выполнения работы

1. Получить задание у преподавателя

2. Разработать алгоритм

3. Разработать программу в CodeVisionAVR

4. Скомпилировать файл прошивки

5. Спроектировать макетную плату в PROTEUS

6. Загрузить файл (*.hex) в PROTEUS и запустить симуляцию в проекте.

Оформление отчета

Отчет должен содержать:

а) формулировку цели работы,

б)схему устройства

в) код программы в CodeVisionAVR

г)схема проекта в PROTEUS

д) Выводы по работе

 

 

 

Список использованной литературы

1) М.Б. Лебедев . CodeVision AVR. Пособие для начинающих. Додэка XXI, 2008. 592 с.

 

Содержание:


Дата добавления: 2021-01-20; просмотров: 100; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!