Тактовая частота AVR 8MHz Code #include <mega8.h>
unsigned char led_table[10]={0x40,0x[u]79,0x24,0x30,0x19,0x12,2,0x78,0,0x10}; unsigned int num_show=0; //Число для отображения на табло unsigned char sn=0; //Отображаемый разряд 0-3 unsigned int fr_count=0; //Число подсчитанных тактов unsigned int fr_counter=0; //Счетчик тактов unsigned char vup=0; //Если уровень поднимается то 1 unsigned char lv=0; //Предыдущее значение ADC
void segs_show() { //Процедура отображения разрядов if (sn==0) num_show=fr_count; //Если первый разряд обновляем число PORTD=0; //Не чего не показываем PORTB=led_table[num_show%10]; //Высчитываем разряд и берем из таблицы значение для сигмента PORTD=1<<sn; //Отображаем разряд sn++; //Следующий разряд if (sn>3) sn=0; //Разрядов 4 значит значение не должно быть более 3 num_show/=10; //Смещаем на 1 разряд влево }
interrupt [TIM1_COMPA] void timer1_compa_isr(void) { //Прерывание сравнения Таймера1, вызывается 1 раз в секунду TCNT1H=0x00; //Обнуляем счетчик таймера TCNT1L=0x00; fr_count=fr_counter; //Берем подсчитанные такты fr_counter=0; //Обнуляем счетчик }
interrupt [ADC_INT] void adc_isr(void) { //Прерывание ADC if (ADCH>lv&vup==0) vup=1; //Если уровень идет вверх if (ADCH<lv&vup!=0) {vup=0;fr_counter++;} //Если уровень идет вниз, прибавляем такт lv=ADCH; //Сохраняем значение ADC ADCSRA|=0x40; //Запускаем ADC }
void main(void) { //Главная процедура DDRB=0x7f; //Порт B биты 0-6 выходы DDRD=0x0f; //Порт D биты 0-3 выходы TCCR1B=0x05; //Таймер1 частота 7.813KHz Mode Normal Top=0xffff OCR1AH=0x1e; //Старший байт сравнения OCR1AL=0x85; //Младший байт сравнения TIMSK=0x10; //Разрешаем прерывание для Таймера1 ADMUX=0x60; //Выбираем 0 бит порта C для ADC, разрядность ADC 8 бит и опорное напряжение от AVCC ADCSRA=0x89; //Разрешаем ADC, устанавливаем частоту 1MHz #asm("sei") //Разрешаем прерывания ADCSRA|=0x40; //Запускаем ADC while (1) segs_show(); //Цикл отображения разрядов }
|