Скажите пожалуйста почему так происходит и как решить?
ниже выделено другим цветом
В результате динамической индикации на индикаторе отображаются числа от 0 до 227, потом он считает без вывода на индикацию, затем счет начинается с 0.
Если посмотреть в отладчике как всё происходит, то там начиная с 228, когда идет операция вычитания сотни, получается число 128 [если взять число 228] , поднимается флаг N как-будто 128 отрицательно.
обработку прерывания не стал отправлять, если потребуется пришлю.
Благодарю за помощь!
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m32def.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def counter_sec=R21
.def counter_sotn=R13
.def counter_des=R14
.def counter_ed=R15
.def bufer=R23
.cseg
.org 0
rjmp START
.org $16
rjmp TM0_OVF
;=============== Инициализация стека =================
START:
RAM_Flush: LDI ZL,Low(SRAM_START) ; Адрес начала ОЗУ в индекс
LDI ZH,High(SRAM_START)
CLR R16 ; Очищаем R16
;================ Инициализация портов ввода-вывода ====================
ldi Temp,255 ;присвоение константы
out DDRB,Temp ;ножки порта B на вывод
out DDRA,Temp ;ножки порта А на вывод
out DDRC,Temp ;ножки порта C на вывод
out DDRC,Temp ;ножки порта C на вывод
out DDRC,Temp ;ножки порта C на вывод
;================ Инициализация начальных значений переменных =========
.equ sotni=100
.equ desyatki=10
.equ edinici=1
.equ bufer1=0
.equ temp0=0
;================ Инициализация таймера ТС0 ==========
BSET 7 ; Разрешение всех прерываний
ldi Temp4,1
out TIMSK,Temp4 ; разрешение прерывания от таймера ТС0
ldi Temp4 , 0x05
out TCCR0,Temp4 ; установка предделителя на 1/1024
; с этого момента таймер запущен
;========== Программа ================
;ldi counter_sec,227 ---> для чисел от нуля до 227 преобразование выполняется
;ldi counter_sec,235 --->для чисел от 228 до 255 не выполняется
MAIN_PROGRAM:
;******************************************** Выполнение двоично-десятичного преобразования **********************
mov bufer,counter_sec ;запись содержания регистра counter_sec в bufer
;========== Счетчик сотен ================
sotnya:
mov temp, bufer ;запись содержания регистра bufer в temp
subi temp,sotni ;вычитание сотни из temp
brmi M1 ;if флаг n=1(число отрицательное) then переход на метку М
subi bufer, sotni ;вычитание сотни из bufer
inc counter_sotn ;counter_sotn+1
rjmp sotnya
M1:
ldi Temp,0xFE
out PortA,Temp ;разрешение вывода(0) сотен
out portC,counter_sotn ;вывод сотен в portC
ldi Temp,0
mov counter_sotn,Temp ;отчистка счетчика сотен
;========== Счетчик десятков ================
desyatok:
mov temp, bufer ;запись содержания регистра bufer в temp
subi temp,desyatki ;вычитание десятка из temp
brmi M2 ;if флаг n=1(число отрицательное) then переход на метку М2
subi bufer, desyatki ;вычитание десятка из bufer
inc counter_des ;counter_des+1
rjmp desyatok
M2:
ldi Temp,0xFD
out PortA,Temp ;разрешение вывода(0) десятков
out portC,counter_des ;вывод десятков в portC
ldi Temp,0
mov counter_des,Temp ;отчистка счетчика десятков
;========== Счетчик единиц ================
edinica:
mov temp, bufer ;запись содержания регистра bufer в temp
subi temp,edinici ;вычитание единицы из temp
brmi M3 ;if флаг n=1(число отрицательное) then переход на метку М
subi bufer,edinici ;вычитание единицы из bufer
inc counter_ed ;counter_des+1
rjmp edinica
M3:
ldi Temp,0xFB
out PortA,Temp ;разрешение вывода(0) единиц
out portC,counter_ed ;вывод единиц в portC
ldi Temp,0
mov counter_ed,Temp ;отчистка счетчика единиц
rjmp MAIN_PROGRAM

