Прошу помощи с ардуино и моим проектом

Обсуждаем контроллеры компании Atmel.
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

да, я тупой пока в этом признаю, я всего пару дней с ардуино знакомлюсь ))) И пока тяжеловато всё даётся. Пробовал грузить готовые скетчи скачанные с интернета пока. Понимаю что наглость, но мог бы кто нибудь всё выше написанное собрать в один код чтоб я загрузил и посмотрел на примере как это всё работает? Сам пробу. но компилятор ардуиновский ошибки выдаёт постоянно. А иначе если я на готовом примере не пощупаю я так и не въеду )

P.S.

Пока собрал ту схему счётчика, вроде работает, но там она считает до десяти. Убрал семисегментный индикатор и вместо него вывожу на 8 светодиодов, потому что там всего один сдвиговый регистр 595-ый на восемь разрядов. Пока всё. Эти десять байто по очереди выводятся, и так по кругу.
Реклама
Самсусамыч

Re: Прошу помощи с ардуино и моим проектом

Сообщение Самсусамыч »

Вот на этом примере и учись… разбери его по полочкам, какая процедура за что отвечает… но без знания самого языка так и не поймёшь суть происходящего.
Всё же светиками мигать вначале нужно научится без каких либо регистров сдвига, а когда поймёшь суть тогда уже за более сложные программы берись… а то получается, что ты хочешь прочитать книгу, а буквы ещё не изучил…
Реклама
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

Сделал так код. Но в ардуинку не зашивается почему то, куча ошибок каких то. Поправьте плиз, где накосячил ?

Код: Выделить всё


#define DATA_PIN    13 // пин данных (англ. data)
#define LATCH_PIN   12 // пин строба (англ. latch)
#define CLOCK_PIN   11 // пин такта (англ. clock)
#define BUTTON_PIN  10

void setup()
{
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop()
{
  if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
    delay(10);
    if (!digitalRead(BUTTON_PIN))
      clicks = (clicks + 1) % 10;
buttonWasUp = digitalRead(BUTTON_PIN);

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
Самсусамыч

Re: Прошу помощи с ардуино и моим проектом

Сообщение Самсусамыч »

Я и рад бы помочь, но с языком Си не знаком… :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Прошу помощи с ардуино и моим проектом

Сообщение Ivanoff-iv »

почему у тебя в массивах 10 элементов, а заполнено только 2?
напиши вначале кода : #define n 10;
а потом в коде 10 (там где она указывает на количество элементов - в массивах, в счёте) замени на n
потом или массивы дозаполни или в дефайне 10 на 2 замени.
П.С. в массиве цифру можно вообще не ставить, тогда размерность его определится количеством элементов в скобках что идут следом... но лучше её ставить, чтобы в случае, как у тебя, выпала ошибка, а не скомпилировалось, и потом работало криво...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

Для начинающего борьбу с адуриньей (и ардуиноподобными) в рамках корректного подхода
(не "чистого Си", а именно ардуино-референса - там имеются некоторые различия)
рекомендовал бы вычитать все, касающееся ардуинки из
https://radiokot.ru/forum/viewtopic.php?f=62&t=94201
и
https://radiokot.ru/forum/viewtopic.php?f=62&t=156720
я там ведь также практически "с нуля" разбор начинал.
Там и примеры и обсуждение и ссылки на литературу под самостоятельное прочтение.
Правда стартовая база несколько отличается - и схемотехника уже была изучена и МК под ассемблером.
8)

Alex-DJ
"...Сделал так код. Но в ардуинку не зашивается почему то, куча ошибок каких то. Поправьте плиз, где накосячил ?..."
Собственно читаем ошибки и устраняем - там обычно весьма четко указано "что есть БаГГ".
Или...
Копируем текст сообщения в блокнот и прилагаем текстовой файлик.
Или вставкой в сообщении (обязательно под спойлером!!! дабы "портянок" к просмотру не плодить)
или заархивированным файлом (текстовой не пропустится) к сообщению.
Да версию IDE указывать необходимо (на сегодня актуальна 1.8.9), режим контроля
(вкладка
файл->настройки->флажок напротив "сообщения компилятора"
(в моей выставлено "ВСЕ"))
8)
Реклама
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3749410#p3749410"]почему у тебя в массивах 10 элементов, а заполнено только 2?
напиши вначале кода : #define n 10;
а потом в коде 10 (там где она указывает на количество элементов - в массивах, в счёте) замени на n
потом или массивы дозаполни или в дефайне 10 на 2 замени.
П.С. в массиве цифру можно вообще не ставить, тогда размерность его определится количеством элементов в скобках что идут следом... но лучше её ставить, чтобы в случае, как у тебя, выпала ошибка, а не скомпилировалось, и потом работало криво...[/uquote]

Так? Только для проверки я пока сделал для пяти элементов, везде где было в предыдущем коде 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

void setup()
{
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop()
{
  if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
    delay(10);
    if (!digitalRead(BUTTON_PIN))
      clicks = (clicks + 1) % 5;
buttonWasUp = digitalRead(BUTTON_PIN);

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
P.S/

нет , опять ошибка при компиляции (((
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

Да укладывайте же исходник под спойлер!
8)
Это выделить текст а затем нажать кнопу spoiler в заголовке редактора сообщения на сайте.
Тогда текстовка не будет отвлекать лишнее внимание (а при необходимости читающий ее развернет).
8)
Посмотрю чего там устроить...
А пока... скачайте и почитайте книжи:
http://elektromehanika.org/load/serii_t ... 0-1-0-1874
:beer:
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

[uquote="BOB51",url="/forum/viewtopic.php?p=3749470#p3749470"]Да версию IDE указывать необходимо (на сегодня актуальна 1.8.9)[/uquote]

актуальная версия Arduino IDE 1.8.10
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

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

byte L_data_buf;
byte H_data_buf;
static byte point_ptr;
void outdata();

byte my_data[] = {B10000111, B01001100, B01101100, B00001000, B01000101, B01001010,B11111100, B10100101, B10100000, B10011010, B01010010, B10000000, B01010101, B00000010, B10100101, B01011010, B01011010, B10100101}; // 18

/*
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
}
и собственно схемка
http://img.radiokot.ru/files/20529/22h44tkfsd.GIF
как желательно бы КОТУ рисовать/расматривать.
Тренируйтесь.
8)

Пы.Сы.
Редактор текста на сайте таки вносит некоторые некорректности с "длинными строками", что может привести к ошибкам при копипасте из текста в окне сообщения...
посему прилагаю сам исходник для анализа непосредственно в редакторе IDEбез лишних "сторонних искажений"
sketch_dec03a.zip
(1.77 КБ) 247 скачиваний
8)
Последний раз редактировалось BOB51 Чт дек 05, 2019 18:32:30, всего редактировалось 2 раза.
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

Спасибо...А куда к ардуино кнопку подключать ?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

На схеме постом выше - вывод D10 (уно,нано и аналогичные).
Да и в исходнике же тоже указано...
Я ж Вашу последнюю раскладку из исходника брал за основу...
:roll:
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

Скачал UnoArduSimV2.5.0.zip загрузил туда код, нажал кнопку выполнить
66666661.jpg
(96.24 КБ) 257 скачиваний
и всё вот так стоит и не двигается, так должно быть ? А работу кода посмотреть никак не получится?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

Я там только алгоритм отслеживал, принимая к сведению, что вывод в регистры правильно проводится (у симулятора нету внешних регистров того типа, что нам требуются).
А вот кнопку - вернее выключатель с резисторами (ибо трассировка была пошаговая) прицепить на 10й вывод надо.
Да и убрать лишнюю периферию в текущем сеансе.
Далее гоняем соответственно пожеланию.
Без переключения кнопы программа выдаст в регистры нулики и зависнет в ожидании нажатия кнопы.
Затем шажок по массиву и ожидание отпускания кнопы.
Затем снова ждет нажатие.
"пошаговое" исполнение кнопкой меню "шаг внутри" (с беленькой стрелкой).
http://img.radiokot.ru/files/20529/22h7pxc5yz.jpg
исходно переключатель в том положении, что на фотке (непрерывный простой в ожидании нажатия)
переключив его в 0 (красный индикатор на соответствующей линии унки заменится на синий)
прощелкиваем очередной цикл вывода и попадаем в "ожидание единицы" на D10
переводим переключатель в 1 и прощелкиваем программу в очередной цикл ожидания нажатия.
И так далее...
Если желание прсмотра с анимацией - тогда оставляем переключатель в положении 1, запускаем симуляцию в режиме "анимация выполнение" + "замедленная съемка" с помощью зеленой стрелки в строке иконок-менюшек ("выполнить") и пользуемся зеленой кнопой (push которая в поле макета) - нажать и подержать - исполнится очередной шаг прогона цикла вывода.
:sleep:
Вообще-то в каталоге симулятора лежат весьма подробные *.pdf файлы с описанием как с ним работать.
Внимательно читаемс!
:beer:

Исправлена ошибка в закомментированной области - чтение элементов массива из ПЗУ (progmem)
sketch_dec03b.zip
(34.08 КБ) 238 скачиваний
таки с тем progmem без конспекту... ТОСКНОВАТО...
:(
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

BOB51, к сожалению схема не заработала на макетке. Прошивается без ошибок, при включении на светодиодах появляется какой то код, потом после загрузки микроконтроллера, то есть через секунду после подачи питания на схему, всё гаснет и на кнопку не реагирует. Кнопку включил как на схеме, одним концом к общему вторым к 10 пину на ардуине. Правда светодиоды у меня общий на минусе, но от этого ведь не может не работать, просто светить будут инверсно вшитому массиву, тоесть где 1 там не будет светить, там где ноль будет светить. Но тут вообще ничего не пашет и на кнопку не реагирует
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Прошу помощи с ардуино и моим проектом

Сообщение OKF »

Ой, Alex-DJ, поменьше бы вы пользовались форумом вместо здравого смысла.)
Удачи!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

В прожке закралась ошибка невнимательности...
Компилятор оные не распознает.
Устранено тут
sketch_dec03c.zip
(1.76 КБ) 201 скачивание
собственно не подправлено было от старого двухбайтового значения апендикс.
Неверно(было):
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,.....
8)
Возможно еще некоторые "погрешности"/неоптимальности засели - это уже "на вылизывание" после которого можно начинающему совсем ничего не понять.
:wink:
Alex-DJ
Встал на лапы
Сообщения: 127
Зарегистрирован: Ср апр 06, 2011 13:41:11

Re: Прошу помощи с ардуино и моим проектом

Сообщение Alex-DJ »

[uquote="BOB51",url="/forum/viewtopic.php?p=3750113#p3750113"]В прожке закралась ошибка невнимательности...
Компилятор оные не распознает.

Возможно еще некоторые "погрешности"
:wink:[/uquote]

И не только это, у вас на сдвиговых регистрах на 10 и 13 ноге общий, на 10 ногу должен идти плюс питания
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15557
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прошу помощи с ардуино и моим проектом

Сообщение BOB51 »

Это точно - вот так верно:
http://img.radiokot.ru/files/20529/22hohx9i9g.GIF
зявнулсс... давненько те регистры не вынимал из шкапчика...
Собственно у меня линия сброса выводится на МК - а уточнить какой уровень
соответствует сбросу, а какой работе забыл.
:oops:
А 13-я лапка - это разрешение выходного каскада - там и должен быть 0 для его активации.
Подашь 1 и на выходе будет Z-состояние (не нуль и не единичка - это для работы нескольких регистров на одну шину).
8)
Самсусамыч

Re: Прошу помощи с ардуино и моим проектом

Сообщение Самсусамыч »

:) Да и резистор на ноге сброса (10) не к чему… подать на неё +5 напрямую и нормуль. :beer:
1.png
Ответить

Вернуться в «AVR»