Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Остання ревізія Both sides next revision | |||
avr-examples [2015/06/28 18:49] wombat створено + "8 светодиодов" |
avr-examples [2015/06/29 01:17] wombat АЦП и 8 светодиодов |
||
---|---|---|---|
Рядок 42: | Рядок 42: | ||
} | } | ||
</file> | </file> | ||
+ | |||
+ | |||
+ | ===== АЦП и 8 светодиодов ===== | ||
+ | |||
+ | Эта программа периодически считывает напряжение с АЦП (первая ножка порта "A") и выдаёт уровень, последовательно зажигая линейку из 8-ми светодиодов (ножки порта "C"). | ||
+ | |||
+ | <file c adc-leds.c> | ||
+ | #define F_CPU 11059200UL // Тактовая частота 11.0592 MHz | ||
+ | |||
+ | #include <inttypes.h> | ||
+ | #include <avr/io.h> | ||
+ | #include <avr/interrupt.h> | ||
+ | |||
+ | |||
+ | 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; // Зажигаем нужные светодиоды | ||
+ | } | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ |