да, я тупой пока в этом признаю, я всего пару дней с ардуино знакомлюсь ))) И пока тяжеловато всё даётся. Пробовал грузить готовые скетчи скачанные с интернета пока. Понимаю что наглость, но мог бы кто нибудь всё выше написанное собрать в один код чтоб я загрузил и посмотрел на примере как это всё работает? Сам пробу. но компилятор ардуиновский ошибки выдаёт постоянно. А иначе если я на готовом примере не пощупаю я так и не въеду )
P.S.
Пока собрал ту схему счётчика, вроде работает, но там она считает до десяти. Убрал семисегментный индикатор и вместо него вывожу на 8 светодиодов, потому что там всего один сдвиговый регистр 595-ый на восемь разрядов. Пока всё. Эти десять байто по очереди выводятся, и так по кругу.
Заголовок сообщения: Re: Прошу помощи с ардуино и моим проектом
Добавлено: Ср дек 04, 2019 21:32:05
Вот на этом примере и учись… разбери его по полочкам, какая процедура за что отвечает… но без знания самого языка так и не поймёшь суть происходящего. Всё же светиками мигать вначале нужно научится без каких либо регистров сдвига, а когда поймёшь суть тогда уже за более сложные программы берись… а то получается, что ты хочешь прочитать книгу, а буквы ещё не изучил…
Сделал так код. Но в ардуинку не зашивается почему то, куча ошибок каких то. Поправьте плиз, где накосячил ?
Код:
#define DATA_PIN 13 // пин данных (англ. data) #define LATCH_PIN 12 // пин строба (англ. latch) #define CLOCK_PIN 11 // пин такта (англ. clock) #define BUTTON_PIN 10
byte H_byte[10] = { 0b01001100, 0b01000101 // сюда ещё можно сколько угодно написать таких байтов? это для первых 8 светодиодов } byte L_byte[10] = { 0b10000111,0b010001010 // и такое же количество и сюда, только для следующих 8 светодиодов ? } // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, H_byte[clicks]); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, L_byte[clicks]); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, // во втором - B01001100 и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым // устанавливая значения на выходах delayMicroseconds(5); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
почему у тебя в массивах 10 элементов, а заполнено только 2? напиши вначале кода : #define n 10; а потом в коде 10 (там где она указывает на количество элементов - в массивах, в счёте) замени на n потом или массивы дозаполни или в дефайне 10 на 2 замени. П.С. в массиве цифру можно вообще не ставить, тогда размерность его определится количеством элементов в скобках что идут следом... но лучше её ставить, чтобы в случае, как у тебя, выпала ошибка, а не скомпилировалось, и потом работало криво...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Для начинающего борьбу с адуриньей (и ардуиноподобными) в рамках корректного подхода (не "чистого Си", а именно ардуино-референса - там имеются некоторые различия) рекомендовал бы вычитать все, касающееся ардуинки из https://radiokot.ru/forum/viewtopic.php?f=62&t=94201 и https://radiokot.ru/forum/viewtopic.php?f=62&t=156720 я там ведь также практически "с нуля" разбор начинал. Там и примеры и обсуждение и ссылки на литературу под самостоятельное прочтение. Правда стартовая база несколько отличается - и схемотехника уже была изучена и МК под ассемблером.
Alex-DJ "...Сделал так код. Но в ардуинку не зашивается почему то, куча ошибок каких то. Поправьте плиз, где накосячил ?..." Собственно читаем ошибки и устраняем - там обычно весьма четко указано "что есть БаГГ". Или... Копируем текст сообщения в блокнот и прилагаем текстовой файлик. Или вставкой в сообщении (обязательно под спойлером!!! дабы "портянок" к просмотру не плодить) или заархивированным файлом (текстовой не пропустится) к сообщению. Да версию IDE указывать необходимо (на сегодня актуальна 1.8.9), режим контроля (вкладка файл->настройки->флажок напротив "сообщения компилятора" (в моей выставлено "ВСЕ"))
почему у тебя в массивах 10 элементов, а заполнено только 2? напиши вначале кода : #define n 10; а потом в коде 10 (там где она указывает на количество элементов - в массивах, в счёте) замени на n потом или массивы дозаполни или в дефайне 10 на 2 замени. П.С. в массиве цифру можно вообще не ставить, тогда размерность его определится количеством элементов в скобках что идут следом... но лучше её ставить, чтобы в случае, как у тебя, выпала ошибка, а не скомпилировалось, и потом работало криво...
Так? Только для проверки я пока сделал для пяти элементов, везде где было в предыдущем коде 10 поменял на 5 и в массивах по 5 элементов.
Код:
#define n 5; #define DATA_PIN 13 // пин данных (англ. data) #define LATCH_PIN 12 // пин строба (англ. latch) #define CLOCK_PIN 11 // пин такта (англ. clock) #define BUTTON_PIN 10
byte H_byte[5] = { 0b01001100, 0b01000101, 0b00000001, 0b11001100, 0b01010101// пока 5 элементов для примера } byte L_byte[5] = { 0b10000111, 0b010001010, 0b00101100, 0b00010000, 0b11110000 // и такое же количество здесь } // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, H_byte[clicks]); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, L_byte[clicks]); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, // во втором - B01001100 и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым // устанавливая значения на выходах delayMicroseconds(5); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
Это выделить текст а затем нажать кнопу spoiler в заголовке редактора сообщения на сайте. Тогда текстовка не будет отвлекать лишнее внимание (а при необходимости читающий ее развернет).
1.8.10 Это для виндовс 7-8-10 и "старше" на ХР (и простеньком компе с пнемIII к примеру) она не пойдет посему и заявлена "как ограниченная" - не у всех 10 используется. Так что для большинства простолюбителей на сегодня таки 1.8.9 наиболее оптимальна. Хотя и там есть нюансы (для версии ESP8266 к примеру под ХР допускается только 2.5.0)... Вот Ваша хотелка отредактированя под прогон в симуляторе (https://www.sites.google.com/site/unoardusim/services) ибо влом макетку портить на сию мелочь. Потому текст малость "корявенький" (некоторые ограничения восприятия у симулятора к исходнику - не понимает к примеру переносов строки)... Спойлер
Код:
// #include <avr/pgmspace.h> // подключаем функционал работы с ПЗУ
//----------
int dataPin = 13; //Пин подключен к DS входу 74HC595 int latchPin = 12; //Пин подключен к ST_CP входу 74HC595 int clockPin = 11; //Пин подключен к SH_CP входу 74HC595 /* * dataPin,latchPin,clockPin нельзя объявлять иначе ибо функция * shiftOut оговаривает их значения как int (возможен вариант const int dataPin) * смотри референс IDE к используемым функциям!!! */ byte my_sens = 10; // активный уровень = 0
/* const byte my_data[18] PROGMEM = {\ B10000111, B01001100, B01101100, B00001000, B01000101, B01001010,\ B11111100, B10100101, B10100000, B10011010, B01010010, B10000000,\ B01010101, B00000010, B10100101, B01011010, B01011010, B10100101}; // 18 // столько данных - сколько нужно (или несколько массивов см. референс) // однако размещение только перед setup() // и НЕ ЗАБЫВАЕМ, что в БАЙТЕ ВСЕГО 8 БИТ (а не 9 и более!) */ //----------
void setup() { // put your setup code here, to run once: //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); digitalWrite(latchPin, LOW); pinMode(clockPin, OUTPUT); digitalWrite(clockPin, LOW); pinMode(dataPin, OUTPUT); digitalWrite(dataPin, LOW); pinMode(my_sens, INPUT_PULLUP); point_ptr = 0; H_data_buf = 0; L_data_buf = 0; outdata(); // начальная инициализация
}
void loop() { // put your main code here, to run repeatedly: if (!digitalRead(my_sens)) { delay(20); if (!digitalRead(my_sens)) { // H_data_buf = pgm_read_byte_near(my_data+point_ptr); // соответствует исправленному в sketch_dec03b H_data_buf = my_data[point_ptr]; point_ptr++; // L_data_buf = pgm_read_byte_near(my_data+point_ptr); // соответствует исправленному в sketch_dec03b L_data_buf = my_data[point_ptr]; point_ptr++; // изменение point_ptr в соответствии с размером массива в ПЗУ if (point_ptr==18) { point_ptr=0; // вернем указатель на начало массива // (в текущем тесте из 18 байт последняя ячейка 17) } outdata(); byte flag=1; while (flag) { if (digitalRead(my_sens)) { delay(20); if (digitalRead(my_sens)) { flag=0; } } } } } delay(20); }
//----------
void outdata() { // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, lowByte(H_data_buf)); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, highByte(L_data_buf)); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, // во втором - B01001100 и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым // устанавливая значения на выходах delayMicroseconds(5); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW }
Пы.Сы. Редактор текста на сайте таки вносит некоторые некорректности с "длинными строками", что может привести к ошибкам при копипасте из текста в окне сообщения... посему прилагаю сам исходник для анализа непосредственно в редакторе IDEбез лишних "сторонних искажений"
На схеме постом выше - вывод D10 (уно,нано и аналогичные). Да и в исходнике же тоже указано... Я ж Вашу последнюю раскладку из исходника брал за основу...
Я там только алгоритм отслеживал, принимая к сведению, что вывод в регистры правильно проводится (у симулятора нету внешних регистров того типа, что нам требуются). А вот кнопку - вернее выключатель с резисторами (ибо трассировка была пошаговая) прицепить на 10й вывод надо. Да и убрать лишнюю периферию в текущем сеансе. Далее гоняем соответственно пожеланию. Без переключения кнопы программа выдаст в регистры нулики и зависнет в ожидании нажатия кнопы. Затем шажок по массиву и ожидание отпускания кнопы. Затем снова ждет нажатие. "пошаговое" исполнение кнопкой меню "шаг внутри" (с беленькой стрелкой). http://img.radiokot.ru/files/20529/22h7pxc5yz.jpg исходно переключатель в том положении, что на фотке (непрерывный простой в ожидании нажатия) переключив его в 0 (красный индикатор на соответствующей линии унки заменится на синий) прощелкиваем очередной цикл вывода и попадаем в "ожидание единицы" на D10 переводим переключатель в 1 и прощелкиваем программу в очередной цикл ожидания нажатия. И так далее... Если желание прсмотра с анимацией - тогда оставляем переключатель в положении 1, запускаем симуляцию в режиме "анимация выполнение" + "замедленная съемка" с помощью зеленой стрелки в строке иконок-менюшек ("выполнить") и пользуемся зеленой кнопой (push которая в поле макета) - нажать и подержать - исполнится очередной шаг прогона цикла вывода.
Вообще-то в каталоге симулятора лежат весьма подробные *.pdf файлы с описанием как с ним работать. Внимательно читаемс!
Исправлена ошибка в закомментированной области - чтение элементов массива из ПЗУ (progmem)
BOB51, к сожалению схема не заработала на макетке. Прошивается без ошибок, при включении на светодиодах появляется какой то код, потом после загрузки микроконтроллера, то есть через секунду после подачи питания на схему, всё гаснет и на кнопку не реагирует. Кнопку включил как на схеме, одним концом к общему вторым к 10 пину на ардуине. Правда светодиоды у меня общий на минусе, но от этого ведь не может не работать, просто светить будут инверсно вшитому массиву, тоесть где 1 там не будет светить, там где ноль будет светить. Но тут вообще ничего не пашет и на кнопку не реагирует
собственно не подправлено было от старого двухбайтового значения апендикс. Неверно(было): void outdata() { // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, lowByte(H_data_buf)); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, highByte(L_data_buf)); // "продавливаем" данные в следующий регистр - в первом регистре B10000111,..... а нужно (исправлено): void outdata() { // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, H_data_buf); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, L_data_buf); // "продавливаем" данные в следующий регистр - в первом регистре B10000111,.....
Возможно еще некоторые "погрешности"/неоптимальности засели - это уже "на вылизывание" после которого можно начинающему совсем ничего не понять.
Это точно - вот так верно: http://img.radiokot.ru/files/20529/22hohx9i9g.GIF зявнулсс... давненько те регистры не вынимал из шкапчика... Собственно у меня линия сброса выводится на МК - а уточнить какой уровень соответствует сбросу, а какой работе забыл.
А 13-я лапка - это разрешение выходного каскада - там и должен быть 0 для его активации. Подашь 1 и на выходе будет Z-состояние (не нуль и не единичка - это для работы нескольких регистров на одну шину).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения