2 Виконання роботи
2.1 Постановка задачі
Використовуючи мікроконтроллер ATmega16, 12 МГц виконати наступну роботу:
а) Розробити програму лічильника від 0x0 до 0xF. Інкремент лічильника повинен відбуватися через кожні 1000 мс. Цифри повинні виводитися на семисегментний індикатор (див. рис.3). Використовувати статичну індикацію.
б) Розробити програму лічильника від 0 до 9999 (в десятковій системі). Інкремент лічильника повинен відбуватися через кожні 200 мс. Цифри повинні виводитися на 4 семисегментні індикатори. Використовувати динамічну індикацію (див. рис.4).
в) Перевірити роботу програм за допомогою пакету PROTEUS.
Рис. 3. – Схема до завдання а
Рис. 4. – Схема до завдання б
Під наглядом викладача перевірити роботу програм за допомогою лабораторного стенду.
2.2 Написання програми
Приклад виконання програми а:
#include <mega16.h>
#define a 0b00000001 // Задаємо бітову маску для
#define b 0b00000010 // сегментів індикатора a-h
#define c 0b00000100 //
#define d 0b00001000 //
#define e 0b00010000 //
#define f 0b00100000 //
#define g 0b01000000 //
#define h 0b10000000 //
#define frec 12000000 // Частота тактового генератора
int n_cnt=0; // Лічильник 0-15 (0-F)
void print_char(char num)
// Функція виводу числа num на індикатор
{ char b_;
switch (num)
{
case 0: b_ = (a+b+c+d+e+f); break;
case 1: b_ = (b+c); break;
case 2: b_ = (a+b+g+e+d); break;
case 3: b_ = (a+b+c+d+g); break;
case 4: b_ = (b+c+g+f); break;
case 5: b_ = (a+f+g+c+d); break;
case 6: b_ = (a+f+e+d+c+g); break;
case 7: b_ = (a+b+c); break;
case 8: b_ = (a+b+c+d+e+f+g); break;
case 9: b_ = (a+b+c+d+f+g); break;
case 10: b_ = (a+b+c+e+f+g); break;
case 11: b_ = (f+g+e+d+c); break;
case 12: b_ = (a+f+e+d); break;
case 13: b_ = (b+c+d+e+g); break;
case 14: b_ = (a+f+e+d+g); break;
case 15: b_ = (a+f+e+g); break;
}
PORTA = b_;
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
// Функція обробки переривання по переповненню таймера T1
{
TCNT1=0xffff-(frec/1024);
print_char(n_cnt);
n_cnt++;
if (n_cnt==16) n_cnt=0;
}
void main(void) // Головна функція
{ DDRA=0xff;
DDRC=0xff;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11,719 kHz
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1=0xffff-(frec/1024);
ICR1H=0x00;
ICR1L=0x00;
TIMSK=0x05;
#asm("sei")
while (1) { } // Нескінченний цикл
}
Приклад виконання програми б:
#include <mega16.h>
#include <stdlib.h>
#define a 0b00000001 // Задаємо бітову маску для
#define b 0b00000010 // сегментів індикатора a-h
#define c 0b00000100 //
#define d 0b00001000 //
#define e 0b00010000 //
#define f 0b00100000 //
#define g 0b01000000 //
#define h 0b10000000 //
#define frec 12000000 // Частота тактового генератора
char cnt=0; // Лічильник номера індикатора
char n_arr[4]; // Масив, який зберігає розряди числа
int n_cnt=0; // Лічильник 0-9999
void print_char(char pos, char num)
// Функція виводу числа num на індикатор pos (0-3)
{
char b_;
PORTC = ~(1<<pos);
switch (num)
{
case 0: b_ = (a+b+c+d+e+f); break;
case 1: b_ = (b+c); break;
case 2: b_ = (a+b+g+e+d); break;
case 3: b_ = (a+b+c+d+g); break;
case 4: b_ = (b+c+g+f); break;
case 5: b_ = (a+f+g+c+d); break;
case 6: b_ = (a+f+e+d+c+g); break;
case 7: b_ = (a+b+c); break;
case 8: b_ = (a+b+c+d+e+f+g); break;
case 9: b_ = (a+b+c+d+f+g); break;
case 10: b_ = (a+b+c+e+f+g); break;
case 11: b_ = (f+g+e+d+c); break;
case 12: b_ = (a+f+e+d); break;
case 13: b_ = (b+c+d+e+g); break;
case 14: b_ = (a+f+e+d+g); break;
case 15: b_ = (a+f+e+g); break;
}
PORTA = b_;
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
// Функція обробки переривання переповнення таймеру T0,
// що реалізує динамічну індикацію ~125 Гц
{
int N;
TCNT0 = 150;
if (cnt>3)
{
cnt = 0;
N = n_cnt;
n_arr[3] = N%10; N/=10;
n_arr[2] = N%10; N/=10;
n_arr[1] = N%10; N/=10;
n_arr[0] = N%10;
} else
{ print_char(cnt, n_arr[cnt]); cnt++; }
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
// Функція обробки переривання по переповненню таймера T1
// Час спрацьовування - 0,2 с
{
TCNT1=0xffff-(frec/1024*0.2);
n_cnt++;
}
void main(void) // Головна функція
{
DDRA=0xff;
DDRC=0xff;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 46,875 kHz
TCCR0=0x04;
TCNT0=150;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11,719 kHz
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1=0xffff-(frec/1024);
ICR1H=0x00;
ICR1L=0x00;
TIMSK=0x05;
#asm("sei")
while (1) { } // Порожній цикл
}
3 Зміст звіту:
Тема і мета роботи
Короткі теоретичні відомості
Хід виконання роботи
Лістинг програм та рисунки набраних схем
Виводи по роботі
