Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Помогите разобраться с прерыванием timer1_capt_isr

Непрочитано 24.06.2009, 08:41  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию Помогите разобраться с прерыванием 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, сделать паузу, далее включить прерывание и т.д.
Реклама:
Mitrar вне форума  
Непрочитано 24.06.2009, 11:25  
avr123-nm-ru
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

Механизм прерываний в 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.
avr123-nm-ru вне форума  
Непрочитано 24.06.2009, 12:00  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

урок 3 прочитал, вот в задаче 10 хороший пример но там в архиве код программы не дописан
Mitrar вне форума  
Непрочитано 24.06.2009, 12:57  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Что же так сложно ? Берем 2 флага - флаг 1 срабатывания и флаг готовности.
При инициализации разрешаем прерывание по фронту, в срабатывании этого прерывания анализируем флаг 1 срабатывания - если он погашен - его устанавливаем - разрешаем таймер и прерывание по спаду.По прерывании по спаду сохраняем таймер, обнуляем его и разрешаем прерывание по фронту.По следующему прерыванию по фронту анализируем флаг 1 срабатывания - если он установлен -считываем таймер, запрещаем прерывания по нему, гасим флаг 1 срабатывания и светим флагом - измерение готово. В маин анализируем этот флаг и по нему - сброс флага готовности, отправка результата по уарту и опять - разрешение таймера по фронту.
urry вне форума  
Непрочитано 25.06.2009, 10:32  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

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")
};
}
Mitrar вне форума  
Непрочитано 25.06.2009, 12:40  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Чуть поправил

Прикрепленный файл: 7855603.rar
urry вне форума  
Непрочитано 26.06.2009, 08:46  
Mitrar
Частый гость
 
Регистрация: 25.05.2007
Сообщений: 37
Сказал спасибо: 1
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
Mitrar на пути к лучшему
По умолчанию

Спасибо!
Mitrar вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с прерыванием от АЦП, Atmega8 R-a-v-e-n Микроконтроллеры, АЦП, память и т.д 11 24.06.2009 14:12
Помогите разобраться stLex Микроконтроллеры, АЦП, память и т.д 2 06.04.2008 21:00
[Решено] Помогите разобраться. didik-dog Отвлекитесь, эмбеддеры! 5 02.09.2007 21:09
Помогите разобраться Mihail-1 Информация по радиокомпонентам 5 02.03.2007 00:13
Помогите разобраться Skt Микроконтроллеры, АЦП, память и т.д 7 26.08.2005 08:23


Часовой пояс GMT +4, время: 12:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.