реклама на сайте
подробности

 
 
> Таймеры и прерывания
AiDream
сообщение Jan 24 2012, 09:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 8-09-11
Пользователь №: 67 064



Здравствуйте!
В программировании микроконтроллеров новичок, поэтому прошу не ругать сразу)
Встала задача:
На вход микроконтроллера постоянно поступают импульсы. Необходимо замерять временной интервал между ними, запоминать эти значения и проводить над ними простые математические операции.
Длительность импульсов - 5 мс, амплитуда - 12 В.
Пока что продумываю алгоритм.
Как я понимаю, надо настроить один из таймеров на запуск по входному нарастающему импульсу. Тут вопрос - остановится ли таймер по приходу следующего импульса, чтобы можно было считать накопленное им значение?
Заранее благодарю за помощь.

Цитата(AiDream @ Jan 24 2012, 11:47) *
Здравствуйте!
В программировании микроконтроллеров новичок, поэтому прошу не ругать сразу)
Встала задача:
На вход микроконтроллера постоянно поступают импульсы. Необходимо замерять временной интервал между ними, запоминать эти значения и проводить над ними простые математические операции.
Длительность импульсов - 5 мс, амплитуда - 12 В.
Пока что продумываю алгоритм.
Как я понимаю, надо настроить один из таймеров на запуск по входному нарастающему импульсу. Тут вопрос - остановится ли таймер по приходу следующего импульса, чтобы можно было считать накопленное им значение?
Заранее благодарю за помощь.

Расстояние между импульсами от 10 до 200 мс.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
birden
сообщение Jan 25 2012, 03:49
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 28-10-06
Из: Новосибирск
Пользователь №: 21 743



Могу посоветовать "средство" - Winavr, или его нынешнее развитие - AVR Toolchain. Это компилятор, IDE к нему каждый выбирает по себе. Я, например, использую CodeBlocks.
Еще одно необходимое "средство" - документация (datasheet) на используемый МК. Если Вы планируете и дальше заниматьсся решением подобных задач, то это должно стать вашей "настольной книгой" первое время.
По поводу примера программы: любую задачу можно попробовать начать решать с составления алгоритма. В данном случае, это можно представить так:
1. Настройка захвата - выбор типа фронта, вкл. или выкл. шумоподавителя, прерываний (если нужно)
2. Настройка соответствующего таймера (выбор режима и т.д.)
3. Сброс флага захвата
4. Включение захвата
5. Ожидание флага захвата, старт таймера.
6. Сброс флага захвата
7. Ожидание флага захвата, чтение результата.
Это примерный алгоритм, для начала. В качестве оптимизации можно добавить некоторые моменты: старт таймера перед включением захвата, чтобы по приходу первого фронта знать содержимое таймера; организация что-то вроде конечного автомата для измерения некоторого числа периодов (для усреднения) и т.д.
Go to the top of the page
 
+Quote Post
AiDream
сообщение Jan 25 2012, 06:42
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 8-09-11
Пользователь №: 67 064



Цитата(birden @ Jan 25 2012, 06:49) *
Могу посоветовать "средство" - Winavr, или его нынешнее развитие - AVR Toolchain. Это компилятор, IDE к нему каждый выбирает по себе. Я, например, использую CodeBlocks.
Еще одно необходимое "средство" - документация (datasheet) на используемый МК. Если Вы планируете и дальше заниматьсся решением подобных задач, то это должно стать вашей "настольной книгой" первое время.
По поводу примера программы: любую задачу можно попробовать начать решать с составления алгоритма. В данном случае, это можно представить так:
1. Настройка захвата - выбор типа фронта, вкл. или выкл. шумоподавителя, прерываний (если нужно)
2. Настройка соответствующего таймера (выбор режима и т.д.)
3. Сброс флага захвата
4. Включение захвата
5. Ожидание флага захвата, старт таймера.
6. Сброс флага захвата
7. Ожидание флага захвата, чтение результата.
Это примерный алгоритм, для начала. В качестве оптимизации можно добавить некоторые моменты: старт таймера перед включением захвата, чтобы по приходу первого фронта знать содержимое таймера; организация что-то вроде конечного автомата для измерения некоторого числа периодов (для усреднения) и т.д.

Спасибо за советы!

Для начала пытаюсь настроить прерывание по захвату, настроил таймер. Просто увеличиваю переменную по таймеру, вывожу ее на lcd.
Сделал модель в протеусе, но что то не выводит ничего на индикатор. Буду благодарен если кто то подскажет, что я делаю не так.
[code][/code]
#include <mega88.h>

// Alphanumeric LCD Module functions
#include <alcd.h>
unsigned int numb;
// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
TCNT1H=0;
TCNT1L=0;
numb++;
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B 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
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=0x00;

// 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;


TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


TCCR1A=0x00;
TCCR1B=0x43;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x20;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// USART initialization
// USART disabled
UCSR0B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1)
{
{
lcd_gotoxy(0,0);
lcd_putchar(numb/10+0x30);
lcd_putchar(numb%10+0x30);
}
}
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 18:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016