#define F_CPU 11059200UL // Тактовая частота 11.0592 MHz #include #include #include volatile uint16_t adcval; // Значение, считываемое с АЦП ISR(ADC_vect) // Обработчик прерывания АЦП { adcval = ADCW; } int main() // Главная функция { uint16_t digits = 0; int i; // Включаем АЦП и устанавливаем частоту дискретизации = F_CPU / 128 ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADPS2); sei(); // Разрешаем прерывания DDRA = 0b00000000; // Устанавливаем все ножки порта "A" на ввод DDRC = 0b11111111; // станавливаем все ножки порта "C" на вывод PORTC = 0b00000000; ADCSRA |= _BV(ADIE); // Разрешаем прерывания АЦП // Выбираем первую ножку (№0) для считывания напряжения АЦП ADMUX &= ~_BV(MUX0) & ~_BV(MUX1) & ~_BV(MUX2) & ~_BV(MUX3) & ~_BV(MUX4); // Выбор внутреннего напряжения 1.22В для считывания АЦП //ADMUX &= ~_BV(MUX0) ; //ADMUX |= _BV(MUX1) | _BV(MUX2) | _BV(MUX3) | _BV(MUX4); ADMUX |= _BV(REFS0) | _BV(REFS1); // Внутреннее опорное напряжение 2.56В ADCSRA |= _BV(ADATE); // Разрешаем автозапуск // Выбираем "Free running mode" SFIOR &= ~_BV(ADTS0) & ~_BV(ADTS1) & ~_BV(ADTS2); ADCSRA |= _BV(ADSC); // Запуск первого преобразования while (1) // Бесконечный цикл { //ADCSRA |= _BV(ADSC); // Запуск преобразования // Вычисляем количество светодиодов, которые нужно // зажечь при данном напряжении digits = 0b00000000; for (i=0; i< (adcval+1) / 128; i++) { digits = (digits << 1) +1; } /* if (adcval >= 1023) digits = 0b11111111; else if (adcval >= 895) digits = 0b01111111; else if (adcval >= 767) digits = 0b00111111; else if (adcval >= 639) digits = 0b00011111; else if (adcval >= 511) digits = 0b00001111; else if (adcval >= 383) digits = 0b00000111; else if (adcval >= 255) digits = 0b00000011; else if (adcval >= 127) digits = 0b00000001; else digits = 0b00000000; */ PORTC = digits; // Зажигаем нужные светодиоды } }