2Bill. Извиняюсь, вчера не смог ответить, зазвали на банкет. Сейчас с больной головой отвечаю.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Михаил Е. 18 июля 2003 г. 17:10



// ATMega128 кварц 16 мгц.
#include <inavr.h>
#include <pgmspace.h>
#include <Mega128.h>
char count[4]; // счетчики
char PWM[4]; // пороги переключения
__flash char on[] = { 1, 2, 4, 8 }; // включение
__flash char off[] = { ~1, ~2, ~4, ~8 }; // выключение
//***************************************************
//* Таймер 1. *
//***************************************************
class Timer1
{
public:
Timer1();
private:
//*************** Прерывание 100 мксек. *************
#pragma vector=TIMER1_COMPA_vect
static __interrupt void timer1()
{
static char input; // предыдущее значение датчика прохода фазы через 0
char i; // индекс
for(i=0;i<sizeof(count);i++) // управляем ШИМ
if(count[i]++ > PWM[i]) PORTD |= on[i]; // если больше, включен
else PORTD &= off[i]; // если меньше, выключен
if((PIND&0x10)!=input) // датчик прохода фазы через 0
{
input = PIND&0x10; // запомним для след. сравнения
for(i=0;i<sizeof(count);i++) count[i] = 0; // счет сначала
}
}
};
//************** Конструктор ************************
Timer1::Timer1()
{
OCR1A = 1600; // 100 мксек.
WGM10 = WGM11 = WGM13 = 0; WGM12 = 1; // режим сравнения
CS1 = 1; // запустить счет со скоростью CLK
OCIE1A = 1; // разрешить прерывания по совпадению А
__enable_interrupt(); // разрешить прерывания
}
//************** Создаем объект *********************
Timer1 T1;
//***************************************************
void main(void)
{
DDRD = 0x0f; // порт D - выходы
PWM[0] = 100; // устанавливаем
PWM[1] = 100; // пороги
PWM[2] = 100; // ШИМ
PWM[3] = 100;
while(1); // стоп
};





Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru