Страница 1 из 1
фрагмент кода
Добавлено: 03 дек 2017, 18:12
vala
Хочу очепушить ткатский станок до 16 ремиз под управлением ардуиной.
Пока электронные компоненты едут из китая начал думать об управлении ардуинкой.
Идея такова: пользователь зайдя в меню настроек вводит данные с схемы полотна посредством 1-2 кнопок вводя 1(крестик в схеме) или 0 (пустышка) которые выводятся на
дисплей и т. д. Всё должно быть просто, чтобы любая бабка могла разобратся.
Короче говоря ардуина управляет подёмом и опусканием ремизных рам при цыклическом проходе основной клетки схемы.
О мелочах по ходу действия.
По электронике и программировнию - маленько соображаю, но советы как правильно сделать будут нужны.
Нет ли подводних камней в этом
dec +=bin<<i; отрывке кода?
Код: Выделить всё
#include <iostream>
using namespace std;
int main()
{
int bin[8]; //массив состояния 8 ремиз
int dec=0; //переменная для хранения числа
for(int i=0; i<8; i++) //цыкл ввода данных
{
cin>> bin[i]; // 1 включ. 0 выключ.
dec +=bin[i]<<i; //конвертацыя двоичного кода состояния ремиз в число,
} //которым через здвиговый регистр под управлением ардуины
//будет осущетвлятся подём и опускание ремизных рам
cout<<"dec - "<<dec; //ткатцкого станка
return 0;
}
Вроди бы работает, но незнаю правильно ли я поступил применив оператор сдвига. Масив наверно тоже надо при иницыализацыи забить нулями, чтоб при вводе последней
единицы можно смело нажимать enter нулли уже будут на месте.
Re: фрагмент кода
Добавлено: 03 дек 2017, 18:45
AndyBig
А зачем промежуточный массив bin?
И еще нужно добавить маску, чтобы ввод оператором числа больше 1 не привел к непредсказуемому результату: dec +=(bin & 0x01) << i;
Подводных камней в таком применении сдвига нет, все будет работать нормально.
Re: фрагмент кода
Добавлено: 03 дек 2017, 19:49
vala
AndyBig писал(а):А зачем промежуточный массив bin?
И еще нужно добавить маску, чтобы ввод оператором числа больше 1 не привел к непредсказуемому результату: dec +=(bin & 0x01) << i;
Подводных камней в таком применении сдвига нет, все будет работать нормально.
Про маску я знаю, она будет. При вводе будет перемесщатся курсор и в нужном месте нажатием на кнопку выведет на экран звёздочку а в цыкл отправит единицу.
Спасибо, масив bin действительно тут не нужен, переделаю .
Код: Выделить всё
#include <iostream>
using namespace std;
int main()
{
int iev = 0; //переменная ввода
int dec=0; //переменная для хранения числа
for(int i=0; i<8; i++) //цыкл ввода данных
{
cin>> iev; // 1 включ. 0 выключ.
dec +=iev<<i; //конвертацыя двоичного кода состояния ремиз в число,
} //которым через здвиговый регистр под управлением ардуины
//будет осущетвлятся подём и опускание ремизных рам
cout<<"dec - "<<dec; //ткатцкого станка
return 0;
}
Re: фрагмент кода
Добавлено: 04 дек 2017, 15:37
arkhnchul
только лучше не int, а unsigned int. Со сдвигом знакового в общем случае (не здесь) может выйти внезапный сюрприз.
выставление нужных бит в переменной обыкновенно делается не арифметическим сложением (+=), а битовым ИЛИ (|=)
Re: фрагмент кода
Добавлено: 04 дек 2017, 18:22
vala
arkhnchul писал(а):только лучше не int, а unsigned int. Со сдвигом знакового в общем случае (не здесь) может выйти внезапный сюрприз.
выставление нужных бит в переменной обыкновенно делается не арифметическим сложением (+=), а битовым ИЛИ (|=)
Спасибо ИЛИ ( |= ) то что доктор прописал. Про сюрпризы при правом сдвиге читал.
До сих пор с подзарядными логическими операцыями дел не имел, просто вленил сложение.
Re: фрагмент кода
Добавлено: 07 дек 2017, 13:37
vala
Так будет работать?
Код: Выделить всё
// запись в EEPROM аруины после настроек
int a; // хранит реальную длину масива
int mas[32]; // макс. длина
EEPROM.update(0,a);
for(int i=0; i<a; i++)
EEPROM.update(i+1,mas[i]);
// иницыализацыя с EEPROM ардуины
int a;
int mas[32];
a = EEPROM.read(0);
for(int i=0; i<a; i++)
mas[i] = EEPROM.read(i+1);
// или ещё компактней
int a;
int mas[32];
mas[0] = a;
for(int i=0; i<a; i++)
EEPROM.update(i,mas[i]);
// ***************************
int mas[32];
for(int i=0; i<a; i++)
mas[i] = EEPROM.read(i);
// далее вместо (int a) обращаемся к(mas[0])
Re: фрагмент кода
Добавлено: 07 дек 2017, 15:53
AndyBig
Если у Вас размер массива жестко задан, то зачем хранить его длину? Сохраняйте весь массив
Код: Выделить всё
#define MAS_LEN 32; // дина масива
int mas[MAS_LEN];
for(int i=0; i<MAS_LEN; i++)
EEPROM.update(i,mas[i]);
// ***************************
int mas[MAS_LEN];
for(int i=0; i<MAS_LEN; i++)
mas[i] = EEPROM.read(i);
Re: фрагмент кода
Добавлено: 07 дек 2017, 16:10
arkhnchul
там есть еще put и get, работающие с переменными произвольного (но известного) размера
Код: Выделить всё
#define ARR_LEN 32
#define ARR_EEP_ADDR 0
int mas[ARR_LEN];
EEPROM.put(ARR_EEP_ADDR, mas);
// иницыализацыя с EEPROM ардуины
EEPROM.get(ARR_EEP_ADDR, mas);
Re: фрагмент кода
Добавлено: 07 дек 2017, 16:51
vala
"Длина масива" (int a)- это количество итерацый цыкла для основной клетки схемы полотна и может менятся то 2 до примерно 30(может и больше,ещё точно не разобрался), всё зависит от узора.
Если уж совсем точно, то int a - это количество занятых ячеек масива. То что остаётся - мусор.
Re: фрагмент кода
Добавлено: 07 дек 2017, 17:16
AndyBig
Можно еще сделать один массив для всех сохраняемых байтов, а отдельные переменные для этих данных сделать ссылками на смещения внутри этого массива.
Re: фрагмент кода
Добавлено: 07 дек 2017, 19:34
vala
AndyBig писал(а):Можно еще сделать один массив для всех сохраняемых байтов, а отдельные переменные для этих данных сделать ссылками на смещения внутри этого массива.
Тут схема полотна
ремиз - 4
длина цыкла - 8
вязка подножки (итерацый)
1 итерацыя - 0,1,1,0
2 - 1,1,0,0
3 - 1,0,0,1
4 - 0,0,1,1
5 - 0,1,1,0
6 - 0,0,1,1
7 - 1,0,0,1
8 - 1,1,0,0
далле программа того что я хочу на ардуине, вводим цыфру нажимаем enter
никаких масок нет.
Код: Выделить всё
#include <iostream>
using namespace std;
int main()
{
cout << " Настройка 8 ремизного ткатцкого станка"<< endl<<endl;
//--------------------------------------------------------------
int b; // число ремизок
int minums[32];
cout<<" введите число ремиз"<<endl;
cin>>b;
cout<<" введите длину цыкла основной клетки"<<endl;
cin>>minums[0];
for(int i= 0; i<minums[0]; i++)
{
cout<<" введите вязку "<<i+1<<" итерацыи цыкла"<<endl; // 1 поднятие ремиз
// 0 опускание ремиз
int iev = 0;
int dec=0;
for(int j=0; j<b; j++)
{
cin>> iev;
dec|=iev<<j; // превращает в число
}
minums[i+1] = dec;
cout<<" код"<<i+1<<" итерацыи - "<<minums[i+1]<<endl<<endl;;
//-------------------------------------------------------------------
}
cout<<" программа создана"<<endl<<endl;
cout<<" симуляцыя цыкла 2 раз"<<endl<<endl;
for(int j=0;j<2; j++)
{
cout<<endl<<endl;
for(int i=1;i<minums[0]+1;i++)
cout<<" "<<i<<"итерацыя - дец. код вязки "<<minums[i]<<endl;
}
return 0;
}
Если ничего больше кроме как одной программы не записывать в eeprom, то масив может быть и на всю величину памяти.
Как составляем новую программу данные переписываются, а что остаётся за границами масива minums[a] пусть там и остаётся пока не перепишится другой программой.