#1 2017-08-04 12:45:41

krian
Участник
Зарегистрирован: 2017-08-04
Сообщений: 6

построение программы в Arduino

Здравствуйте уважаемые форумчане!
Я не профессиональный программист, поэтому буду задавать глупые вопросы. Прежде, чем их задавать, я просмотрел массу букварей и статей, но все равно остались неясности. Раньше для программирования AVR я использовал CVAVR. Про язык Arduino пишут , что это по сути тот же Си++ и там можно использовать практически все функции Си. Но оно так прямо не получается.
Моя программа в CVAVR, которую я беру за прототип, построена так.
1. Вначале подключаются библиотеки и описываются глобальные переменные.
2. Затем идет описание прерываний и процедур, которые по каждому прерыванию должны выполняться.
3. затем идет основной цикл main, где вначале производится настройка всех необходимых для работы портов, регистров, битов.
4. вся остальная программа крутится в цикле while.
Т.е. все в основном работает в прерываниях. АЦП, таймеры и синхронизация внешним сигналом. Результаты обрабатываются в основном цикле, там же производится управление исполнительными устройствами по результатам и вывод на индикацию.
Вопросы такие.
1. Что из вышеописанного я должен поместить в setup, а что в loop?
2. Могу ли я настраивать АЦП, регистры и таймеры по-своему, а не так, как это предусмотрено стандартным для arduino способом? Например, чтение напряжения с порта, который объявлен аналоговым входом мне не надо. Это долго. Мне надо сканировать по кругу несколько портов и по прерываниям присваивать значения соответствующим переменным.
Например так:
#define FIRST_ADC_INPUT 1
#define LAST_ADC_INPUT 3
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
       
interrupt [ADC_INT] void ADC_complete (void)
    {
        static unsigned char input_index=0;
    // Read the AD conversion result
    adc_data[input_index]=ADCW;
   
    // Select next ADC input
    if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
       {
        input_index=0;
        ADCSRA=(0<<ADSC) | (0<<ADIE); // Выключение АЦП
       }
       
    ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    }
После сканирования портов АЦП выключается. А включается АЦП в другом прерывании, от таймера.
В arduino такая программа будет работать или нет?
3. Как я понял в языке Arduino (в библиотеках) описаны не только те контроллеры, которые устанавливаются на платах конструктора, а вообще все контроллеры AVR, выпускаемые Atmel. Как их подключать? #include <mega128.h>? Как они будут прошиваться?

#2 2017-08-04 13:15:32

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Это все тот же С, во всем своем многообразии. Ардуино использует компилятор GNU GCC. Возможно, что ваша CVAVR тоже. Заголовочные файлы в GCC для AVR называются так же как официальные. Для atmega328 можно включить <avr/iom328.h> или <avr/io.h> с предварительным определением #define __AVR_ATmega328__ . Arduino IDE это делает автоматически, в настройках плат.

#3 2017-08-04 14:21:33

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: построение программы в Arduino

Не, не, не. CVAVR - это отдельный компилятор, со своими расширениями. Его фишка в наличии билдера, с помощью которого легко настроить периферию. Ну и достаточно много библиотек (без исходников!) и примеров. По простоте освоения был на 1-м месте (до Ардуино)) у начинающих.

#4 2017-08-04 14:30:58

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,228

Re: построение программы в Arduino

ADCSRA=(0<<ADSC) | (0<<ADIE); // Выключение АЦП

как то совсем не просто )  , кто это такие примеры делает? кто так людей ненавидит? )

#5 2017-08-04 14:36:12

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: построение программы в Arduino

Нормально.)) Скобки лишние. А нули для того что бы видеть что сбрасываешь. Поставил единицы и ужЕ включил. Только про остальные бы биты не забыть.)))

#6 2017-08-04 15:03:16

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Green пишет:

Не, не, не. CVAVR - это отдельный компилятор, со своими расширениями. Его фишка в наличии билдера, с помощью которого легко настроить периферию. Ну и достаточно много библиотек (без исходников!) и примеров. По простоте освоения был на 1-м месте (до Ардуино)) у начинающих.

Да, похоже на то. У французов хорошая школа. Филип Канн оттуда.

Редактировался Вячеслав Азаров (2017-08-04 15:03:29)

#7 2017-08-04 15:04:45

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

NoName пишет:

ADCSRA=(0<<ADSC) | (0<<ADIE); // Выключение АЦП

как то совсем не просто )  , кто это такие примеры делает? кто так людей ненавидит? )

5++

#8 2017-08-04 15:25:13

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: построение программы в Arduino

Вячеслав Азаров пишет:

Да, похоже на то. У французов хорошая школа. Филип Канн оттуда.

)) Между прочим, автор это IDE (весьма неплохого, кстати) некто Павел Хайдук, из бывшего Союза. Не думаю что он француз, хотя...))

#9 2017-08-04 16:01:51

krian
Участник
Зарегистрирован: 2017-08-04
Сообщений: 6

Re: построение программы в Arduino

NoName пишет:

ADCSRA=(0<<ADSC) | (0<<ADIE); // Выключение АЦП

как то совсем не просто )  , кто это такие примеры делает? кто так людей ненавидит? )

Во-первых. Это я не для людей писал, а для себя. Мне так понятно, поэтому я так и написал. И скобки там нужны. Было это лет 5 назад. После этого из программ я почти ничего не писал. Не программист я. Теперь снова потребовалось.
Во-вторых. Зубоскалить легче всего. Если Вы считаете себя эрудитом в этих вопросах, покажите, как было бы правильнее по-Вашему, и приведите аргументы в пользу своего мнения.
Иначе непонятно, зачем вы вообще это написали?

#10 2017-08-04 16:15:39

krian
Участник
Зарегистрирован: 2017-08-04
Сообщений: 6

Re: построение программы в Arduino

Вячеслав Азаров пишет:

Это все тот же С, во всем своем многообразии. Ардуино использует компилятор GNU GCC. Возможно, что ваша CVAVR тоже. Заголовочные файлы в GCC для AVR называются так же как официальные. Для atmega328 можно включить <avr/iom328.h> или <avr/io.h> с предварительным определением #define __AVR_ATmega328__ . Arduino IDE это делает автоматически, в настройках плат.

А если, например ATMega644, или еще какой нибудь ( в библиотеке Arduino даже Xmega есть)? Как его подключить? И как потом сказать программатору? Кроме того, загрузчик, который используется в среде Arduino, он же, наверное, для разных кристаллов по разному загружаться должен? Можно, конечно и без загрузчика, НЕХ код через SPI. Наверное ж можно. Но где написано, как это делать?

#11 2017-08-04 16:27:22

krian
Участник
Зарегистрирован: 2017-08-04
Сообщений: 6

Re: построение программы в Arduino

Green пишет:

Не, не, не. CVAVR - это отдельный компилятор, со своими расширениями. Его фишка в наличии билдера, с помощью которого легко настроить периферию. Ну и достаточно много библиотек (без исходников!) и примеров. По простоте освоения был на 1-м месте (до Ардуино)) у начинающих.

Билдер - это конечно удобная штука. Но вряд ли CVAVR используют только из-за него и я не согласен, что он для начинающих. В нем работают люди, которые пишут программы для авионики (это электроника для авиации, если кто не знал). Код сформированный в этом билдере можно без коррекций скопировать в тот же GCC или другую среду. И примеров в CVAVR полно.
Еще есть Algorithm Builder. Там настройщик периферии еще удобнее. Но это ассемблер. И для начинающих тоже очень неплохой старт. Хотя профессионалы на нем пишут серьезные программы. Когда нужно писать на ассемблере, лучше среды я не видел. К сожалению, он поддерживает только AVR контроллеры. Распространяется бесплатно.

Редактировался krian (2017-08-04 16:35:43)

#12 2017-08-04 16:33:31

krian
Участник
Зарегистрирован: 2017-08-04
Сообщений: 6

Re: построение программы в Arduino

Кстати!
На мои вопросы кто-нибудь может ответить?

#13 2017-08-04 17:02:33

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,228

Re: построение программы в Arduino

базовый принцип
для вашего MCU  -  сами разберетесь
кстати, "Я не профессиональный программист, поэтому буду задавать глупые вопросы. "  -  это лишнее )

//                MSP430F149
//            -----------------
//           |                 |
//   Vin0 -->|P6.0/A0          |
//   Vin1 -->|P6.1/A1          |
//   Vin2 -->|P6.2/A2          |
//   Vin3 -->|P6.3/A3          |
//           |                 |
//
//
//  M. Mitchell
//  Texas Instruments Inc.
//  Feb 2005
//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
//******************************************************************************

#include <msp430.h>

static unsigned int results[4];             // Needs to be global in this example
                                            // Otherwise, the compiler removes it
                                            // because it is not used for anything.

int main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL = 0x0F;                             // Enable A/D channel inputs
  ADC12CTL0 = ADC12ON+MSC+SHT0_2;           // Turn on ADC12, set sampling time
  ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, single sequence
  ADC12MCTL0 = INCH_0;                      // ref+=AVcc, channel = A0
  ADC12MCTL1 = INCH_1;                      // ref+=AVcc, channel = A1
  ADC12MCTL2 = INCH_2;                      // ref+=AVcc, channel = A2
  ADC12MCTL3 = INCH_3+EOS;                  // ref+=AVcc, channel = A3, end seq.
  ADC12IE = 0x08;                           // Enable ADC12IFG.3
  ADC12CTL0 |= ENC;                         // Enable conversions

  while(1)
  {
  ADC12CTL0 |= ADC12SC;                     // Start conversion
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, Enable interrupts
  }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
#else
#error Compiler not supported!
#endif
{
  results[0] = ADC12MEM0;                   // Move results, IFG is cleared
  results[1] = ADC12MEM1;                   // Move results, IFG is cleared
  results[2] = ADC12MEM2;                   // Move results, IFG is cleared
  results[3] = ADC12MEM3;                   // Move results, IFG is cleared
  __bic_SR_register_on_exit(LPM0_bits);     // Clear LPM0, SET BREAKPOINT HERE
}

//               MSP430F149
//             ---------------
//            |               |
//     Vin -->|P6.0/A0        |
//            |               |
//
//
//  M. Mitchell
//  Texas Instruments Inc.
//  Feb 2005
//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
//******************************************************************************

#include <msp430.h>

#define   Num_of_Results   8

static unsigned int results[Num_of_Results];  // Needs to be global in this
                                              // example. Otherwise, the
                                              // compiler removes it because it
                                              // is not used for anything.

int main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL |= 0x01;                            // Enable A/D channel A0
  ADC12CTL0 = ADC12ON+SHT0_8+MSC;           // Turn on ADC12, set sampling time
  ADC12CTL1 = SHP+CONSEQ_2;                 // Use sampling timer, set mode
  ADC12IE = 0x01;                           // Enable ADC12IFG.0
  ADC12CTL0 |= ENC;                         // Enable conversions
  ADC12CTL0 |= ADC12SC;                     // Start conversion
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0,Enable interrupts
}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
#else
#error Compiler not supported!
#endif
{
  static unsigned int index = 0;

  results[index] = ADC12MEM0;               // Move results
  index = (index+1)%Num_of_Results;         // Increment results index, modulo
}

DMA у вас наверное нет. потому даже не предлагаю смотреть.

#14 2017-08-04 17:15:18

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

krian пишет:

Кстати!
На мои вопросы кто-нибудь может ответить?

Если вы по поводу расширения платформ Ардуино, то вам придется потрудиться изучая скрипты оболочки. В ардуино можно подключить, что угодно, даже другие компиляторы, как сделано для ESP8266. Исходники проекта открыты, но пошаговых руководств нет.

#15 2017-08-04 17:21:39

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Green пишет:
Вячеслав Азаров пишет:

Да, похоже на то. У французов хорошая школа. Филип Канн оттуда.

)) Между прочим, автор это IDE (весьма неплохого, кстати) некто Павел Хайдук, из бывшего Союза. Не думаю что он француз, хотя...))

Да и Чарльз Хоар обучался в Союзе, машинному переводу.

#16 2017-08-04 18:21:26

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: построение программы в Arduino

Вячеслав Азаров пишет:

Да и Чарльз Хоар обучался в Союзе, машинному переводу.

А вот и не знал.((

#17 2017-08-04 20:47:32

krian
Участник
Зарегистрирован: 2017-08-04
Сообщений: 6

Re: построение программы в Arduino

NoName пишет:

базовый принцип
для вашего MCU  -  сами разберетесь

Вы приводите просто другой способ. Никакого преимущества он не дает и никакой он не базовый. Даже хуже. У вас это побитные операции, а по моей записи компилятор CVAVR, как пишут специалисты, формирует масочную. Это имеет преимущество и по длине кода и по времени выполнения.
Можно еще ассемблерный код включить. Это кому как нравится. Способ изменения битов не один.
Но ни ваш пример, ни ваши комментарии не имеют никакого отношения к теме и поставленным вопросам, поэтому на тему способов изменения битов я здесь больше писать не буду.

#18 2017-08-04 21:17:30

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Вячеслав Азаров пишет:
NoName пишет:

ADCSRA=(0<<ADSC) | (0<<ADIE); // Выключение АЦП

как то совсем не просто )  , кто это такие примеры делает? кто так людей ненавидит? )

5++

Если я не ощибаюсь, это называется тавтологтей, или жестче, словоблудием. Если нужно сбрость всего два бита в слове то нужно было записать так:

ADCSRA &= ~(1<<ADSC | 1<<ADIE);

Если все биты в слове, записать честно:

ADCSRA = 0;

А что это за художества - непонятно. Нельзя издеваться над начинающими!

Редактировался Вячеслав Азаров (2017-08-04 21:19:36)

#19 2017-08-04 21:39:34

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: построение программы в Arduino

А кому то нравится ADCSRA &= ~_BV(ADSC) & ~_BV(ADIE); Всё заради наглядности.
А при ADCSRA = 0; этих битов просто не видно в упор. И нужно DS держать под рукой.

#20 2017-08-04 22:06:41

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Green пишет:

А кому то нравится ADCSRA &= ~_BV(ADSC) & ~_BV(ADIE); Всё заради наглядности.
А при ADCSRA = 0; этих битов просто не видно в упор. И нужно DS держать под рукой.

ADPS0 содержит  биты ADPS1, ADPS2, ADIE, ADIF, ADATE, ADSC, ADEN, они ведь все сбрасываются наглядным написанием. Что вы на это скажете? А в общем, ивините меня и не обижайтесь. Это, похоже, больше никому, кроме нас, не нужно.

Редактировался Вячеслав Азаров (2017-08-04 22:27:56)

#21 2017-08-05 01:33:54

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,228

Re: построение программы в Arduino

krian пишет:
NoName пишет:

базовый принцип
для вашего MCU  -  сами разберетесь

Вы приводите просто другой способ. Никакого преимущества он не дает и никакой он не базовый. Даже хуже. У вас это побитные операции, а по моей записи компилятор CVAVR, как пишут специалисты, формирует масочную. Это имеет преимущество и по длине кода и по времени выполнения.
Можно еще ассемблерный код включить. Это кому как нравится. Способ изменения битов не один.
Но ни ваш пример, ни ваши комментарии не имеют никакого отношения к теме и поставленным вопросам, поэтому на тему способов изменения битов я здесь больше писать не буду.

ну здрасте , приехали... 
"как пишут специалисты, формирует масочную." это побайтово что ли? 

Вы эту штуку рекламируете?
42076597a08eb79ca6019bf0d7848421.image.640x480.jpg

150.00€  145.00€
Save: 3% off
Add to Cart

CodeVisionAVR Standard (free ? )
Advanced (S + LCD Lib) ( +50.00€ )
Dev Kit 1 (A + XG8800) ( +150.00€ )
Dev Kit 2 (DK1 + ICE) ( +250.00€ )

#22 2017-08-05 07:46:29

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Ну да. Людям за, что-то жить нужно. Разработка таких систем стоит годы труда десятков опытнейших прогрммистов (не кодеров). Это еще и не дорого. Кейловский uVision для Кортексов 9000 евро стоит, А Визуал студио 6000. А компания IAR на свою продукцию цены даже не оглашает. Мне игрушечную лицензию дали но сколько стоит купить так и не сказали.

Редактировался Вячеслав Азаров (2017-08-05 07:48:40)

#23 2017-08-05 08:11:16

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 280

Re: построение программы в Arduino

Вячеслав Азаров пишет:

ADPS0 содержит  биты ADPS1, ADPS2, ADIE, ADIF, ADATE, ADSC, ADEN, они ведь все сбрасываются наглядным написанием. Что вы на это скажете? А в общем, ивините меня и не обижайтесь. Это, похоже, больше никому, кроме нас, не нужно.

А не использую я другие биты, в нуле они! А играюсь только двумя. Либо сбросил  0<<BIT1 | 0<<BIT2, либо установил 1<<BIT1 | 1<<BIT2. И считаю что так нагляднее.
Разговор ни о чём! Так не я же начал? И какие там обиды. Каждый имеет своё мнение и делает как считает нужным. Не в коллективе ж ведь, требований то никто не ставит.)
А то что Вам такие "конструкции" кажутся необычными, так не привыкли просто.)

#24 2017-08-05 08:39:32

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 415

Re: построение программы в Arduino

Green пишет:
Вячеслав Азаров пишет:

ADPS0 содержит  биты ADPS1, ADPS2, ADIE, ADIF, ADATE, ADSC, ADEN, они ведь все сбрасываются наглядным написанием. Что вы на это скажете? А в общем, ивините меня и не обижайтесь. Это, похоже, больше никому, кроме нас, не нужно.

А не использую я другие биты, в нуле они! А играюсь только двумя. Либо сбросил  0<<BIT1 | 0<<BIT2, либо установил 1<<BIT1 | 1<<BIT2. И считаю что так нагляднее.
Разговор ни о чём! Так не я же начал? И какие там обиды. Каждый имеет своё мнение и делает как считает нужным. Не в коллективе ж ведь, требований то никто не ставит.)
А то что Вам такие "конструкции" кажутся необычными, так не привыкли просто.)

Привык. Я всякое видал, еще и не такое. Нужно было бы насобирать такие "конструкции" и отрыть блог, да нет желания.  wink

Редактировался Вячеслав Азаров (2017-08-05 08:40:07)

#25 2017-08-05 10:26:48

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,228

Re: построение программы в Arduino

krian пишет:

Здравствуйте уважаемые форумчане!
.....
Моя программа в CVAVR, которую я беру за прототип, построена так.
1. Вначале подключаются библиотеки и описываются глобальные переменные.
2. Затем идет описание прерываний и процедур, которые по каждому прерыванию должны выполняться.
3. затем идет основной цикл main, где вначале производится настройка всех необходимых для работы портов, регистров, битов.
4. вся остальная программа крутится в цикле while.
Т.е. все в основном работает в прерываниях. АЦП, таймеры и синхронизация внешним сигналом. Результаты обрабатываются в основном цикле, там же производится управление исполнительными устройствами по результатам и вывод на индикацию.
Вопросы такие.
1. Что из вышеописанного я должен поместить в setup, а что в loop?

ответ типа по делу  )
// int main(void) пример .
SETUP
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL = 0x0F;                             // Enable A/D channel inputs
  ADC12CTL0 = ADC12ON+MSC+SHT0_2;           // Turn on ADC12, set sampling time
  ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, single sequence
  ADC12MCTL0 = INCH_0;                      // ref+=AVcc, channel = A0
  ADC12MCTL1 = INCH_1;                      // ref+=AVcc, channel = A1
  ADC12MCTL2 = INCH_2;                      // ref+=AVcc, channel = A2
  ADC12MCTL3 = INCH_3+EOS;                  // ref+=AVcc, channel = A3, end seq.
  ADC12IE = 0x08;                           // Enable ADC12IFG.3
  ADC12CTL0 |= ENC;                         // Enable conversions
}

//  while(1)

LOOP
{
  ADC12CTL0 |= ADC12SC;                     // Start conversion
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, Enable interrupts
}

krian пишет:

2. Могу ли я настраивать АЦП, регистры и таймеры по-своему, а не так, как это предусмотрено стандартным для arduino способом? Например, чтение напряжения с порта, который объявлен аналоговым входом мне не надо. Это долго. Мне надо сканировать по кругу несколько портов и по прерываниям присваивать значения соответствующим переменным.
..........
После сканирования портов АЦП выключается. А включается АЦП в другом прерывании, от таймера.
В arduino такая программа будет работать или нет?
..........

https://habrahabr.ru/post/247663/

это не то  что автор хочет наверное.  а почему нужен преезд на wiring если есть CodeVisionAVR, бибилиотеки? 

NoName пишет:

отписался по одной причине у Вас в прерывании пауза в 10 мс. на фоне удобного Вам синтаксиса. какая мелочь просто потерялась.
всем читающим непрограммистам -  так делать не рекомендуется.

[FIX] в микросекундах. можно забить на замечание )

krian пишет:

interrupt [ADC_INT] void ADC_complete (void)
    {
  ...
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
  ...
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);!!!!!!!!!!!!!!!!!!!!!!
    }

Редактировался NoName (2017-08-05 11:29:42)

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела