Рассмотрим подробнее настройку прерываний таймера 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!