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

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


avr-examples

Розбіжності

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

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

Наступна ревізія
Попередня ревізія
avr-examples [2015/06/28 15:49] – створено + "8 светодиодов" wombatavr-examples [2015/07/09 16:29] (поточний) – I2C example wombat
Рядок 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>
 +
 +===== I2C / TWI =====
 +
 +http://www.nongnu.org/avr-libc/user-manual/group__twi__demo.html
 +
 +
 +
avr-examples.1435506562.txt.bz2 · Востаннє змінено: повз wombat