Добавил:
Andrejjavd
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Примеры решения лабораторных работ / LABA2 / 2_10
.txt10. С использованием 8-ми разрядных таймеров напишите программу
«Задатчик интенсивности»: при подаче сигнала «1» на вход PA0 на выходе таймера
T0 (работает в режиме ТТТИМ) линейно изменяется скважность у от 0 до 1 за время
5 с (темп нарастания задается с помощью таймера Т2, работающего с прерыванием
по переполнению). При снятии сигнала PA0 скважность изменяется от 1 до 0 с тем
же темпом.
*/
#include <iom8535v.h>
#include <stdint.h>
#include <macros.h>
uint8_t iOCR = 128;
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00; // порт А на вход
PORTB = 0xFF;
DDRB = 0xFF; // порт В на вывод (для вывода ШИМа на вывод микросхемы PB3)
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x01; //set count
OCR0 = 0xFF; //set compare
TCCR0 = 0x69; //start timer TCCR0=0110 1001
// Kdel=001= 1 ^ f=8 МГц/1/256=31,2 5кГц
// rejimT0 =11 ^ быстрый ШИМ
// regimOC0=10 ^ установка 0С0 в "0
}
void timer2_init(void) // инициализация таймера Т2
{
TCCR2 = 0x00; //остановка счетчика
TCNT2 = 0x66; //задание начального значения в счетный регистр 5c/255=19,6мс ~51Гц f=8000000/1024/(255-102) = 51 Гц
TCCR2 = 0x05; //запуск таймера с параметрами TCCR = 0000 0101
//101 ^ Kdel=1024
}
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void) // Работа счетчика при прерываниях по переполнению
{
TCNT2 = 0x66; //установка начального значения счетчика
if ((PINA&1)==0)
{
if (iOCR!=255)
OCR0 = iOCR++;
}
else
{
if (iOCR!=0)
OCR0 = iOCR--;
}
}
void init_devices(void)
{
CLI();
port_init();
timer0_init();
timer2_init();
TIMSK = 0x40;
SEI();
}
void main(void)
{
init_devices();
while(1)
{
}
}