#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 14:21:33

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

NoName пишет:

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

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

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

#7 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. Наверное ж можно. Но где написано, как это делать?

#8 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)

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

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

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

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

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

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

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 у вас наверное нет. потому даже не предлагаю смотреть.

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

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

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

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

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

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

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

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

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

NoName пишет:

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

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

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

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

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

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

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

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

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€ )

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

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

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

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

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

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

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

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

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)

#17 2017-08-05 11:06:56

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

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

us not ms). Кстати это всё работа билдера. При этом думать (знать!) не обязательно.)

#18 2017-08-05 11:23:35

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

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

Green пишет:

us not ms). Кстати это всё работа билдера. При этом думать (знать!) не обязательно.)

точно  us )  дето очки посеял
но мне это "При этом думать (знать!) не обязательно."  как то не нравится

#19 2017-08-05 11:35:07

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

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

Толи дело delayMicroseconds() ).
А знать/не знать уже от человека зависит. Всё знать невозможно. А когда будет затык - вот тогда и будем разбираться. Или звать на помощь.) Есть и такой подход.

#20 2017-08-07 10:09:45

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

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

И не только числа. Например, "я Вас помножу на 0").
Вижу, в данном случае подходит другое. "На этот счёт есть несколько мнений. Одно моё, остальные неправильные".)

#21 2017-09-29 20:34:11

Валерий Канинский
Гость

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

Я работаю с Arduino IDE неделю, а до того работал с IAR и думаю, что смогу дать ответ на первый вопрос Вячеслава Азарова, с которого началась данная тема:
   1)
   В Arduino IDE совсем другой подход к проектированию встроенной программы, чем в тех системах, где он ранее работал. Ранее предполагалось, что ты имеешь "голый" контроллер. Ты разбирался с его внутренностями, изучал все форматы и творил проект, в котором ты определял все. При этом тебе были доступны все его ресурсы, и ты мог сотворить многозадачный проект, все задачи которого работают параллельно в "жестком" реальном масштабе времени.
   Теперь тебе предлагается работать с "железом" только через "драйверы" - встроенные функции IDE библиотеки. В каждой библиотеке описываются ограничения, что использовано, а что нет. Об многих вещах, о которых ранее приходилось думать, теперь никто не думает. Все "просто как борщ", но в то же время такой подход годится "только для игрушек".
   2)
   Не даром в Arduino IDE проект называется скэтч. Попробуйте в этом IDE создать проект, состоящий из нескольких файлов. Попробуйте там открыть Си-шный файл или библиотеку. У меня по крайней мере этого не получилось. Может быть, я еще мало изучал документацию, плату купил, рабочее место организовал, далее будет видно.
  3)
  Поработал с элементарным примером "web_server_hw_button_pg_button" - скетч с веб сервером, обслуживающим две кнопки и две лампочки с аппаратной стороны (HardWare) и две кнопки со стороны компа (ProGram). В этой программе параллельно работают:
         - связь с клиентом через Ethernet
         - технологическая связь с Arduino Monitor через USB
   Был немало удивлен, когда обнаружил, что одно другому мешает работать. Вывожу один массив в обе линии, и он выводится неправильно. Если массив берется из ПЗУ, то указатель на этот массив устанавливается неправильно. Когда работает Ethernet, в технологический порт шлется "мусор" вместо сообщений, которые запрограммированы. А вот, когда мы всю эту работу растягиваем во времени, т.е. вставляем в нужных местах задержки типа delay(1000) (задержка на 1 секунду!), то все начинает работать.

#22 2017-09-29 20:39:25

Валерий Канинский
Гость

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

Извиняюсь, еще раз просмотрел тему, я перепутал имя - не Вячеслав Азаров, а Krian

#23 2017-09-29 21:39:11

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

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

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

....Лично я, при всех недостатках этого шедевра, считаю его полезным не только для начинающих.

+

#24 2017-09-30 14:10:55

Валерий Книнский
Гость

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

Вячеслав!
Я абсолютно с Вами согласен. Продукт полезный.
Я только ответил на первый вопрос господина Krian, поскольку никто до этого не удосужился этого сделать.
Кроме того, я попытался вкратце оценить "недостатки" такого подхода, чтобы тот, кто берется за Arduino, сразу же представил "ограничения", которые его ждут.
Кроме того, и для "профессионалов старой закалки" он тоже очень наглядно демонстрирует современные подходы к разработке встроенных проектов.
Ну уж очень неудобно. Наверное, я еще не все инструменты освоил, которые доступны. Но у меня при работе с Arduino IDE все время создается впечатление, как будто по темной глубокой пещере лазишь с фонариком.

#25 2017-09-30 14:21:48

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

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

https://geektimes.ru/post/258766/
http://robotosha.ru/arduino/sublime-text-as-ide-arduino.html

стандартный IDE наверное хорош  при попытках разобратся с кучей разновлановых arduino devices 
я пишу в notepad++  ошибки исправляю в родной ардуиновской IDE ( родная среда - это писец полный %) )

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

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

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