Ви не увійшли.
Сначала одно, затем другое... Похоже второй Сима.(
Это сразу в глаза не бросается, вариант 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);
}
Вячеслав!
Большое спасибо за подсказку, а также всем поучавствовашим. Формат подсмотрел по ссылке
https://www.arduino.cc/en/Reference/PROGMEM
Немножко странный формат, ну да ладно, в Си для встроенных контроллеров это всегда так. При отладке немного поплутал. Меня смутило, что библиотеки SPI.h, Ethernet.h светятся красным, а avr/pgmspace нет.
С кодировкой все в порядке, но указатели "убегали" по очень простой причине. Буфер был величиной 650 байт, а формат указателя byte. Это я с самого начала проглядел.
Валерий Книнский, если всё так как Вы написали, то просто кодировка.)
Спасибо за быстрый ответ, буду разбираться. Но по ходу есть еще вопрос:
Гоняю программу тестирования печатной платы, которая работает следующим образом: после включения она гоняет тест и при каждом прогоне выкидывает в технологический монитор сообщения "Запуск прохода" и "Конец прохода".
Останавливаю тест, включаю Ethernet (плата стоит сервером на Ethernet). Контролирую в том же технологическом мониторе, что запрос с компа пришел правильный.
Запускаю опять тест, теперь в строках сообщений в технологическом мониторе передаются какие-то строки из ОЗУ. Т.е. программа при исполнении модуля Serial.println("Запуск прохода") устанавливает указатель не туда.
Я подозреваю, что мне просто не хватает какой-то библиотеки, например <avr/pgmspace.h>, которая позволит контроллеру отделить массивы, располагаемые в ОЗУ от массивов, располагаемых в ПЗУ.
Где эту библиотеку взять?
Или проблема не в этом?
https://geektimes.ru/post/258766/
http://robotosha.ru/arduino/sublime-text-as-ide-arduino.html
стандартный IDE наверное хорош при попытках разобратся с кучей разновлановых arduino devices
я пишу в notepad++ ошибки исправляю в родной ардуиновской IDE ( родная среда - это писец полный %) )
Вячеслав!
Я абсолютно с Вами согласен. Продукт полезный.
Я только ответил на первый вопрос господина Krian, поскольку никто до этого не удосужился этого сделать.
Кроме того, я попытался вкратце оценить "недостатки" такого подхода, чтобы тот, кто берется за Arduino, сразу же представил "ограничения", которые его ждут.
Кроме того, и для "профессионалов старой закалки" он тоже очень наглядно демонстрирует современные подходы к разработке встроенных проектов.
Ну уж очень неудобно. Наверное, я еще не все инструменты освоил, которые доступны. Но у меня при работе с Arduino IDE все время создается впечатление, как будто по темной глубокой пещере лазишь с фонариком.
....Лично я, при всех недостатках этого шедевра, считаю его полезным не только для начинающих.
+
Извиняюсь, еще раз просмотрел тему, я перепутал имя - не Вячеслав Азаров, а Krian
Я работаю с 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 секунду!), то все начинает работать.
И не только числа. Например, "я Вас помножу на 0").
Вижу, в данном случае подходит другое. "На этот счёт есть несколько мнений. Одно моё, остальные неправильные".)
Толи дело delayMicroseconds() ).
А знать/не знать уже от человека зависит. Всё знать невозможно. А когда будет затык - вот тогда и будем разбираться. Или звать на помощь.) Есть и такой подход.
us not ms). Кстати это всё работа билдера. При этом думать (знать!) не обязательно.)
точно us ) дето очки посеял
но мне это "При этом думать (знать!) не обязательно." как то не нравится
us not ms). Кстати это всё работа билдера. При этом думать (знать!) не обязательно.)
Здравствуйте уважаемые форумчане!
.....
Моя программа в 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);!!!!!!!!!!!!!!!!!!!!!!
}