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

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


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

И сколько времени на это уходит? Какой период этого импульса? После этого они ведь свободны.

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

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

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

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

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

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

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

ну вообще мне надо T1 и T2 задавать самому. Получается, что в моем тестовом примере я смогу показать только одну температуру. И как же я тогда сделаю так, что через 30 секунд у меня должна появиться другая температура, если у меня она одна - та, которую я задал в T1 и T2. Вывести надпись в терминал через 30 секунд типа 'end' или что-то в этом роде? :)

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

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

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

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

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

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

Почему самому? Нужно в протеусе, вместо датчика, подключить генератор прямоугольного сигнала с регулируемой скважностью. Меняешь скважность - меняются показания на терминале.

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

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

То есть мы посчитали импульсы, остановили таймеры, вывели температуру в терминал, запустили таймер на 30 секунд, в это время поменяли скважность и как только прошло 30 секунд, у нас будет выводиться в терминал новая температура? :)

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

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

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

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

Ну, по крайнем мере так, проект будет представлен во всей красе :)

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

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

Подсчет импульсов

нахождение по формуле темпратуры

преобразование в BCD

преобразование в ASCII

вывод в терминал

Таймер запускать после того, как посчитали импульсы?

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

Вот такую написал :)

delay equ -(30000000)		 
start:
MOV TH0, #high(delay)
MOV TL0, #low(delay)
MOV TMOD, #1h
MOV R0, #230
SETB TCON.4
again:
JNB TCON.5, $
CLR TCON.5
DJNZ R0, again
skip:
mov r0,a
mov R0, #231
out:
SETB TCON.4
JNB TCON.5, $
CLR TCON.5
DJNZ R0, out
END

теперь все получается. Но хотелось бы привести к виду норм. Добавил знаки °t=-555°С, терминал выдает крокозябры на символы, а числа и знак пишет нормально. В чем подвох? :)

А не, все показывает нормально :) Кроме знака градуса :)

Вот Протеус..

post-180778-0-58688000-1401028960_thumb.jpg

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

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

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

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

mvkarp, если он только начал программировать , а похоже что так оно и есть, то всё понятно. ...

Вроде я как бы и согласен. Но когда тебе втюхивают, а сам никак не хочет буквари почитать -это как-то недостойно выглядит.

Pragmatik91, это к Вам относится.

Местами читаю - так у меня кот, что на коленках лежит, лучше соображает.

Соберитесь, поразмыслите - потом уж вопросы сыпьте. Гриша тоже не вечен. Не будет всю Вашу жизнь Вам подсказывать.

Извините, если это все грубо для кого звучит.

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

...Только вот температура бежит и бежит. Как бы теперь так сделать, чтобы одно число показала и все?...

Вот такую написал :)

delay equ -(30000000)		
start:
MOV TH0, #high(delay)
MOV TL0, #low(delay)
MOV TMOD, #1h
MOV R0, #230
SETB TCON.4
again:
JNB TCON.5, $
CLR TCON.5
DJNZ R0, again
skip:
mov r0,a
mov R0, #231
out:
SETB TCON.4
JNB TCON.5, $
CLR TCON.5
DJNZ R0, out
END

теперь все получается. Но хотелось бы привести к виду норм. Добавил знаки °t=-555°С, терминал выдает крокозябры на символы, а числа и знак пишет нормально. В чем подвох? :)

А не, все показывает нормально :) Кроме знака градуса :)

Вот Протеус..

Для "одного числа" попробуйте символы "бэкспейса" выводить. В чистой консоле рабало. Только нужно помнить сколько символов выводилось. Вроде бы есть еще символ "начало строки". По логике должно затереть старое значение. Ну тут от кода протеуса еще зависеть будет. В нем не работал.

Ак к знакам °t= случаем число 0x30 не добавляется подпрограмме вывода? Покажите код который это делает.

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

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

Попадаю в вечный цикл div_error. Если есть перенос, то на ошибку, а если нет, то дальше. Как так сделать, чтобы шел дальше? :)

FORMULA:
;  вычисления по формуле 235 - 400*Т1 / Т2
;   где Т1 - значение таймера0 TH0:TL0
;	   Т2 - значение таймера1 TH1:TL1
;


; Умножение на 400
; Х= 400*Х= (16*Х + 8*Х + Х)*16
; Сумма в регистрах r7:r6:r5:r4
; Счетные регистры r3:r2:r1
;

;заносим в сумму Х .
; берем из таймера0
 mov r7,#00
 mov r6,#00
 mov r5,#T1H
 mov r4,#T1L
;заносим в счетные регистры Х.
 mov	 r3,#00
 mov	 a,r5
 mov	 r2,a
 mov	 a,r4
 mov	 r1,a
; умножаем на 8 тремя сдвигами влево
 mov	 r0,#03  ; три сдвига
m1:
 clr	 c	   ; сбрасываем С (он попадет в младший бит)
 mov	 a,r1    ; младший байт в аккумулятор
 rlc	 a	   ; сдвиг влево через перенос
 mov	 r1,a    ; обратно в регистр
 mov	 a,r2    ; средний регистр в аккумулятор
 rlc	 a	   ; сдвиг влево через перенос
 mov	 r2,a    ; обратно в регистр
 mov	 a,r3    ; старший регистр в аккумулятор
 rlc	 a	   ; сдвиг влево через перенос
 mov	 r3,a    ; обратно в регистр
 djnz    r0,m1   ; вычесть из r1 единицу и перейти, если r0 не равен 0
; складываем с суммой
 mov	 a,r1    ; регистр в аккумулятор
 add	 a,r4    ; складываем с регистром суммы
 mov	 r4,a    ; обратно в регистр суммы
 mov	 a,r2    ; регистр в аккумулятор
 addc    a,r5    ; складываем с регистром суммы с учетом переноса
 mov	 r5,a    ; обратно в регистр суммы
 mov	 a,r3    ; регистр в аккумулятор
 addc    a,r6    ; складываем с регистром суммы с учетом переноса
 mov	 r6,a    ; обратно в регистр суммы
 clr	 a	   ; старший байт счетных регистров = 0
 addc    a,r7    ; складываем с регистром суммы с учетом переноса
 mov	 r7,a    ; обратно в регистр суммы
; умножаем счетные регистры еще раз на 2. В итоге получится X*16
 clr	 c
 mov	 a,r1
 rlc	 a
 mov	 r1,a
 mov	 a,r2
 rlc	 a
 mov	 r2,a
 mov	 a,r3
 rlc	 a
 mov	 r3,a
; складываем с суммой
 mov	 a,r1
 add	 a,r4
 mov	 r4,a
 mov	 a,r2
 addc    a,r5
 mov	 r5,a
 mov	 a,r3
 addc    a,r6
 mov	 r6,a
 clr	 a
 addc    a,r7
 mov	 r7,a
; умножаем сумму на 16 четырьмя сдвигами влево
 mov	 r0,#04  ; четыре сдвига
m2:
 clr	 c
 mov	 a,r4
 rlc	 a
 mov	 r4,a
 mov	 a,r5
 rlc	 a
 mov	 r5,a
 mov	 a,r6
 rlc	 a
 mov	 r6,a
 mov	 a,r7
 rlc	 a
 mov	 r7,a
 djnz    r0,m2
;
; Деление    сумма/Т2
; (r7:r6:r5:r4)/(r3:r2) = r5:r4
;

; делитель берем из таймера1
 mov	 r3,#T2H  ; старший байт
 mov	 r2,#T2L  ; младший байт
; проверяем на переполнение частного (если старшие два байта делимого >= делителю)
 clr	 c	   ; сбрасываем С, чтобы не повлиял на команду subb
 mov	 a,r6    ; регистр в аккумулятор
 subb    a,r2    ; вычитаем
 mov	 a,r7    ; регистр в аккумулятор
 subb    a,r3    ; вычитаем (важен С)

 jnc    div_error	    ; если есть перенос(число больше), то уходим на ошибку

 mov	 b,#16   ; 16 циклов
; сдвиг влево r7:r6:r5:r4
div16_0:
 clr	 c
 mov	 a,r4
 rlc	 a
 mov	 r4,a
 mov	 a,r5
 rlc	 a
 mov	 r5,a
 mov	 a,r6
 rlc	 a
 mov	 r6,a
 mov	 a,r7
 rlc	 a
 mov	 r7,a

 jc	  div16_3 ; если есть перенос, то вычесть делитель и прибавить 1 в частное r5:r4
; вычитаем делитель r3:r2
 mov	 a,r6
 subb    a,r2
 mov	 r6,a
 mov	 a,r7
 subb    a,r3
 mov	 r7,a

 jnc	 div16_1 ; переноса нет, +1 к частному
; восстанавливаем остаток
 mov	 a,r6
 add	 a,r2
 mov	 r6,a
 mov	 a,r7
 addc    a,r3
 mov	 r7,a

 sjmp    div16_2
; вычитаем остаток
div16_3:
 clr	 c
 mov	 a,r6
 subb    a,r2
 mov	 r6,a
 mov	 a,r7
 subb    a,r3
 mov	 r7,a
; +1 к частному
div16_1:
 inc	 r4
; следующий цикл
div16_2:
 djnz    b,div16_0
div_error:
 sjmp    div_error
; 235 - r5:r4
;

; в r7:r6 заносим 235
 mov	 r7,#00
 mov	 r6,#235
; вычитаем
 clr	 c
 mov	 a,r6
 subb    a,r4
 mov	 r4,a
 mov	 a,r7
 subb    a,r5
 mov	 r5,a
 mov r3,#0
;проверка полученного числа на отрицательность
 mov a,r5
 jnb acc.7, loop
 inc r3
 inc r3
 mov a, r4
 cpl a
 add a,#00000001b
 mov r4, a
 mov a, r5
 cpl a
 addc a,#0
 mov r5, a
 loop:
 mov 45H,r5 ;cтарший байт результата
 mov 44H,r4 ;младший байт результата
 mov 47H,r3 ;знак результата
ret

...Только вот температура бежит и бежит. Как бы теперь так сделать, чтобы одно число показала и все?...

Вот такую написал :)

delay equ -(30000000)		
start:
MOV TH0, #high(delay)
MOV TL0, #low(delay)
MOV TMOD, #1h
MOV R0, #230
SETB TCON.4
again:
JNB TCON.5, $
CLR TCON.5
DJNZ R0, again
skip:
mov r0,a
mov R0, #231
out:
SETB TCON.4
JNB TCON.5, $
CLR TCON.5
DJNZ R0, out
END

теперь все получается. Но хотелось бы привести к виду норм. Добавил знаки °t=-555°С, терминал выдает крокозябры на символы, а числа и знак пишет нормально. В чем подвох? :)

А не, все показывает нормально :) Кроме знака градуса :)

Вот Протеус..

Для "одного числа" попробуйте символы "бэкспейса" выводить. В чистой консоле рабало. Только нужно помнить сколько символов выводилось. Вроде бы есть еще символ "начало строки". По логике должно затереть старое значение. Ну тут от кода протеуса еще зависеть будет. В нем не работал.

Ак к знакам °t= случаем число 0x30 не добавляется подпрограмме вывода? Покажите код который это делает.

BCD2ASCII:
CALCBUFZN   DATA 047h   ;знак
CALCBUFTEMP   DATA 051h   ;знак t
CALCRAVNO   DATA 052h   ;знак =
CALCC    DATA 053h   ;знак С
;загружаем t
mov A, CALCBUFTEMP
add A,#74h	   ;число знака	 
mov 051h,A
;загружаем знак =
mov A, CALCRAVNO
add A,#3Dh	   ;число знака	 
mov 052h,A
;загружаем С
mov A, CALCC
add A,#43h	   ;число знака	 
mov 053h,A
;загружаем знак
mov A, CALCBUFZN
add A,#2Bh	   ;число знака	 
mov 047h,A

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

Не могу сообразить че это за манипуляция.

Зачем к одной непонятной константе прибавлять другую?

Коды нужных символов: 0x74, 0xB0 и 0x3D. После выводить знак и число.

Символ бэкспейса, если нужен, 0x8.

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

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

Попадаю в вечный цикл div_error. Если есть перенос, то на ошибку, а если нет, то дальше. Как так сделать, чтобы шел дальше? :)


; следующий цикл

div16_2:

djnz b,div16_0

....................................

div_error:

sjmp div_error

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

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

Какие то косяки либо в Протеусе, либо в моей программе. Не могу определить, где ошибка. Ввожу в начале 210, вычитаю ее из 235 и получается то, что на рисунке. Хотя просмотрел полностью код программы, в ячейках ничего лишнего не обнаружил, считается все правильно. В чем может быть проблема? :umnik2:

raznost:
; в r7:r6 заносим 235
mov	 r7,#00
mov	 r6,#235
mov r5,#00
mov r4,#210
; вычитаем
clr	 c
mov	 a,r6
subb a,r4
mov	 r4,a
mov	 a,r7
subb a,r5
mov	 r5,a
mov r3,#0
;проверка полученного числа на отрицательность
mov a,r5
jnb acc.7, loop
inc r3
inc r3
mov a, r4
cpl a
add a,#00000001b
mov r4, a
mov a, r5
cpl a
addc a,#0
mov r5, a
loop:
mov 45H,r5 ;cтарший байт результата
 mov 44H,r4 ;младший байт результата
mov 47H,r3 ;знак результата
BIN2BCD:
CALCBUFL		 DATA 044h ;младший байт двоично-десятичного
CALCBUFM		 DATA 045h ;средний байт двоично-десятичного
CALCBUFH		 DATA 046h ;старший байт двоично-десятичного
BIN2DEC:	 push PSW
push ACC
push B
push DPH
push DPL
mov DPH,CALCBUFM
mov DPL,CALCBUFL
mov CALCBUFH,#000h
mov CALCBUFM,#000h
mov CALCBUFL,#000h
mov B,#010h
BIN2DEC_1:
mov A,DPL
rlc A
mov DPL,A
mov A,DPH
rlc A
mov DPH,A
mov A,CALCBUFL
rlc A
da A
mov CALCBUFL,A
mov A,CALCBUFM
rlc A
da A
mov CALCBUFM,A
mov A,CALCBUFH
rlc A
da A
mov CALCBUFH,A
djnz B,BIN2DEC_1
pop DPL
pop DPH
pop B
pop ACC
pop PSW
BCD2ASCII:
CALCBUFZN DATA 047h ;знак
CALCBUFTEMP DATA 051h ;знак t
CALCRAVNO DATA 052h ;знак =
CALCC DATA 053h ;знак С
CALCGRAD DATA 054h
mov 054h,#0Bh
;загружаем t
mov 051h,#74h
;загружаем знак =	
mov 052h,#3Dh
;загружаем С	
mov 053h,#43h
;загружаем знак
mov A, CALCBUFZN
add A,#2Bh	 ;число знака	
mov 047h,A
;загружаем младший байт
mov A, CALCBUFL
ANL A,#00001111B
add A,#30h	 ;работаем с младшей тетрадой		
mov 048h,A
mov A, CALCBUFL
ANL A,#11110000B ;работаем со старшей тетрадой
swap A
add A,#30h
mov 049h,A
;загружаем средний байт
mov A, CALCBUFM
ANL A,#00001111B ;работаем с младшей тетрадой
add A,#30h	
mov 04Ah,A	
mov A, CALCBUFM
ANL A,#11110000B ;работаем со старшей тетрадой
swap A
add A,#30h
mov 04Bh,A
INTERM:
;подпрограмма отправки строки в терминал
JMP start
start:
MOV SCON, #50h
MOV TH1, #0FDh
ORL TMOD, #20h
SETB TR1
MOV DPTR, #txt
again:
CLR TI
CLR A
MOVC A, @A+DPTR
CJNE A, #1Bh, write_char
JMP time
write_char:
mov R0,A
mov A,@R0
MOV SBUF, A
JNB TI, $
INC DPTR
SJMP again
txt: DB 051h,052h,047h,04Ah,049h,048h,053h, 1Bh
time:
jmp time
END

post-180778-0-30000800-1401203243_thumb.jpg

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

или как по другому можно разбить число на тетрады, каждую тетраду перевести по таблице и сохранить их в ОЗУ? Думаю, ошибка именно в переводе по таблице. Хотя в ОЗУ все сохраняется нормально.

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

Что-то я не разберу алгоритм от BIN2BCD:

И никаких комментариев нет.

Начиная с BCD2ASCII: у вас всё работало правильно.

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

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

Что-то я не разберу алгоритм от BIN2BCD:

И никаких комментариев нет.

Начиная с BCD2ASCII: у вас всё работало правильно.

http://forum.cxem.net/index.php?showtopic=17150

эта правильно работает стопудово.

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

Перепроверил 3 раза.. Короче получается такая потеха: если мы вычитаем и результат получается меньше 10 (235-240 или 235-230), то выводятся правильные числа в терминал. Если результат вычитания получается больше 10, например 235-220, то в терминале выводится такая строка: t=+615C, то есть вместо 0 появляется 6.

При этом в ОЗУ все числа правильно записываются, проверил на калькуляторе.

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

Вряд ли. Остальное же правильно выводится.

Значит тогда что-то с Протеусом не так. Ладно, завтра спрошу у преподавателя, что с этим делать :)

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

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

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

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

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

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

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

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

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

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

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

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