фрагмент кода

Контроллеры, драйверы, датчики, управляющие устройства.

фрагмент кода

Сообщение vala » 03 дек 2017, 18:12

Хочу очепушить ткатский станок до 16 ремиз под управлением ардуиной.
Пока электронные компоненты едут из китая начал думать об управлении ардуинкой.
Идея такова: пользователь зайдя в меню настроек вводит данные с схемы полотна посредством 1-2 кнопок вводя 1(крестик в схеме) или 0 (пустышка) которые выводятся на
дисплей и т. д. Всё должно быть просто, чтобы любая бабка могла разобратся.
Короче говоря ардуина управляет подёмом и опусканием ремизных рам при цыклическом проходе основной клетки схемы.
О мелочах по ходу действия.
По электронике и программировнию - маленько соображаю, но советы как правильно сделать будут нужны.
Нет ли подводних камней в этом dec +=bin[i]<<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 нулли уже будут на месте.
фрагмент кода Ekrānattēls 2017-12-03 15-49-46.png
Аватара пользователя
vala
Почётный участник
Почётный участник
 
Сообщения: 230
Зарегистрирован: 08 окт 2013, 21:01
Откуда: Latvia
Репутация: 99

Re: фрагмент кода

Сообщение AndyBig » 03 дек 2017, 18:45

А зачем промежуточный массив bin?
И еще нужно добавить маску, чтобы ввод оператором числа больше 1 не привел к непредсказуемому результату: dec +=(bin[i] & 0x01) << i;
Подводных камней в таком применении сдвига нет, все будет работать нормально.
Аватара пользователя
AndyBig
Мастер
 
Сообщения: 3697
Зарегистрирован: 07 мар 2014, 04:01
Откуда: юг России
Репутация: 968
Медальки:

Re: фрагмент кода

Сообщение vala » 03 дек 2017, 19:49

AndyBig писал(а):А зачем промежуточный массив bin?
И еще нужно добавить маску, чтобы ввод оператором числа больше 1 не привел к непредсказуемому результату: dec +=(bin[i] & 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;
}
Аватара пользователя
vala
Почётный участник
Почётный участник
 
Сообщения: 230
Зарегистрирован: 08 окт 2013, 21:01
Откуда: Latvia
Репутация: 99

Re: фрагмент кода

Сообщение arkhnchul » 04 дек 2017, 15:37

только лучше не int, а unsigned int. Со сдвигом знакового в общем случае (не здесь) может выйти внезапный сюрприз.
выставление нужных бит в переменной обыкновенно делается не арифметическим сложением (+=), а битовым ИЛИ (|=)
arkhnchul
Мастер
 
Сообщения: 1422
Зарегистрирован: 01 фев 2016, 13:56
Откуда: москва
Репутация: 265

Re: фрагмент кода

Сообщение vala » 04 дек 2017, 18:22

arkhnchul писал(а):только лучше не int, а unsigned int. Со сдвигом знакового в общем случае (не здесь) может выйти внезапный сюрприз.
выставление нужных бит в переменной обыкновенно делается не арифметическим сложением (+=), а битовым ИЛИ (|=)

Спасибо ИЛИ ( |= ) то что доктор прописал. Про сюрпризы при правом сдвиге читал.
До сих пор с подзарядными логическими операцыями дел не имел, просто вленил сложение.
Аватара пользователя
vala
Почётный участник
Почётный участник
 
Сообщения: 230
Зарегистрирован: 08 окт 2013, 21:01
Откуда: Latvia
Репутация: 99

Re: фрагмент кода

Сообщение vala » 07 дек 2017, 13:37

Так будет работать?
Код: Выделить всёРазвернуть

// запись в 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])

Аватара пользователя
vala
Почётный участник
Почётный участник
 
Сообщения: 230
Зарегистрирован: 08 окт 2013, 21:01
Откуда: Latvia
Репутация: 99

Re: фрагмент кода

Сообщение AndyBig » 07 дек 2017, 15:53

Если у Вас размер массива жестко задан, то зачем хранить его длину? Сохраняйте весь массив :)
Код: Выделить всёРазвернуть
#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);
Аватара пользователя
AndyBig
Мастер
 
Сообщения: 3697
Зарегистрирован: 07 мар 2014, 04:01
Откуда: юг России
Репутация: 968
Медальки:

Re: фрагмент кода

Сообщение arkhnchul » 07 дек 2017, 16:10

там есть еще 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);
arkhnchul
Мастер
 
Сообщения: 1422
Зарегистрирован: 01 фев 2016, 13:56
Откуда: москва
Репутация: 265

Re: фрагмент кода

Сообщение vala » 07 дек 2017, 16:51

"Длина масива" (int a)- это количество итерацый цыкла для основной клетки схемы полотна и может менятся то 2 до примерно 30(может и больше,ещё точно не разобрался), всё зависит от узора.
Если уж совсем точно, то int a - это количество занятых ячеек масива. То что остаётся - мусор.
Аватара пользователя
vala
Почётный участник
Почётный участник
 
Сообщения: 230
Зарегистрирован: 08 окт 2013, 21:01
Откуда: Latvia
Репутация: 99

Re: фрагмент кода

Сообщение AndyBig » 07 дек 2017, 17:16

Можно еще сделать один массив для всех сохраняемых байтов, а отдельные переменные для этих данных сделать ссылками на смещения внутри этого массива.
Аватара пользователя
AndyBig
Мастер
 
Сообщения: 3697
Зарегистрирован: 07 мар 2014, 04:01
Откуда: юг России
Репутация: 968
Медальки:

Re: фрагмент кода

Сообщение vala » 07 дек 2017, 19:34

AndyBig писал(а):Можно еще сделать один массив для всех сохраняемых байтов, а отдельные переменные для этих данных сделать ссылками на смещения внутри этого массива.


Тут схема полотна
фрагмент кода stelles_3.JPG

ремиз - 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] пусть там и остаётся пока не перепишится другой программой.
Аватара пользователя
vala
Почётный участник
Почётный участник
 
Сообщения: 230
Зарегистрирован: 08 окт 2013, 21:01
Откуда: Latvia
Репутация: 99


Вернуться в Электроника

Кто сейчас на конференции

Зарегистрированные пользователи: Борисыч, akulaUS, Alex lamaka, Anatolie, Andrey_Pavkin, Александр_, bass, bely85, Bing [Bot], colosimo, CrazyUser, deugene, Dmitry_K, error101, frezeryga, geezerprk, Google [Bot], grifankorefan, Healbot, Ilya87, Lafayette, leprud, Makar32, nik1, niksooon, NKS, not4u, partizann, paul7102, Гагарин, Remton, Rom327, sashaK, scroober, Shkryab, sima8520, Smlua, Something, ssisk, vicrupay, xvovanx, Yahoo [Bot], Yandex [bot], yurayerz, zman88, пансо

Поделиться

Reputation System ©'