АЦП в avr328p

Тема в разделе "Микроконтроллеры AVR", создана пользователем Danil_2002, 27 май 2019.

  1. Danil_2002

    Danil_2002 Гик

    Код (C++):
    #include <avr/io.h>
    #include <avr/interrupt.h>
    volatile int result_ADC = 0;
    ISR(ADC_vect)
    {
      result_ADC = ADC;
      Serial.println(result_ADC);
    }
    void ADC_init()
    {
      ADMUX = (1 << REFS0); // V питания
      ADMUX |= (1 << ADIE);
      ADCSRA = (1 << ADEN) // Включаем ADC
      |(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0); // Предделитель
    }
    void ADC_convert()
    {
      ADCSRA |= 1 << ADSC;
    }
    int main()
    {
      Serial.begin(9600);
      ADC_init();
      sei();
      ADC_convert();
      while(1)
      {
      }
    }
    Просто у меня опять кроме 0 не выводит
     
  2. parovoZZ

    parovoZZ Гуру

    Эмммм....у 328 вот этот вектор
    наверняка другой. Я не помню - моежт другой кто подскажет. Надо подсмотреть в заголовочнике на проц. Не, такой же. Serial.printin из прерывания вытаскивай.
     
  3. Danil_2002

    Danil_2002 Гик

    Нет, тот вектор. Я посмотрел.
     
  4. parovoZZ

    parovoZZ Гуру

    вот это надо исправить.
    бит ADIE в другом регистре сидит. Здесь же другой пин выбрал, а не тот, который ждешь. Кстати, а где выбор пина? Регистр ADMUX.
     
  5. Danil_2002

    Danil_2002 Гик

    Да! Регистр перепутал. Спасибо.
    Вот рабочий код для таких как я:
    Код (C++):
    #include <avr/io.h>
    #include <avr/interrupt.h>
    volatile int result_ADC = 0;
    ISR(ADC_vect)
    {
      result_ADC = ADC;
      Serial.println(result_ADC);
      ADCSRA |= (1 << ADSC);
    }
    void ADC_init()
    {
      ADMUX = (1 << REFS0); // V питания
      ADCSRA = (1 << ADIE);
      ADCSRA |= (1 << ADEN) // Включаем ADC
      |(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0); // Предделитель
    }
    void ADC_convert()
    {
      ADCSRA |= 1 << ADSC;
    }
    int main()
    {
      Serial.begin(9600);
      ADC_init();
      sei();
      ADC_convert();
      while(1)
      {
      }
    }
     
  6. AlexU

    AlexU Гуру

    Спорное заявление.
    По поводу обработчика прерывания:
    Код (C++):
    ISR(ADC_vect)
    {
      result_ADC = ADC;
      Serial.println(result_ADC);  // Так делать нельзя, если буфер переполнится, микроконтроллер зависнет.
      ADCSRA |= (1 << ADSC);    // А вот это вот зачем?
    }
    Вот это:
    Код (C++):
    ADCSRA = (1 << ADIE);
    ADCSRA |= (1 << ADEN) // Включаем ADC
      |(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0);
    лучше объединить в одну строчку:
    Код (C++):
    ADCSRA = (1 << ADIE) | (1 << ADEN) // Включаем ADC
      |(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0);
     
  7. b707

    b707 Гуру

    Danil_2002 - вывод Сериал из прерывания выкиньте.