Користувальницькькі налаштування

Налаштування сайту


avr-examples

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Остання ревізія 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>​
 +
 +
avr-examples.txt · В останнє змінено: 2015/07/09 19:29 by wombat