paskal писал(а):В исходной программе использовалось очень много битовых флагов. Позволяет ли Си пользоваться битовыми флагами. То есть чтоб на 1 флаг тратился бит, а не байт?
slavokhire5 писал(а):Еще можно работать через битовые поля, но я этим как-то не пользуюсь
Так интересуют как раз битовые поля.
Дело в том что в исходной программе аж несколько десятков битовых переменных. Если реализовывать их арифметикой, то получится такая каша... Тогда получается что на ассемблере удобнее чем на сях.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Разве у этого МК нет специального регистра, биты которого сигнализируют о том, что сброс был по подаче питания? По-моему, есть...и извращения с сигнатурами будут лишними.
Кейл позволяет создавать и использовать битовые переменные.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Эээ... в 51-х контроллерах битовые поля это такая область памяти с адреса 20h где имеется аппаратный доступ к отдельным битам по адресу бита, без двоичной арифметики.
Но насчет гугля вы правы. Вот я нашел ответ: http://onembedding.bialix.com/tools/keil/faq/#sbit
Так что этот вопрос снят.
ARV писал(а):Разве у этого МК нет специального регистра, биты которого сигнализируют о том, что сброс был по подаче питания? По-моему, есть...и извращения с сигнатурами будут лишними.
Ну если честно то я бы с удовольствием отказался бы от сигнатур. Но я такого регистра у at89s52 не знаю.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Ну я не знаю какие там еще могут быть особенности, но в Си если переменную определить, но не присвоить ей значение, то никакого обнуления ее не будет. Т.е. это должно работать
ARV писал(а):Разве у этого МК нет специального регистра, биты которого сигнализируют о том, что сброс был по подаче питания? По-моему, есть...и извращения с сигнатурами будут лишними.
Ну если честно то я бы с удовольствием отказался бы от сигнатур. Но я такого регистра у at89s52 не знаю.
это очень плохо, что вы беретесь программировать МК, не изучив его внутреннее устройство. изучайте регистр PCON и конкретно флаг (бит) этого регистра POF
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ks0 писал(а):Ну я не знаю какие там еще могут быть особенности, но в Си если переменную определить, но не присвоить ей значение, то никакого обнуления ее не будет.
верно только для локальных не статических переменных функций. глобальные (статические) переменные по умолчанию обнуляются.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
paskal писал(а):Помогите справиться с особенностями кейла... МК - AT89S52... В некоторую определенную область ОЗУ пишется определенная сигнатура...Так вот, программа на си при старте заполняет ОЗУ нулями, затирая сигнатуру. Как у Кейла отключить эту фичу?
При чем тут Кейл? Разве ОЗУ это энергонезависимая память? При старте там будет, что угодно, включая старые остатки знаний. Вообщем при старте содержимое ОЗУ теряется, а регистры, за исключением SP=7 обнуляются. Может неверно понята логика работы программы? ARV верно подсказывает про PCON.
И делает так даже при голой сишной программе. Уговорить его чтоб он так не делал, я не смог.
Я понял Вас, но Вы меня нет. Это хорошо, что он так делает,
встречал даже где-то вопрос, как так делать. Но раз хозяин барин, то либо не используйте в проекте файл "STARTUP.A51" - то есть при создании откажитесь от него,
либо создайте копию и пропишите в ней, то, что хотите
Rtmip писал(а):Я понял Вас, но Вы меня нет. Это хорошо, что он так делает,
встречал даже где-то вопрос, как так делать. Но раз хозяин барин, то либо не используйте в проекте файл "STARTUP.A51"
Это вы меня не поняли. Я отказывался от ассемблерного стартапа при создании проекта. Проект состоит из голого сишного файла. При этом он компилируется в такой код:
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
paskal, посмотри эту ссылку http://www.keil.com/support/man/docs/c5 ... varloc.htm.
По-моему это то что тебе надо.
Если все-таки нужный адрес обнуляется, то в стандартном стартапе уменьшить размер сегмента IDATA и разместить сигнатуру по освободившимся адресам.
Последний раз редактировалось BorisSPB Вс окт 12, 2014 22:45:22, всего редактировалось 1 раз.
по отдельности rt = 2198, а eeprom_read_byte(&t_og_t[min])=40, т.е. перемножением должны получить 87920, делим на 10 итого 8792, но вместо этого контроллер почему то выдаёт 2238, т.е. 2198+40=2238 и игнорирует деление
int r=(rt*(long)eeprom_read_byte(&t_og_t[min])-rt*(long)eeprom_read_byte(&t_og_t[max])+(long)eeprom_read_dword(&t_og_r[min])*(long)eeprom_read_byte(&t_og_t[max])-(long)eeprom_read_dword(&t_og_r[max])*(long)eeprom_read_byte(&t_og_t[min]))*pow(((long)eeprom_read_dword(&t_og_r[min])-(long)eeprom_read_dword(&t_og_r[max])),-1);
вроде всё заработало, но в положительной части за исключением варианта, 1459*50-1459*40+973*40-1459*50/(973-1459), вместо 40 получается почему то 33, а при ожидании отрицательных результатов мало того что числа получаются положительные, так ещё и невообразимо большие