Сложные арифметические выражения

Тема в разделе "Arduino & Shields", создана пользователем barmaley_74, 4 ноя 2018.

  1. barmaley_74

    barmaley_74 Нуб

    Ребята спасибо большое за ЦУ с книгами. Скачал "Бьерн Страуструп. Язык программирования С++" и "Б. Керниган, Д. Ритчи Язык программирования Си Издание 3-е, исправленное" буду изучать.
     
  2. parovoZZ

    parovoZZ Гуру

    Так это не проц интел, на котором крутится паскаль, а малюпусенький микроконтроллер, у которого логика восьмибитная. При программировании надо исходить именно из этого, а не пытаться переносить навыки программирования с больших настольных систем.
    Сказано же - снимай с АЦП 8 бит и пихай их дальше. Не хватает уровня сигнала - используй дифференциальный режим АЦП с возможностью усиления.
    Про паскаль вообще забудь.
     
  3. В long будет умножение и деление, сложение в int. В принципе, математические операции имеют тот же приоритет, что и везде.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Учите Си.Смотрите видео и через час будете профи!

     
  5. Airbus

    Airbus Радиохулиган Модератор

    Все просто
    Код (C++):

    int ledPin = 9;  
    // светодиод подключен к цифровому выводу 9
    int analogPin = 3;   // датчик подключен к аналоговому выводу 3
    int val = 0;             // переменная для хранения значения
    void setup()
    {
      pinMode(ledPin, OUTPUT);   // переключение вывода в режим «выход»
    }
    void loop()
    {
      val = (1023-analogRead (analogPin));   // считываем входное напряжение
                        //и сразу делаем сложные вычисления
      analogWrite(ledPin, val / 4);  // и пуляем их обратно в ШИМ                    
    }
     
    Последнее редактирование: 6 ноя 2018
  6. parovoZZ

    parovoZZ Гуру

    Настраиваем АЦП:
    Код (C++):
    void ADC_Init(void)
    {
        DIDR0 = (1<<ADC1D) | (1<<ADC2D) | (1<<ADC3D);
     
        ADMUX = (1<<REFS1) | (0<<REFS0);            // Внутренний ИОН 1.1в

        ADCSRB = (1<<ADLAR) | (1<<ADTS1) | (1<<ADTS0);        // Работаем только со старшими 8-ю битами, запуск от таймера T0

        ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADATE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Прескалер = 8
    }
    Самые главные функции:
    Код (C++):
     void ADC_Start_Conversion (uint8_t Analog_input)
    {
         ADMUX |= Analog_input;

         ADCSRA |= Bit(ADSC);
    }


    uint8_t ADC_Get_Data (void)
    {
         return ADCH;
    }
    Ловим прерывания от АЦП, снимаем показания и выплевываем их в SPI:
    Код (C++):
    ISR(ADC_vect)
    {

    //SPI_ReadByte(213);
        //nRF_Dummy_transmit(ADC_Get_Data());
        SPI_ReadByte(ADC_Get_Data());
    //    Buf[indx_in++] = ADC_Get_Data();

    //    if ()
    //    {
    //    }
    //SPI_ReadByte(214);
    }

    Инициализируем АЦП:

    Код (C++):
        ADC_Init();
    Настраиваем и запускаем таймер:
    Код (C++):
     
    T0_Mode_CTC;
        T0_Set_OCR0A;
        TIMSK0 = Bit(OCIE0A);
        T0_Start_64;
    определяем дефайны:
    Код (C++):
    #define T0_Mode_CTC            TCCR0A = Bit(WGM01)

    #define T0_Set_OCR0A        OCR0A = 15

    #define T0_Start_64            TCCR0B = Prescaler_64; ClearPrescaler        // Пуск таймера с очисткой делителя
    Предварительная оцифровка (самая длинная по времени):
    Код (C++):
        ADC_Start_Conversion(ADC1);
    В главном цикле не делаем ровным счетом ни хера:
    Код (C++):
        //... Основной цикл
        while (1)
        {
            //SPI_ReadByte(Buf[out++]);
        }
    }
    Закомменчено - это отладочные плевки))
    Имеем: оцифровку со скоростью 8.125 кГц на 8 МГц тактовой. Диапазон 0-255.
    Весь код (а он здесь не весь=) весит 900 байт, использование ОЗУ - 0 байт. Сравните со своим страшным абдурино монстром.
     
  7. barmaley_74

    barmaley_74 Нуб

    По правде говоря я из всего Вашего написанного понял только то что АЦП ещё и настраивать можно, но я пока далёк от этого, я только начинаю работать с Ардуино.
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Он Вам показал что крутой Кодер на Си.А для начинающих нет смысла в таких извратах вполне подойдет analog read/write.
     
  9. parovoZZ

    parovoZZ Гуру

    я не крутой и не кодер. По сути я железячник. Программерству не обучен ни разу.
     
  10. Airbus

    Airbus Радиохулиган Модератор

    Тогда не путай новичка.У него и так в голове каша от Паскаля.Чтоб лихо кодить в Студии мало С++ знать надо ещё знать и железо чтоб лихо жонглировать регистрами как ты.А оно ему надо?Человек попросил глоток воды а ты ему начал рассказывать о "Мадам Клико".
     
    Последнее редактирование: 6 ноя 2018
  11. parovoZZ

    parovoZZ Гуру

    достаточно и Си.
    Почитать учебник на русском, потом даташиты с закрытыми глазами читать будешь. Что может быть проще АВР???
    Тема как называется? Такие темы называть под час при обсуждении вычисления CRC32, реализации крипто алгоритмов.
    Человек просто не в курсе, что за архитектура перед ним и что она умеет. Умножение и деление - это не конек АВР. Бери ARM ядро - там за пару тактов всё делится и умножается. Ещё и с плавающей запятой.
    Да и с каких пор умножение и деление это сложная математическая операция?
     
  12. DetSimen

    DetSimen Guest

    Для некоторых лудей - примерно с третьего класса.
     
    parovoZZ нравится это.
  13. Airbus

    Airbus Радиохулиган Модератор

    Не вижу смысла ради одной свистоперделки изучать архитектуру AVR.Да и современные языки максимально абстрагированы от железа.Тот же LUA.И это правильно.Ибо сапоги пусть шьет сапожник а пироги печет пирожник.Вы когда ставите обновления Виндовс вряд ли в реестр лезете?Кому надо тот сам поймет насколько глубоко копать.Ну а то что Вы крутой Уолкер мы давно поняли.
     
  14. parovoZZ

    parovoZZ Гуру

    Когда набирали монтажников на работу, попадались такие кадры, что так и вертелось на языке:
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Э...Чтоб штробить и дюбеля забивать русский разве нужен?Он и у нас то не особо-всё на английском.
     
  16. Arkad_snz

    Arkad_snz Гик

    6лин!
    Скоро на всех стенах/заборах вместо известного трехчлена будет нацарапано - "Для нормализации значений с датчика в команду манипулятору используй функцию map()!".
     
  17. parovoZZ

    parovoZZ Гуру

    Хуже. Там с образца не могли написать...