Аналоговый компаратор и таймер

Материал из Automata.

(Различия между версиями)
Перейти к: навигация, поиск
м (Полностью удалено содержимое страницы)
м (Правки Kern (обсуждение) откачены к версии Mrsnaut)
 
Строка 1: Строка 1:
 +
#include <stdint.h>
 +
#include <avr/io.h>
 +
#include <avr/interrupt.h>
 +
//логическая переменная состояния РС7;
 +
static volatile uint8_t status = 0;
 +
//переменная частоты - количества;
 +
static volatile uint16_t frequency = 0;
 +
 +
//обработчик прерывания от компаратора;
 +
ISR (ANA_COMP_vect)
 +
{
 +
if (status == 0) {//если напряжения на выводе PC7 нет, то
 +
PORTC |= 0x80;//подаем на него логическую "1" и
 +
status = 1;//запаминаем новое состояние;
 +
} else {//если есть, то
 +
PORTC &= 0x7f;//подаем на вывод логический "0" и
 +
status = 0;//запаминаем новое состояние;
 +
};
 +
}
 +
 +
ISR (SIG_INPUT_CAPTURE1)
 +
{
 +
frequency = ICR1;//запаминаем количество тактов;
 +
TCNT1 = 0;//обнуляем таймер-счетчик1;
 +
}
 +
 +
//главная функция;
 +
int main (void)
 +
{
 +
DDRB = 0xff;//настраиваем выводы порта В на выход;
 +
PORTB = 0x00;//без подачи напряжения;
 +
DDRC = 0xff;//настраиваем выводы порта С на выход;
 +
PORTC = 0x00;//без подачи напряжения;
 +
ACSR = _BV(ACBG) | _BV(ACIE) | _BV(ACIC);//выбираем внутреннее опорное напряжение и разрешаем прерывания от компаратора;
 +
TIMSK = _BV(TICIE1);//разрешаем прерывание по захвату таймера-счетчика1;
 +
TCCR1B = _BV(ICNC1) | _BV(ICES1) | _BV(CS10);//разрешаем захват таймера-счетчика1,
 +
//устанавливаем возникновение прерывания по возрастающему фронту сигнала,
 +
//не устанавливаем предделителя;
 +
SREG = 0x80;//глобальное разрешение прерываний;
 +
}

Текущая версия

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//логическая переменная состояния РС7;
static volatile uint8_t status = 0;
//переменная частоты - количества;
static volatile uint16_t frequency = 0;
//обработчик прерывания от компаратора;
ISR (ANA_COMP_vect)
{
    if (status == 0) {//если напряжения на выводе PC7 нет, то
        PORTC |= 0x80;//подаем на него логическую "1" и
        status = 1;//запаминаем новое состояние;
    } else {//если есть, то
        PORTC &= 0x7f;//подаем на вывод логический "0" и 
        status = 0;//запаминаем новое состояние;
    };
}
ISR (SIG_INPUT_CAPTURE1)
{
    frequency = ICR1;//запаминаем количество тактов;
    TCNT1 = 0;//обнуляем таймер-счетчик1;
}
//главная функция;
int main (void) 
{
    DDRB = 0xff;//настраиваем выводы порта В на выход;
    PORTB = 0x00;//без подачи напряжения;
    DDRC = 0xff;//настраиваем выводы порта С на выход;
    PORTC = 0x00;//без подачи напряжения;
    ACSR = _BV(ACBG) | _BV(ACIE) | _BV(ACIC);//выбираем внутреннее опорное напряжение и разрешаем прерывания от компаратора;
    TIMSK = _BV(TICIE1);//разрешаем прерывание по захвату таймера-счетчика1;
    TCCR1B = _BV(ICNC1) | _BV(ICES1) | _BV(CS10);//разрешаем захват таймера-счетчика1, 
                                                 //устанавливаем возникновение прерывания по возрастающему фронту сигнала,
    //не устанавливаем предделителя;
    SREG = 0x80;//глобальное разрешение прерываний;
}
Личные инструменты
Микроконтроллеры