| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Помогите разобраться с прерыванием timer1_capt_isr
24.06.2009, 08:41
|
|
|
Частый гость
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Помогите разобраться с прерыванием timer1_capt_isr
Программа должна считать в тактах длительность логической еденицы это Т1 и лог ноль Т2.
Мой вариант такой
#include ‹mega16.h›
#include ‹stdio.h›
#include ‹delay.h›
#include ‹stdlib.h›
#include ‹math.h›
#define Rising 1
#define Falling 0
unsigned int T1=0, T2=0, PreviousTime, CurrentTime, T=0;
unsigned char CurrentEdge;
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if (CurrentEdge == Rising){
CurrentTime = ICR1L;
CurrentTime += (int)ICR1H‹‹8;
TCCR1B = 0b00000010;
CurrentEdge = Falling;
if (CurrentTime›PreviousTime) T2 = CurrentTime-PreviousTime;
else T2 = 65535-PreviousTime+CurrentTime;
PreviousTime=CurrentTime;
} else { // if Edge Falling
CurrentTime = ICR1L;
CurrentTime += (int)ICR1H‹‹8;
TCCR1B = 0b01000010; // set Rising edge
CurrentEdge = Rising;
if (CurrentTime›PreviousTime) T1 = CurrentTime-PreviousTime;
else T1= 65535-PreviousTime+CurrentTime;
PreviousTime=CurrentTime;
}
}
void main(void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
ACSR=0x80;
SFIOR=0x00;
TIMSK |= (1‹‹ TICIE1);
TCCR1A = 0;
TCCR1B=0b11000010;
TCNT1 = 0;
CurrentEdge = Rising;
MCUCR = 0b00001010; // Falling edge
GICR |= (1‹‹INT0);
T = T1 + T2;
printf("T=%d",T);
putchar(0x0D);
printf("T1=%d",T1);
putchar(0x0D);
printf("T2=%d",T2);
putchar(0x0D);
delay_ms(3000);
#asm("sei")
while (1) ;
}
Возникают вопросы сигнал идет непрерывно значит прерывания будут срабатывать
не давая программе посчитать Т и отправить в usart?
Как мне в програме в данный момент включить прерывание, посчитать Т1 и Т2, выключить прерывание,
вычислить Т, отправить в Usart, сделать паузу, далее включить прерывание и т.д.
|
|
|
|
24.06.2009, 11:25
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Механизм прерываний в AVR и управление прерываниями в AVR описаны на странице 3 учебного курса по AVR на русском языке - proavr.narod.ru/03.htm - http://avr123.nm.ru/03.htm
Там же пример с кнопками для симуляции и наглядной демонстрации особенностей прерываний в AVR.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
Последний раз редактировалось avr123-nm-ru; 12.02.2010 в 23:17.
|
|
|
|
24.06.2009, 12:00
|
|
|
Частый гость
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
урок 3 прочитал, вот в задаче 10 хороший пример но там в архиве код программы не дописан
|
|
|
|
24.06.2009, 12:57
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
Что же так сложно ? Берем 2 флага - флаг 1 срабатывания и флаг готовности.
При инициализации разрешаем прерывание по фронту, в срабатывании этого прерывания анализируем флаг 1 срабатывания - если он погашен - его устанавливаем - разрешаем таймер и прерывание по спаду.По прерывании по спаду сохраняем таймер, обнуляем его и разрешаем прерывание по фронту.По следующему прерыванию по фронту анализируем флаг 1 срабатывания - если он установлен -считываем таймер, запрещаем прерывания по нему, гасим флаг 1 срабатывания и светим флагом - измерение готово. В маин анализируем этот флаг и по нему - сброс флага готовности, отправка результата по уарту и опять - разрешение таймера по фронту.
|
|
|
|
25.06.2009, 10:32
|
|
|
Частый гость
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Urry, набросал по вашему алгоритму код посмотрите,
если что не так. Хочу разобраться досканально.
#include ‹mega16.h›
#include ‹stdio.h›
#include ‹m8_128.h›
#define Rising 1
#define Falling 0
unsigned int T1=0, T2=0;
unsigned char CurrentEdge, End; // Берем 2 флага - флаг 1 срабатывания и флаг готовности
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if (CurrentEdge==Falling) //в срабатывании этого прерывания анализируем флаг 1 срабатывания
TCCR1B=0b00000010;
CurrentEdge=Rising; //- если он погашен - его устанавливаем - разрешаем таймер и прерывание по спаду
T2 = ICR1L;
T2 += (int)ICR1H‹‹8; //По прерывании по спаду сохраняем таймер TCNT1=0; //обнуляем его
TCCR1B=0b01000010; //разрешаем прерывание по фронту
if (CurrentEdge==Rising) //По следующему прерыванию по фронту анализируем флаг 1 срабатывания
T1 = ICR1L; //- если он установлен -считываем таймер
T1 += (int)ICR1H‹‹8;
CurrentEdge=Falling; // гасим флаг 1 срабатывания
TIMSK &= ~(1‹‹ TICIE1);//запрещаем прерывания по нему
End = 1; //светим флагом - измерение готово
}
void init_mk(void)
{
TCCR1A=0x00;
TCCR1B=0xC2;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
ACSR=0x80;
SFIOR=0x00;
TIMSK |= (1‹‹ TICIE1); //При инициализации разрешаем прерывание по фронту
TCCR1B=0b11000010;
}
void main(void)
{
init_mk();
while (1)
{
if (End==1) //В маин анализируем этот флаг и по нему
End=0; //сброс флага готовности printf("T1=%f",T1);//отправка результата по уарту
printf("T2=%f",T2);
TIMSK |= (1‹‹ TICIE1); //опять - разрешение таймера по фронту.
TCCR1B=0b11000010;
#asm("sei")
};
}
|
|
|
|
25.06.2009, 12:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
Чуть поправил
Прикрепленный файл: 7855603.rar
|
|
|
|
26.06.2009, 08:46
|
|
|
Частый гость
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:18.
|
|