Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Green
2017-10-01 22:25:26

Сначала одно, затем другое... Похоже второй Сима.(

Валерий Книнский
2017-10-01 00:25:27

Это сразу в глаза не бросается, вариант 1 не работает
// option 1
                        static short address_short = *index_ROM;
                        static char c;
                        for (int i = 0; i < len_index; i++) {
                          c = pgm_read_byte_near(address_short++i);
                          Serial.write(c);
                        }
а вариант 2 работает, хотя с точки зрения СИшного кода оба варианты правильны
// option 2
                        static char c
                        for (int i = 0; i < len_index; i++) {
                          c = pgm_read_byte_near(index_ROM + i);
                          Serial.write(c);
                        }

Валерий Книнский
2017-10-01 00:13:50

Вячеслав!
Большое спасибо за подсказку, а также всем поучавствовашим. Формат подсмотрел по ссылке
https://www.arduino.cc/en/Reference/PROGMEM
Немножко странный формат, ну да ладно, в Си для встроенных контроллеров это всегда так. При отладке немного поплутал. Меня смутило, что библиотеки SPI.h, Ethernet.h светятся красным, а avr/pgmspace нет.
С кодировкой все в порядке, но указатели "убегали" по очень простой причине. Буфер был величиной 650 байт, а формат указателя byte. Это я с самого начала проглядел.

Green
2017-09-30 18:10:41

Валерий Книнский, если всё так как Вы написали, то просто кодировка.)

Валерий Книнский
2017-09-30 16:24:23

Спасибо за быстрый ответ, буду разбираться. Но по ходу есть еще вопрос:
  Гоняю программу тестирования печатной платы, которая работает следующим образом: после включения она гоняет тест и при каждом прогоне выкидывает в технологический монитор сообщения "Запуск прохода" и "Конец прохода".
  Останавливаю тест, включаю Ethernet (плата стоит сервером на Ethernet). Контролирую в том же технологическом мониторе, что запрос с компа пришел правильный.
  Запускаю опять тест, теперь в строках сообщений в технологическом мониторе передаются какие-то строки из ОЗУ. Т.е. программа при исполнении модуля Serial.println("Запуск прохода") устанавливает указатель не туда.
  Я подозреваю, что мне просто не хватает какой-то библиотеки, например <avr/pgmspace.h>, которая позволит контроллеру отделить массивы, располагаемые в ОЗУ от массивов, располагаемых в ПЗУ.
  Где эту библиотеку взять?
  Или проблема не в этом?

NoName
2017-09-30 14:21:48

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

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

Валерий Книнский
2017-09-30 14:10:55

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

NoName
2017-09-29 21:39:11
Вячеслав Азаров пише:

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

+

Валерий Канинский
2017-09-29 20:39:25

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

Валерий Канинский
2017-09-29 20:34:11

Я работаю с 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 секунду!), то все начинает работать.

Green
2017-08-07 10:09:45

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

Green
2017-08-05 11:35:07

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

NoName
2017-08-05 11:23:35
Green пише:

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

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

Green
2017-08-05 11:06:56

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

NoName
2017-08-05 10:26:48
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);!!!!!!!!!!!!!!!!!!!!!!
    }

Підвал форуму