Здравствуйте.
Скажите пожалуйста почему так происходит и как решить?
ниже выделено другим цветом
В результате динамической индикации на индикаторе отображаются числа от 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
динамическая индикация(двоично-десятичное преобразование)
- Реклама
Re: динамическая индикация(двоично-десятичное преобразование
Дело в том, что AVR считает 7-й бит знаковым, и если мы сделаем :
LDI r16,255
TST r16 , то установится бит N ( отрицательное число ) . Ему и невдомек, что ты работаешь с байтом беззнаково.
Я бы сделал так
_100: CPI BUFER,100
BRCS M1
SUBI BUFER,100
INC DEC_COUNT
RJMP _100
M1:
PS Если хочешь получить точный ответ, конкретизируй вопрос. Ошибка в подпрограмме преобразования - при чем здесь динамическая индикация? Правильно преобразованное число ты пото'м хоть индицируй, хоть на хлеб намазывай. Поэтому по пустяковому вопросу не надо выкладывать таких портянок.
LDI r16,255
TST r16 , то установится бит N ( отрицательное число ) . Ему и невдомек, что ты работаешь с байтом беззнаково.
Я бы сделал так
_100: CPI BUFER,100
BRCS M1
SUBI BUFER,100
INC DEC_COUNT
RJMP _100
M1:
PS Если хочешь получить точный ответ, конкретизируй вопрос. Ошибка в подпрограмме преобразования - при чем здесь динамическая индикация? Правильно преобразованное число ты пото'м хоть индицируй, хоть на хлеб намазывай. Поэтому по пустяковому вопросу не надо выкладывать таких портянок.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: динамическая индикация(двоично-десятичное преобразование
kostyali писал(а):
Код: Выделить всё
sotnya:
mov temp, bufer ;запись содержания регистра bufer в temp
subi temp,sotni ;вычитание сотни из temp
brmi M1 ;if флаг n=1(число отрицательное) then переход на метку М Код: Выделить всё
sbrc temp,7
rjmp minus_val
; число положительно
........
minus_val:
;число отрицательно
.........
Re: динамическая индикация(двоично-десятичное преобразование
Виноват, Jack_A уже ответил. Удалил.
Re: динамическая индикация(двоично-десятичное преобразование
Работает! Благодарю за помощь ChipKiller и Jack_A.
- Реклама

