Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб янв 12, 2013 22:43:10
Откуда: Москва

Сообщение -Valerius- »

To Pnjom-Penb
Схемы как таковой и нет (пока что..), есть желание отработать только отдельные блоки программы, чтобы в дальнейшем уже из них собрать всю программу.
Вывод каждого разряда номеронабирателя представлен в виде 1-2-4-8 , итого четыре разряда = 16 "пинов" контроллера. И еще шесть дешифраторов (тоже в коде 1-2-4-8) = 24 "пин" AVR, получается что уже на этой стадии у меня задействовано 40 выводов контроллера. А еще нужно 2..3 кнопки, 3..4 вывода- "технологические". Поэтому- задействовал ATMega32 (у меня макет на ней), для обработки разрядов номеронабирателя- использовал два мультиплексора CD4051, выходы с контроллера на дешифраторы по ТЗ (техзаданию)- только с контроллера, 74HC595 использовать- нельзя. (Можно, но не нужно :) ) Поэтому, остановился на 32 меге, для всех "хотелок" - выводов хватает, единственное с входными сигналами непонятки были.
PS С каждого разряда номеронабирателя выходит пять выводов- питание и собственно код 1-2-4-8. Конечно, можно было бы напрямую соединить номеронабиратели с дешифраторами, но тогда кто вычислениями займется, как не AVR?
Изображение

To arkhnchul
если "первый бит" это нулевой разряд (2^0), то да.
Все верно 2^0, не верно выразил свою мысль :)

Всем спасибо за помощь, буду пробовать! :beer:
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

MOHCTEP писал(а):Можно и арифметикой пособирать для понимания :)

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

uint8_t res = a*8+b*4+c*2+ d ; //0b00001001 == 0x09
арифметическое умножение в общем может дать лучший результат - если выполняется за меньшее количество тактов, чем последовательность сдвигов. Тут я ну совсем не знаток, но по беглому просмотру справочника для avr умножение - такт на запись множителя в регистр, два такта на умножение, такт на чтение результата; сдвиг - один такт для сдвига на одну позицию. Т.е. вроде как (???) вариант с умножением должен получаться предпочтительнее начиная со сдвига на 6 позиций.
Реклама
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

arkhnchul :) Так я ж отметил, что предложенный Вами код с битовыми сдвигами, предпочтительней. Просто -Valerius- чуть подзапутался в логике, вот я и предложил "альтернативу", исключительно для понимания сути и без претензии на ее использование. К моему стыду, я не владею информацией о тактовой продолжительности операций, однако статистика(личная) потребления ресурсов указывает на лучший кпд логики сравнительно с арифметикой посложнее "а+в".
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

-Valerius- писал(а):Вывод каждого разряда номеронабирателя представлен в виде 1-2-4-8 ...
Так я и думал. Не нужны Вам никакие сдвиги и лог.сложение по ИЛИ - заводите четыре выхода каждого разряда (через мультиплексор или к.л. иначе) на порт м/к и читаете этот порт - все дела. Если будут использованы четыре младших пина, то, например, так:

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

    value = PORTx & 0x0F;
Принцип такой:Изображение

Add-n
Как-то неясно Вы про использование вв/выв меги32 написали...
1. 40 вводов/выводов у нее нету - четыре порта по 8 = 32 вывода
2. Если "номеронабиратели" видны меге32 через 4051, то почему Вы пишете "итого четыре разряда = 16 "пинов" контроллера"? Там получается 8+3+1+1 = 13.
3. Про дешифраторы ничего не сказано, но возможно, требование "выходы на дешифраторы по ТЗ только с контроллера" также допускает мультиплексирование. Например, если у них есть вывод CS, или вывод Common, как у "номеронабирателей" на фото.
4. Логика вычислений не изложена ("Конечно, можно было бы напрямую соединить номеронабиратели с дешифраторами, но тогда кто вычислениями займется, как не AVR?"), однако, не исключено, что эта логика м.б. реализована без контроллера - смотря какая логика.

В общем, все, что связано с чтением номеронабирателей можно уложить в 6 или 7 выводов - в один порт, да еще и останется 1-2 вв/выв под кнопки. Если дешифраторы таковы, как я предположил выше, то их можно обрабатывать вторым портом. При отсутствии дешифратора "N -> 1_из_M", придется взять еще пару I/O из другого порта. Итого, на всякие "2..3 кнопки, 3..4 "технологические" вывода" останется два или почти два порта.

Опишите дешифраторы, м.б. спланировать точнее.
Вложения
sch_keyread.gif
(3.79 КБ) 695 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

Привет всем котам. Имеется нубский вопрос по СИ и моим любимым указателям. помогите разобраться

Имеется внешняя ЕЕПРОМ. в ней лежит куча настроек в виде упакованных структур. Прочитать всю структуру проблем нет:

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

M95_read(SET_PAGE_START, (void *)(&settings), sizeof(settings));
скармливаем ф-ции чтения адрес начала читаемой структуры в ЕЕПРОМ(SET_PAGE_START), указатель на нужную структуру в ОЗУ (&settings), и размер структуры (sizeof(settings)).

Но если мне понадобится записать один из элементов (допустим, его зовут value) структуры в ЕЕПРОМ, как это короче сделать? (это вопрос №1)
Приходит в голову чтение по адресу структуры + адрес элемента ВНУТРИ структуры (или его смещение от начала структуры, не знаю как это правильно сказать). получается жутко длинная и не читаемая колбаса такого вида:

M95_write(SET_PAGE_START + смещение_внутри_структуры , (void *)(&settings.value), sizeof(settings.value));[/code]

вопрос №2: как правильно это смещение рассчитывать? я делаю так: смещение_внутри_структуры = *(settings.value) - *settings;
но кокос говорит мне, что я неправ - invalid operands to binary - (have 'uint8_t *' and 'struct settings)
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

slavokhire5 писал(а):Приходит в голову чтение по адресу структуры + адрес элемента ВНУТРИ структуры (или его смещение от начала структуры, не знаю как это правильно сказать). получается жутко длинная и не читаемая колбаса такого вида
смещение и зовется это.
Нечитаемая колбаса - да, адресная арифметика она такая :dont_know:
slavokhire5 писал(а):я делаю так: смещение_внутри_структуры = *(settings.value) - *settings;
если правильно помню, то так:
смещение_внутри_структуры = &(settings->value) - settings;
значение_внутри_структуры = *(settings + смещение_внутри_структуры)
могу ошибаться, птичий язык адресной арифметики никогда не давался(
Реклама
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

Есть такой макрос offsetof.
Все потроха спрятаны в нем, а в коде имеем читаемый и понятный текст...
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Всем привет!
Ломаю голову, а что делает вот эта команда?

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

*((volatile unsigned char *) (0x77200480)) = 0x00;
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Обнуляет ячейку в памяти по этому адресу.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Интересно, откуда выцарапана эта хрень с почти 2-гигабайтным адресом ? Мне бы МК со столько памяти :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Jack_A писал(а):откуда выцарапана эта хрень с почти 2-гигабайтным адресом ?
ARM же наверняка, виртуальные адреса...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

вопрос у кого есть студия 2013
внезапно надо модифицировать прогу http://winapi32.narod.ru/#3 ruslat
индикатор раскладки клавиатуры

я его сбираю на своей системе 8.1 64бит
запускаю на 8.1 64, но на ней не установлены длл от мс, а на моей идут вместе со студией

прога автора же работает без запроса длл, а моя собранная просит msvcr120.dll

я загуглил и там пишут, что надо в разделе с++ выбрать ключ /MT
однако любая комбинация тамошних ключей ничего не дает
прога простая, винапи

вопрос 2
там есть некие магические цифры
case 1049:
tnid.hIcon = hIconRus;
я загуглил, но так и не понял этих цифр
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Russian (ru) 0x19 LANG_RUSSIAN Russia (RU) 0x01 SUBLANG_RUSSIAN_RUSSIA
1049 это 0х0419
где взять магическое число для казахской раскладки?
тематические ответы только в форуме, в приват не пишите
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

kalobyte писал(а):я загуглил и там пишут, что надо в разделе с++ выбрать ключ /MT
Для VS 2008 статическая версия рантайма выбирается так: свойства проекта -> Configuration Properties->C/C++->Code Generation->Runtime Library->Multi-threaded /MT
kalobyte писал(а): LANG_RUSSIAN Russia (RU) 0x01 SUBLANG_RUSSIAN_RUSSIA
1049 это 0х0419
где взять магическое число для казахской раскладки?
в хидере WinNT.h Platform SDK:

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

#define LANG_KANNADA                     0x4b
#define LANG_KASHMIRI                    0x60
#define LANG_KAZAK                       0x3f
[...]
#define LANG_RUSSIAN                     0x19
[...]
#define SUBLANG_KAZAK_KAZAKHSTAN                    0x01    // Kazakh (Kazakhstan) 0x043f kk-KZ

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

GetKeyboardLayout function.   [...] The low word contains a Language Identifier for the input language [...] A language identifier is constructed using the MAKELANGID macro. The following illustration shows the format of the bits in a language identifier.


+-------------------------+-------------------------+
|     SubLanguage ID      |   Primary Language ID   |
+-------------------------+-------------------------+
15                    10  9                         0   bit
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Добрый день, что-то поднадоело мне в iar предупреждение:

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

Warning[Pa050]: non-native end of line sequence detected (this diagnostic is only issued once)  .........
Я так понимаю iar ругается из за невидимого символа что типа не так на следующую строку перехожу, только вот какая ему разница ?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

WiseLord писал(а):Обнуляет ячейку в памяти по этому адресу.
Можно ли написать так (исходная запись *((volatile unsigned char *) (0x77200480)) = 0x00;)

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

 volatile unsigned char * 0x77200480 = 0x00;
Зачем нужна первая звездочка?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Первая звёздочка показывает, что по этому адресу лежит указатель на ячейку памяти, которую ты обнуляешь.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

Chip115 писал(а):

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

 volatile unsigned char * 0x77200480 = 0x00;
Нельзя. Вы пытаетесь объявить указатель на unsigned char с именем 0x77200480 и инициализировать его в 0. Имена переменных, начинающиеся цифрами, запрещены - компилятор осмотрит вас с сочуствующим недоумением. ;)

0x77200480 - просто числовой литерал;
(unsigned char*)0x77200480 - приведение типа - результат этой операции - указатель, который уже можно в оном качестве скормить компилятору. Указывает на область памяти по соответствующему адресу;
*(unsigned char*)0x77200480 - разыменование указателя - получение доступа на чтение из (если справа) либо на запись в (если слева) область/области памяти на которую указывает указатель. Тип указателя определяет размер модифицируемой памяти - в данном случае 1 байт.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

pokk писал(а):

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

Warning[Pa050]: non-native end of line sequence detected (this diagnostic is only issued once)  .........
Стандартный EOL для Windows - CR/LF, у вас-же, вероятно, исходные тексты содержат строчки, добавленые в Unix/Mac редакторах, либо полностью используют LF в качестве концов строк. Решение - открыть тексты в редакторе, менее дубовом чем Notepad и сохранить с родными для хост-системы концами строк. ЕМНИП Notepad++ такое может, сам пользуюсь более мне привычным vim-ом.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Siarzhuk писал(а):
Chip115 писал(а):

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

 volatile unsigned char * 0x77200480 = 0x00;
Нельзя. Вы пытаетесь объявить указатель на unsigned char с именем 0x77200480 и инициализировать его в 0. Имена переменных, начинающиеся цифрами, запрещены - компилятор осмотрит вас с сочуствующим недоумением. ;)

0x77200480 - просто числовой литерал;
(unsigned char*)0x77200480 - приведение типа - результат этой операции - указатель, который уже можно в оном качестве скормить компилятору. Указывает на область памяти по соответствующему адресу;
*(unsigned char*)0x77200480 - разыменование указателя - получение доступа на чтение из (если справа) либо на запись в (если слева) область/области памяти на которую указывает указатель. Тип указателя определяет размер модифицируемой памяти - в данном случае 1 байт.
Спасибо что разжевали! Еще путаюсь с этими указателями )
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

Siarzhuk писал(а):// Kazakh (Kazakhstan) 0x043f kk-KZ
что-то я не понял, откуда 04?
#define SUBLANG_KAZAK_KAZAKHSTAN 0x01
Siarzhuk писал(а):Для VS 2008 статическая версия рантайма выбирается так
я там и выбрал, но все равно просит новую длл
тематические ответы только в форуме, в приват не пишите
Ответить

Вернуться в «Разные вопросы по МК»