Разделить число на 8 битные
- Войдите на сайт для отправки комментариев
Програмирование не моё, но лучшее обучение это практика. Появилась офигетельная идея, аналогов не нашлось, хотя фотки искал.
По статической индикации нашлась только эта статья https://forum.alaev.club/viewtopic.php?t=317
Из кода выкинул что смог.
У меня число в 13 бит 4 разряда.
Итого 6 микросхем и одна нога лишняя. Хотел зарезервировать ещё одну и поставить 7 регистров, но врятли они нужны.
Изначально массив был byte что 8 бит, я ничего лучше не нашёл как сделать из него unsigned int, ну и чтоб всё это упростить записал данные десятичными
const unsigned int digit[] = { 4095, //0 124, //1 7135, //2 5631, //3 7741, //4 7671, //5 8183, //6 127, //7 8191, //8 7679, //9 };
Но на выводе у меня shiftOut который принимает 8 бит
pot = int(display); x4 = pot/1000; x3 = (pot/100)%10; x2 = (pot/10)%10; x1 = pot%10; digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]); shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]); shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]); shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]); digitalWrite(latchPin, HIGH);
В общем получается последовательность 0+13x4бит которые надо както покрошить на 6 раз по 8 бит.
Полный код который лучше не смотреть.
int latchPin = 10;//сигнал Ready int clockPin = 12;//сигнал Clock int dataPin = 11;//cигнал Data int x1; int x2; int x3; int x4; int pot; float display = 1110; //величина, выводимая на индикатор = 4 цифры //const byte digit[] = //seven segment digits in bits const unsigned int digit[] = { 4095, // 00111111111111 //B00111111, //0 124, //0000001111100 //1 7135, // 01101111011111 //2 5631, //B01001111, //3 7741, //B01100110, //4 7671,//B01101101, //5 8183,//B01111101, //6 127, //B00000111, //7 8191, //B01111111, //8 7679, //B01101111 //9 }; // 010111 11011111 , 6111 01011111011111 //B01110110 6111 //H //B00010000 //i //B00111000 //L //B01011100 //o void setup(){ pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop(){ pot = int(display); x4 = pot/1000; x3 = (pot/100)%10; x2 = (pot/10)%10; x1 = pot%10; digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, digit[x1]); shiftOut(dataPin, clockPin, MSBFIRST, digit[x2]); shiftOut(dataPin, clockPin, MSBFIRST, digit[x3]); shiftOut(dataPin, clockPin, MSBFIRST, digit[x4]); digitalWrite(latchPin, HIGH); delay(1000); }//конец цикла
Общая идея как это сделать - берем 1 число digit[1], применяем к нему & B11111111 - получаем 8 бит, сохраняем. Далее смещаем побитно 8 раз digit[1]>>8. берем digit[2]<<5 смещаем его на 5, складываем, опять оператор И. И т.д.
Чтото сложно примудро, без примера не понять.
Вытащил кусок ардуины arduino-1.6.8\hardware\arduino\avr\cores\arduino\wiring_shift.c
Может както побитно сюда можно втолкнуть ?
Уважаемый, да забудьте уже про пины - Вы работаете с числами! Во-первых 16 битное число лучше обозвать uint16_t digit[4]. Только у ВАс в примере их 9...
Берем первое число и вырезаем последние 8 бит - тут понятно?
Остается 5 бит (у Вас 13 же 13 бит?) на 8-13 позиции. Их надо перегнать на 0-4 позиции. Для этого есть оператор >>. Далее - у второго числа отрезаем 3 последних бита и смещаем их на 5-7 позиции оператором <<5. Складываем, вырезаем 8 бит. И вот второй байт готов.
Тут подумалось - можно малость попроще.
Берем переменную uint64 chislo=0;
Далее chislo+=digit[0]; Смещаем на 13 бит chislo<<13; Добавляем следующее chislo+=digit[1]; Опять смещаем на 13 бит chislo<<13; и т.д.
В итоге получаем 64 битное число, которое потом режем по 8 бит.
Кидану кусочек программы
Пока что я понял это
написано тут
В общем пришлось нанрисовать другой эмуль и приделать эмулятор терминала.
В какомто посту идею понял, но у вас там ошибок море, в этом направлении попробую сам
Пока что я понял это
написано тут
В общем пришлось нанрисовать другой эмуль и приделать эмулятор терминала.
В какомто посту идею понял, но у вас там ошибок море, в этом направлении попробую сам
А может Вам еще водочки поднести? Мы это завсегда! А что читаете - это очень полезно.
А насчет моря ошибок - можно поподробнее? Или так - в лужу п-нули?
Кидану кусочек программы
А насчет моря ошибок - можно поподробнее? Или так - в лужу п-нули?
Ну, на вскидку:
строка 8 забыли точку с запятой
Строки 4 и 9 синтаксически правильны, но бессмысленны, тк ничего не делают.
Дальше не смотрел.
Как нарубить флоат на байты? union
Ну, на вскидку:
строка 8 забыли точку с запятой
Строки 4 и 9 синтаксически правильны, но бессмысленны, тк ничего не делают.
Дальше не смотрел.
Вы чего думали - я его проверял??? 8-ю строку Вам компилятор указал. 4 и 9 - прочитали, молодец. Так и вставьте как поняли. А дальше ничего и нет- конец цикла. Вы кое-что поняли, теперь попытайтесь назад из resultat[] получить 4 13 битных числа. И поверьте,никто программы за Вас писать не будет. Максимум алгоритм подскажут.
Ну, на вскидку:
строка 8 забыли точку с запятой
Строки 4 и 9 синтаксически правильны, но бессмысленны, тк ничего не делают.
Дальше не смотрел.
Вы чего думали - я его проверял??? 8-ю строку Вам компилятор указал. 4 и 9 - прочитали, молодец. Так и вставьте как поняли. А дальше ничего и нет- конец цикла. Вы кое-что поняли, теперь попытайтесь назад из resultat[] получить 4 13 битных числа. И поверьте,никто программы за Вас писать не будет. Максимум алгоритм подскажут.
Чукча не читалель, чукча писатель? Если читать внимательнее будет, то увидете, что лично мне ничего не надо. Вы захерачили код с ошибками, на замечание, что там ошибки сами же поросили
А теперь пургу несете. Слив засчитан.
Как нарубить флоат на байты? union
Вот так (упрощенно, можно в цикле):
Тоже самое с любыми типами переменных (на которые можно нацелить указатель), а также на масивы из этих типов. Естесственно подумав как лучьше.
Кидану кусочек программы
Модифицирую немного (можно?):
Не забываем что байти будут складываться в массив от младшего к старшему.
Наложите на свой uint64 union с bytes[8] безо всяких циклов.
Еслиб я видел что на выводе, но Serial.println не может выводить uint64_t, какойто костыль есть, но там тоже только последние 32 бита.
Наложите на свой uint64 union с bytes[8] безо всяких циклов.
;)))) Ложить - неправильно, правильно класть! (с) "День выборов"
Наложите на свой uint64 union с bytes[8] безо всяких циклов.
Даже если и "наложить"(в штаны) используя union, один фиг его нужно передавать как-то.
Цикл нужен для друго, например передачи через UART:
Это всего лишь пример.
Ну, если Вам нужно что-то "например", то я тоже могу привести:
Пока сделал так.
Знаки
После того как определяется x
Сама запись в регистры
Из за того что вывод 8 битный и создавать переменную для хранения старшего бита не хотелось, поменял их местами из 4321 8765 в более приемлемый 1234 5678, а именно заменил MSBFIRST на LSBFIRST.
При этом выводимые данные перевернулись и левые то есть старшие разряды, стали первыми, то есть младшими выводами регистра. Оно какбы наоборот, но писать даже удобнее, слева на право. Только пришлось поискать онлайн сервис который их конвертирует, и по словам менять, а потом калькулятором переводить в десятичные, потому как бинарное число не может быть больше 8 бит, что как по мне так бред бредовой ардуины.
Не уверен нужен ли мне вообще цикл for, или быстрее будет работать построчно, или компилятору пофиг, не думаю. В общем написал для примера.
Как тут и говорят, альтернативный вариант это побитно выводить сразу 13 бит побитно без переменной uint.
Ну а последовательность бит не красиво только 4 младшими битами которые надо дописывать, в конце последнего регистра они бы не мешали.
mykaida идею подал, но видимо я не програмист чтоб понять что там конкретно. По сравнению с autoit, функционал ардуины очень скромный.
---
В общем с разводкой тоже получилось не красиво из за сдвига в другую сторону, но при моей раскладке наверно там в любую сторону будет неудобно, так что наверно лепить перемычки. Как оказалось дорожек получается вовсе и не мало
Выкинул этот uint64 и получилось чтото такое
Вообще не понимаю как имея переменную i вызвать digit[x4] где цифра будет переменной
В общем получилось такое
Теперь вот думаю пустить это в другую сторону и переделать ноги портов, а то чтото неудобно выходит.
---
Как оказалось достаточно физически расположить разряды в обратном порядке, пока 2 регистра легли хорошо. К коде поменять только порядок x[0]-x[3]