Перейти к содержанию

Преобразование Знакового Числа Из Дополнительного Кода В Прямой


Рекомендуемые сообщения

Если Т1 больше или равно Т2, то отрицательное, судя по формуле. На самом деле, чуть сложнее, лень считать.

А что, программу не вы писали?

Не, мне помогли одногруппники :) Так она правильная или нет?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 226
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

И есть полезная инструкция JBC, которая осуществит переход, если некий бит равен 1, и одновременно очистит его. Она заменит несколько ваших инструкций.

В большую программу не вникал, нет времени сейчас.

chisloL equ 11h
chisloH equ 10h
mov R0,#chisloL
mov R1,#chisloH
mov A,R1
jb A.7,loop
mov A,R0
add A,#00000001b
mov R0, A
mov A, R1
addc A,#0
mov R1, A
loop:
ret
end

Если честно, я для серии 51 давно не программировал.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Какой у вас процессор?

Это и от компилятора зависит. Попробуйте

jb acc.7,loop

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Конечный вариант с пояснениями :) Проверьте меня, опять начудил, или наконец правильно все сделал? :)

mov R0,#10    ;заносим число
mov R1,#10
clr C	 ;очищаем бит переноса
mov A,R1    ;заносим старший бит в акк
rlc A	 ;сдвиг аак на 1 разряд влево
jnc loop    ;проверка бита переполнения, если не установлен, переход на метку
mov A,R0    ;заносим младший байт в акк
cpl A	 ;инверсия акк
add A,#00000001b  ;прибавляем 1
mov R0, A    ;младший байт из акка в регистр
mov A, R1    ;старший байт в акк
cpl A	 ;инверсия
addc A,#0    ;складываем с учетом бита переполнения
mov R1, A    ;старший байт из акка в регистр
loop:
end

Atmel. Компилятор keil uVision.

Ссылка на комментарий
Поделиться на другие сайты

Это и есть 51. У Atmel полно таких процессоров.

правильно все сделал? :)

Вроде, правильно. Только

clr c

- лишний оператор.

И код

rlc A ;сдвиг аак на 1 разряд влево
jnc loop ;проверка бита переполнения, если не установлен, переход на метку

легко меняется на

jnb acc.7,loop

Только что проверил специально на Keil.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

clr c

- лишний оператор.

Да не, он не лишний.. У меня же эта подпрограмма идет сразу после рассчета моей формулы, которую я в большом коде считаю.

Это для AVR, а здесь 8051 видимо.

AT89C51 это же Atmel?

Ссылка на комментарий
Поделиться на другие сайты

Да не, он не лишний..

Какой смысл чистить С, если ты его будешь менять?

AT89C51 это же Atmel?

Да.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Какой смысл чистить С, если ты его будешь менять?

Ну да, смысла нет.. Я думал просто, что после того, как я из формулы своей получу двухбайтовое число и оно будет отрицательное, то будет флаг переполнения установлен. А как мне проверить, эта формула для знаковых чисел написана или для простых? Там все дело в делении, да? Но я не могу понять, где у меня там в делении учитывается знак..

Ссылка на комментарий
Поделиться на другие сайты

Если это таймеры работают как счетчики событий или как собственно таймеры, то в делении знака нет. Ибо в таймерах - простые числа. Правда и здесь могут быть нюансы в зависимости от поставленной преподавателем задачи.

Если таймеры/счетчики отключены и их регистры служат для хранения двухбайтных чисел, то тогда следующий вопрос - какой диапазон чисел может по условию задачи храниться в регистрах таймеров?

Ссылка на комментарий
Поделиться на другие сайты

Деление ни при чём. Знак может появиться при вычитании из 235. До того - всё положительное. И, кстати, необходимо проверять значение счётчиков на ноль. А то навычисляешь :)

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Если это таймеры работают как счетчики событий или как собственно таймеры, то в делении знака нет. Ибо в таймерах - простые числа. Правда и здесь могут быть нюансы в зависимости от поставленной преподавателем задачи.

Если таймеры/счетчики отключены и их регистры служат для хранения двухбайтных чисел, то тогда следующий вопрос - какой диапазон чисел может по условию задачи храниться в регистрах таймеров?

У меня термодатчик вырабатывает импульсы, а таймеры их считают. Первый считает импульсы высокого уровня, второй - низкого. Затем это все по формуле считается и результат заносится в ОЗУ. Затем преобразуется в двоично-десятичный код и выводится через UART в окно терминала. Вот мне щас надо понять, как учесть знак при вычитании из 235 :unknw:

Ссылка на комментарий
Поделиться на другие сайты

mvkarp, результат 400*Т1 / Т2 не может достигнуть старшего разряда 4-х байтового числа. Никаких сумятиц.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

А что будет, если в Т1 занесется чисто, скажем, 38274, а в Т2 1? Да еще и умножим на 400.

Стоп, может я уже просто не помню. Регистры TH и TL разве не однобайтные?

Ссылка на комментарий
Поделиться на другие сайты

А что будет, если в Т1 занесется чисто, скажем, 38274, а в Т2 1? Да еще и умножим на 400.

Стоп, может я уже просто не помню. Регистры TH и TL разве не однобайтные?

Однобайтовые

Ссылка на комментарий
Поделиться на другие сайты

А чем ограничиваются значения в регистрах таймеров/счетчиков? Или термодатчик такой, что соотношение импульсов высокого и низкого уровней не может превысить некоторого значения? Какова длина посылки от термодатчика?

Ссылка на комментарий
Поделиться на другие сайты

как учесть знак при вычитании из 235 :unknw:

Он сам учтётся, если правильно вычесть. А вот в вашей подпрограмме нужно задействовать какой нибудь флаг, чтобы на выходе знать знак числа.

mvkarp, счётчики двухбайтовые, как ни дели, результат будет не больше 2-х байт. Плюс умножение на 400 - итого меньше 4-х байт без знака.

Изменено пользователем Григорий Т.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Григорий Т., я просто не вижу, откуда взялись 4 байта? Вроде разговор все время шел о двух?

В коде записаны регистры r4-r7, но мне уже так слета не разобрать всего кода. Давно это было и совсем немного. :(

И в том же коде последняя строчка "; В регистрах r5:r4 находится разница - результат вычислений.", т.е. двухбайтный результат.

Я поэтому и спрашиваю об ограничениях чисел в регистрах, о длине посылки от датчика.

Ссылка на комментарий
Поделиться на другие сайты

А чем ограничиваются значения в регистрах таймеров/счетчиков? Или термодатчик такой, что соотношение импульсов высокого и низкого уровней не может превысить некоторого значения? Какова длина посылки от термодатчика?

Вообще, как бы по идее считаться должны рандомные значения. Как таковых конкретных цифр нет. Просто мне нужно это как то показать на конкретном примере, взяв произвольную температуру. А моделировать все это дело в Протеусе, и показать, что программа рабочая. Вот код программы, которая считывает импульсы с датчика.

TMPIN bit P1.0 ;порт связи с датчиком
T1H data 40h   ;определение места хранения старшего байта T1
T1L data 41h   ;определение места хранения младшего байта T1
T2H data 42h   ;определение места хранения старшего байта T2
T2L data 43h   ;определение места хранения младшего байта T2
mov TH0,#0    ;обнуление таймера 0
mov TL0,#0    ;обнуление таймера 0
mov TH1,#0    ;обнуление таймера 1
mov TL1,#0    ;обнуление таймера 1
WAIT_LO:
jb	  TMPIN,WAIT_LO ;ожидание низкого уровня сигнала
mov	 TMOD,#11h	   ;задание 16-разрядного режима работы таймеров
WAIT_HI:
jnb	 TMPIN,WAIT_HI  ;Ожидание высокого уровня
setb  TR0	   ;Включение таймера таймер 0 (Т1)
WAITTIMER0:
jb   TMPIN,WAITTIMER0 ;Ожидание низкого уровня
clr  TR0			  ;Выключение таймера 0
setb  TR1		   ;Включение таймера 1(Т2)
WAITTIMER1:
jnb  TMPIN,WAITTIMER1 ;Ожидание высокого уровня
clr  TR1		   ;Выключение таймера 1
mov A,#0H			   ;Сброс настроек таймеров 
mov TMOD,A
ret
end

Ссылка на комментарий
Поделиться на другие сайты

В коде ..... В регистрах r5:r4 находится разница

Это они погорячились. Четыре байта нужно сохранять до конца вычислений.

Изменено пользователем Григорий Т.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Во, черт, новый удар.

Почему режим работы таймеров (16-разрядный) задается уже после условного перехода?

...
mov TL1,#0 ;обнуление таймера 1
WAIT_LO:
jb	 TMPIN,WAIT_LO ;ожидание низкого уровня сигнала
mov TMOD,#11h ;задание 16-разрядного режима работы таймеров
WAIT_HI:
...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...