LINUX.ORG.RU

Arduino, совершенно не понимаю, что происходит.

 ,


1

1

Извините, ежели ошибся разделом, перенесите куда следует, если что.

Купил сыну конструктор, там клон Arduino Uno на Atmrga328. Попробовали несколько простеньких скетчей и тут я решил размять пальцы и усложнить задачу... Совершенно не понимаю, что происходит?

Цикл? Или не цикл? Создаю цикл в void loop:

void loop() {
  for(int A = 0;A<255;A++){
    Serial.println(A);
  }
}
При порверке и сборке ругается на то, что А не объявлена. Хорошо, объявляю в начале программы: «int A = 0»

И что вы думаете? Ардуина выдаёт мне 0, постоянно. Я не понял, «А» в цикле и «А» в команде «Serial.println(A)» внутри цикла - это разные переменные, что ли? Бред же. Даже в примерах циклы так пишут, но у меня почему-то это не работает.

Хорошо, идём обходным путём:

int A = 0;
void loop() {
  for(int B = 0;B<255;B++){
    Serial.println(A);
    A = A +1;
  }
  A = 0;
}
Сначала я написал без строки «A = 0», всё заработало, число пошло расти, но мне нужен диапазон до 255, поэтому добавил «A = 0» перед циклом... А снова стало постоянно равным нулю. Как это? Ведь оно ПЕРЕД циклом?!? Аотом от бессилия переставил после цикла, как в приведённом варианте, А всё также перманентно равно нулю. Ватдафак?

И тут я решил проверить как работают вообще вложенные циклы:

int A = 0;
int B = 0;
int C = 0;
void loop() {
  for(int A1 = 0;A1<255;A1++){
    for(int B1 = 0;B1<255;B1++){
      for(int C1 = 0;C1<255;C1++){
        Serial.println(A);
        Serial.println(B);
        Serial.println(C);
        C = C +1;
      }
      B = B + 1;
    }  
    A = A +1;
  }
}
По моему скудоумному понятию, в консоли должно выдавать по три значения друг за другом, при этом сначала С должно дорасти до 255, потом B и только потом А... Я нихрена не понимаю последовательности, все три значения растут ОДНОВРЕМННО.

КАК ЭТО ВОЗМОЖНО? Что вообще происходит? Что за бред? Обясните мне, дураку, я чего-то не понимаю, или с железкой что-то не так?

Поправка:

Так, проверил на своём компе, на котором ковырял всякие железки и 3Дпринтер на ардуине. Переключил на уно в настройках, больше ничего не делал. Цикл действительно работает как надо.

Что тогда может быть не так на втором компе, на котором всё плохо работало? Ардуину на него поставил только вчера, настроил на уну и всё. Обе системы идентичны по дистрибутиву(Манджара) и версиям пакетов. gcc-multilib на обеих. Что ещё не так?

Deleted

Последнее исправление: Chelobaka (всего исправлений: 1)

По поводу циклов все же. По работе учил студента программировать микроконтроллеры. Он захотел на примере Arduino, ну хорошо. Смысл в том, что программа вида:

void loop() {
  for(int A = 0;A<255;A++){
    Serial.println(A);
  }
}
у нас не работала от слова совсем, в том числе и прерывания не обслуживались при этом. Выяснился опытным путем факт: компилятор «оптимизирует» однотипные циклы, где [как он считает] выполняется одно и то же действие, просто выкидывая лишние итерации (можно проверить если замерить время выполнения цикла функциями micros() или millis()). В итоге, проблема была решена добавлением delay(1) в конец цикла for. Видимо, действительно, ide ставит какие-то чудесные флаги компилятору тщательно скрывая все от пользователя. На гиктаймс недавно человек разбирался, как все устроено

Valentinec
()
Ответ на: комментарий от Deleted

Фиговое начало «продвинутого конструктора», потому как заставлять ребенка до 9 класса учить язык С++ и устройство микроконтроллеров — как-то не очень...

Ты ему лучше купи всяких светодиодов, резисторов, мосфетов, биполярников, операционников и т.п. И пусть пока дискретные элементы изучает. А если появится желание копнуть глубже, дай ему даташит на ту же атмегу почитать. Не испугается — ОК, можно и программировать.

Но нужно помнить, что абдурино-way — это тупиковый путь. Нельзя так.

anonymous
()
Ответ на: комментарий от Valentinec

Если нужны такие вещи, то переменную объявляют как volatile (т.е. ты в основном цикле проверяешь флаг, меняющийся внутри прерывания или подобной фигней страдаешь).

Писал бы ты под микроконтроллеры, прекрасно бы это знал. Азы ведь!

anonymous
()
Ответ на: комментарий от Valentinec

На гиктаймс недавно человек разбирался, как все устроено

Охренеть! Хомячки вместо того, чтобы открыть даташит на атмегу, пытаются «сбросить жир» с абдурины!

Придурки, блин!!!

anonymous
()

Вот, кстати, я абдурину хаю, а ведь и сам в это говно вляпался, когда нужно было по-быстрому починить прибор, сделанный 20 лет назад. Простейшим показалось написать новую прошивку для того же МК, что сгорел. А всю отладку делал на абдурине, т.к. она как раз наиболее близка была к нужному мелкоконтроллеру.

Пока делал, обматерился: насколько же скудны ресурсы этой дряни. Поэтому ТСу и советую вообще с ней не связываться, особенно если он хочет сына научить!

Если так хочется восьмибиток, пусть купит за стольник девборду с STM8S103 или STM8S105. Посмотреть, что на них можно сделать, можно в т.ч. и у меня на гитхабе.

anonymous
()
Ответ на: комментарий от anonymous

У меня и убунте и а генту все работает. Кстати вот выпилят опенрц из генты, будешь юзать системд как миленький.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

Никто openrc из генты не выпилит. А если и так, то перейду на freebsd. Уж всяко поцтерошлак я в свою систему тащить не буду! А то эдак ведь можно совсем огомосятиться и на вяленого вместо иксов перейти, а то и вообще мастдайкой или гей-осью пользоваться...

anonymous
()
Ответ на: комментарий от anonymous

Фиговое начало «продвинутого конструктора», потому как заставлять ребенка до 9 класса учить язык С++ и устройство микроконтроллеров — как-то не очень...

В обучении ребенка главное не с++ и микроконтроллеры, а заинтересованность и энтузиазм. Так что для старта ардуина вполне годная вещь.

И почему до 9 класса? Я в восьмом писал на ассемблере для Радио86-РК.

Puzan ★★★★★
()
Ответ на: комментарий от Puzan

Ну и какими будут заинтересованность и энтузиазм, если ребенку дается абдурина и говорится: скачай отсюда одну HĒX, оттуда другую HĒX, напиши третью HĒX и у тебя светодиодик будет мигать и на экранчик Helloworld напишет?

anonymous
()
Ответ на: комментарий от Puzan

Лично мне это было бы абсолютно неинтересно, я еще с детства разбирал игрушки, чтобы понять, как они работают. Начинать с азов надо, а не с «берем HĒX и получаем ХЗ», как дебилов в спецшколе обучают конвейерной работе.

anonymous
()
Ответ на: комментарий от anonymous

Ну чтож с наступающим нельзя поздравлять, просто успехов пожелаю в нелёгком труде в горах КЧР!

Ramil ★★★★
()
Ответ на: комментарий от Ramil

Будешь у нас — свисти, контакты у меня в профиле живые еще, да и в ЖЖшке я активничаю. Забульбеним шашлычок из кошерно-халяльной свининки!

anonymous
()
Ответ на: комментарий от anonymous

Не научишься так ничему, т.к. абдурина самое главное скрывает от тебя — структуру железа.

А это теоретический курс. На практике писать все на ассемблере или даже на машинном коде очень грустно.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

А я в генту systemd ставлю, т.к. удобнее портянки из скриптов.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Зачем на ассемблере? На С. Потихоньку набираешь сниппеты, и все проще и проще становится разрабатывать очередную железяку. Скажем, для работы с 1-wire я дней 10 убил! Зато получились 2 сниппета под STM8 и STM32, теперь просто пихаю их (разве что иногда меняю таймер на другой, если этот в другой задаче нужен).

А в абдурине даже SPI умудряются ногодрыгом делать. Ясен пень, у этих коней программулька потребляет 146% ресурсов контроллера, из-за чего все тупит и не работает. И приходится бедным абдуринщикам покупать еще одну абдурину туда, где даже долбаная атмега могла бы все решить, почитай они даташит!

А с поцтерошлаком ты зря. Чем меньше людей пользуются дерьмом, тем меньше шансов, что дерьмо будет жить. Сейчас вообще какая-то глобальная дебилизация идет: гей-ось с мастдайкой — еще ладно, они для дебилов и разрабатывались, но потом появилась бубунта, и линукс стал скатываться в говно.

anonymous
()
Ответ на: комментарий от anonymous

Ты сначала детей заведи своих, а потом уже таким как мы советы давай. Но если будешь и дальше занудствововать, то это тебе не светит.

rumgot ★★★★★
()
Ответ на: комментарий от anonymous

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

Ты не сравнивай наше голодное (в техническом плане) советское детство с сегодняшним сытым. Сейчас у детей всё есть, чем-то удивить их и заинтересовать стало очень трудно. Если на старте нужно напрягать мозг, они сразу переключаются на другие развлечения. По этому приходится искать что-то простое, но в то же время более-менее интересное. Ардуина вполне подходит (а для некоторых и она сложна, развлекаются с майндстормом за 30 тыс.р).

Puzan ★★★★★
()
Ответ на: комментарий от anonymous

Эдик, хватит бомбить) Какая ТСу разница сколько байт занимает его мигалка светодиодом? Какая ему разника, поддерживает ли его девборда DMA и сотни таймеров? Ему просто хочется вечером поразвлечься, для этого не обязательно забивать голову DMA и таймерами.

WRG ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.