динамическая индикация(двоично-десятичное преобразование)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
kostyali
Родился
Сообщения: 6
Зарегистрирован: Пт мар 25, 2011 10:14:07

динамическая индикация(двоично-десятичное преобразование)

Сообщение kostyali »

Здравствуйте.

Скажите пожалуйста почему так происходит и как решить?
ниже выделено другим цветом

В результате динамической индикации на индикаторе отображаются числа от 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
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6320
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: динамическая индикация(двоично-десятичное преобразование

Сообщение Jack_A »

Дело в том, что AVR считает 7-й бит знаковым, и если мы сделаем :
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: динамическая индикация(двоично-десятичное преобразование

Сообщение ChipKiller »

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:
;число отрицательно
.........
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: динамическая индикация(двоично-десятичное преобразование

Сообщение akl »

Виноват, Jack_A уже ответил. Удалил.
Реклама
Эиком - электронные компоненты и радиодетали
kostyali
Родился
Сообщения: 6
Зарегистрирован: Пт мар 25, 2011 10:14:07

Re: динамическая индикация(двоично-десятичное преобразование

Сообщение kostyali »

Работает! Благодарю за помощь ChipKiller и Jack_A.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»