Ðналоговый компаратор и таймер
Материал из 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;//глобальное разрешение прерываний; }