Ви не увійшли.
Здравствуйте уважаемые форумчане!
Я не профессиональный программист, поэтому буду задавать глупые вопросы. Прежде, чем их задавать, я просмотрел массу букварей и статей, но все равно остались неясности. Раньше для программирования 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>? Как они будут прошиваться?
Неактивний
Не, не, не. CVAVR - это отдельный компилятор, со своими расширениями. Его фишка в наличии билдера, с помощью которого легко настроить периферию. Ну и достаточно много библиотек (без исходников!) и примеров. По простоте освоения был на 1-м месте (до Ардуино)) у начинающих.
Неактивний
Да, похоже на то. У французов хорошая школа. Филип Канн оттуда.
)) Между прочим, автор это IDE (весьма неплохого, кстати) некто Павел Хайдук, из бывшего Союза. Не думаю что он француз, хотя...))
Неактивний
ADCSRA=(0<<ADSC) | (0<<ADIE); // Выключение АЦП
как то совсем не просто ) , кто это такие примеры делает? кто так людей ненавидит? )
Во-первых. Это я не для людей писал, а для себя. Мне так понятно, поэтому я так и написал. И скобки там нужны. Было это лет 5 назад. После этого из программ я почти ничего не писал. Не программист я. Теперь снова потребовалось.
Во-вторых. Зубоскалить легче всего. Если Вы считаете себя эрудитом в этих вопросах, покажите, как было бы правильнее по-Вашему, и приведите аргументы в пользу своего мнения.
Иначе непонятно, зачем вы вообще это написали?
Неактивний
Это все тот же С, во всем своем многообразии. Ардуино использует компилятор GNU GCC. Возможно, что ваша CVAVR тоже. Заголовочные файлы в GCC для AVR называются так же как официальные. Для atmega328 можно включить <avr/iom328.h> или <avr/io.h> с предварительным определением #define __AVR_ATmega328__ . Arduino IDE это делает автоматически, в настройках плат.
А если, например ATMega644, или еще какой нибудь ( в библиотеке Arduino даже Xmega есть)? Как его подключить? И как потом сказать программатору? Кроме того, загрузчик, который используется в среде Arduino, он же, наверное, для разных кристаллов по разному загружаться должен? Можно, конечно и без загрузчика, НЕХ код через SPI. Наверное ж можно. Но где написано, как это делать?
Неактивний
Не, не, не. CVAVR - это отдельный компилятор, со своими расширениями. Его фишка в наличии билдера, с помощью которого легко настроить периферию. Ну и достаточно много библиотек (без исходников!) и примеров. По простоте освоения был на 1-м месте (до Ардуино)) у начинающих.
Билдер - это конечно удобная штука. Но вряд ли CVAVR используют только из-за него и я не согласен, что он для начинающих. В нем работают люди, которые пишут программы для авионики (это электроника для авиации, если кто не знал). Код сформированный в этом билдере можно без коррекций скопировать в тот же GCC или другую среду. И примеров в CVAVR полно.
Еще есть Algorithm Builder. Там настройщик периферии еще удобнее. Но это ассемблер. И для начинающих тоже очень неплохой старт. Хотя профессионалы на нем пишут серьезные программы. Когда нужно писать на ассемблере, лучше среды я не видел. К сожалению, он поддерживает только AVR контроллеры. Распространяется бесплатно.
Остання редакція krian (2017-08-04 16:35:43)
Неактивний
базовый принцип
для вашего 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 у вас наверное нет. потому даже не предлагаю смотреть.
Неактивний
базовый принцип
для вашего MCU - сами разберетесь
Вы приводите просто другой способ. Никакого преимущества он не дает и никакой он не базовый. Даже хуже. У вас это побитные операции, а по моей записи компилятор CVAVR, как пишут специалисты, формирует масочную. Это имеет преимущество и по длине кода и по времени выполнения.
Можно еще ассемблерный код включить. Это кому как нравится. Способ изменения битов не один.
Но ни ваш пример, ни ваши комментарии не имеют никакого отношения к теме и поставленным вопросам, поэтому на тему способов изменения битов я здесь больше писать не буду.
Неактивний
NoName пише:базовый принцип
для вашего MCU - сами разберетесьВы приводите просто другой способ. Никакого преимущества он не дает и никакой он не базовый. Даже хуже. У вас это побитные операции, а по моей записи компилятор CVAVR, как пишут специалисты, формирует масочную. Это имеет преимущество и по длине кода и по времени выполнения.
Можно еще ассемблерный код включить. Это кому как нравится. Способ изменения битов не один.
Но ни ваш пример, ни ваши комментарии не имеют никакого отношения к теме и поставленным вопросам, поэтому на тему способов изменения битов я здесь больше писать не буду.
ну здрасте , приехали...
"как пишут специалисты, формирует масочную." это побайтово что ли?
Вы эту штуку рекламируете?
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€ )
Неактивний
ADPS0 содержит биты ADPS1, ADPS2, ADIE, ADIF, ADATE, ADSC, ADEN, они ведь все сбрасываются наглядным написанием. Что вы на это скажете? А в общем, ивините меня и не обижайтесь. Это, похоже, больше никому, кроме нас, не нужно.
А не использую я другие биты, в нуле они! А играюсь только двумя. Либо сбросил 0<<BIT1 | 0<<BIT2, либо установил 1<<BIT1 | 1<<BIT2. И считаю что так нагляднее.
Разговор ни о чём! Так не я же начал? И какие там обиды. Каждый имеет своё мнение и делает как считает нужным. Не в коллективе ж ведь, требований то никто не ставит.)
А то что Вам такие "конструкции" кажутся необычными, так не привыкли просто.)
Неактивний
Здравствуйте уважаемые форумчане!
.....
Моя программа в 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
}
2. Могу ли я настраивать АЦП, регистры и таймеры по-своему, а не так, как это предусмотрено стандартным для arduino способом? Например, чтение напряжения с порта, который объявлен аналоговым входом мне не надо. Это долго. Мне надо сканировать по кругу несколько портов и по прерываниям присваивать значения соответствующим переменным.
..........
После сканирования портов АЦП выключается. А включается АЦП в другом прерывании, от таймера.
В arduino такая программа будет работать или нет?
..........
https://habrahabr.ru/post/247663/
это не то что автор хочет наверное. а почему нужен преезд на wiring если есть CodeVisionAVR, бибилиотеки?
отписался по одной причине у Вас в прерывании пауза в 10 мс. на фоне удобного Вам синтаксиса. какая мелочь просто потерялась.
всем читающим непрограммистам - так делать не рекомендуется.
[FIX] в микросекундах. можно забить на замечание )
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)
Неактивний
us not ms). Кстати это всё работа билдера. При этом думать (знать!) не обязательно.)
точно us ) дето очки посеял
но мне это "При этом думать (знать!) не обязательно." как то не нравится
Неактивний
Толи дело delayMicroseconds() ).
А знать/не знать уже от человека зависит. Всё знать невозможно. А когда будет затык - вот тогда и будем разбираться. Или звать на помощь.) Есть и такой подход.
Неактивний
Я работаю с 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 секунду!), то все начинает работать.
Извиняюсь, еще раз просмотрел тему, я перепутал имя - не Вячеслав Азаров, а Krian
Вячеслав!
Я абсолютно с Вами согласен. Продукт полезный.
Я только ответил на первый вопрос господина Krian, поскольку никто до этого не удосужился этого сделать.
Кроме того, я попытался вкратце оценить "недостатки" такого подхода, чтобы тот, кто берется за Arduino, сразу же представил "ограничения", которые его ждут.
Кроме того, и для "профессионалов старой закалки" он тоже очень наглядно демонстрирует современные подходы к разработке встроенных проектов.
Ну уж очень неудобно. Наверное, я еще не все инструменты освоил, которые доступны. Но у меня при работе с Arduino IDE все время создается впечатление, как будто по темной глубокой пещере лазишь с фонариком.
https://geektimes.ru/post/258766/
http://robotosha.ru/arduino/sublime-text-as-ide-arduino.html
стандартный IDE наверное хорош при попытках разобратся с кучей разновлановых arduino devices
я пишу в notepad++ ошибки исправляю в родной ардуиновской IDE ( родная среда - это писец полный %) )
Неактивний