Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
62
Добавлен:
18.03.2016
Размер:
166.4 Кб
Скачать

Группа 1

5 Алгоритмічне та програмне забезпечення

У мікроконтролерах avr є такий периферійний модуль як таймер лічильник. У відповідності зі своєю назвою він вважає час. У таймер лічильника є регістр TCNT з якого можна прочитати скільки часу пройшло з моменту запуску таймера. Значення в цьому регістрі не в хвилинах або секундах, а в 'тіках' таймера. Чому дорівнює один тік - залежить від тактової частоти, на якій працює мікроконтролер avr, і від налаштувань таймера. Так само у таймера лічильника є настроюємий подільник частоти, який визначає на скільки буде поділена тактова частота мікроконтролера перед тим як буде подана на таймер лічильник. Тривалість тіка таймера є зворотною величиною від частоти, отриманої в результаті поділу.

Насамперед написання програми для перетворення і зчитування сигналу (аналогового та інших) потребує розроблення її алгоритму.

Так звана схема (або алгоритм ) програми мікропроцесорної системи вимірювання ваги зображена на рисунку 5.1:

Рисунок 5.1 – Схема програми мікропроцесорної системи вимірювання ваги

За вищенаведеним алгоритмом було розроблено лістинг програми для Atmega 128 на C++:

#include <avr/interrupt.h>

 

ISR(TIMER0_OVF_vect)

{

/ / Giving counter such values / / To the next overflow occurred in 10 ms. / / Formula: 256 - 8 MHz / 1024/100 Hz = 177,785 = ~ 178 TCNT0 = 178;

}

 

int main()

{

/ / In addition to the first overflow interrupt occurred / / 10 ms, and be here to reset the counter.

TCNT0 = 178;

 

/ / Ratio of the frequency divider 1024

TCCR0 = 0x07;

 

/ / Enable interrupt filling counter

TIMSK |= (1 << TOIE0);

 

/ / Enable global interrupt

sei();

 

/ / Infinite loop program

while (1) continue;

}

#include <avr/interrupt.h>

 

unsigned long frequency;

 

/ / Interrupt events occur

ISR(TIMER1_CAPT_vect)

{

/ / Reset the counter

TCNT1 = 0;

 

/ / The result is true only in the case

/ / If the counter does not overflow

if (!(TIFR & (1 << TOV1)))

{

/ / Calculate the frequency of the inverse of the period.

frequency = (unsigned long)8000000 /

(unsigned long)ICR1;

}

else

{

/ / Frequency less than 122 Hz

frequency = 0;

 

/ / Reset the overflow flag counter

TIFR &= ~(1 << TOV1);

}

}

 

int main()

{

/ / Register the rising edge, the ratio of the frequency divider 1 TCCR1B = (1 << ICES1) | (1 << CS10);

 

/ / Enable interrupt-event

TIMSK = (1 << TICIE1);

 

/ / Enable global interrupts

sei();

 

/ / Infinite loop program

while (1) continue;

}

#include <avr/io.h>

 

int main()

{

/ / Set the output terminal

DDRB |= (1 << PIN5) | (1 << PIN6);

 

/ / Outputs A and B during the comparison low / / Mode "Fast PWM", a frequency divider 8

TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);

TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);

 

/ / The greatest value of the counter. Formula:

// TOP = 8 MHz / 8 / 50 Hz

ICR1 = 20000;

 

/ / The half-life of the first motor 1 ms, 2 ms

OCR1A = 1000;

OCR1B = 2000;

 

/ / Infinite loop program

while (1) continue;

}