Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/45: Рейтинг темы: голосов - 45, средняя оценка - 4.93
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
1

Отладка программы Прямого и Обратного счета времени .

13.02.2014, 21:46. Просмотров 8239. Ответов 22
Метки нет (Все метки)

Доброго времени суток дорогие посетители форума .
Стараюсь написать программу которая должна считать время при удерживании кнопки , а при повторном удерживании кнопки она должна также считать время но уже и выводить ранее посчитанное , и.т.д.
Время считается ( или считается и выводится ) только при удерживании кнопки ( от нажатия до отпускания ) .
Программе также проверяет отпущена ли кнопка две секунды или нет. Т.е. если отпустить кнопку на 1 секунду , не более , а потом нажать , программа должна считать время дальше .Если же отпустить на две секунды и более программа должна остановиться ( ожидать нажатия ).
В программа использован массив в котором записаны числа от 99 до 0 ( Два семисегментных индикатора ). Записаны они примерно так :
.db 9 9 8 9 7 9 6 9 5 9 ... 0 9 ( 99 , 98 , 97 , 96 , 95 , 94 , ... , 90 )
...
.db 9 0 8 0 7 0 6 0 5 0 ... 0 0 ( 09 , 08 , 07 , 06 , 05 , 04 , ... , 00 )

Время считается выводиться так :
1. Считается время в секундах ;
2. Это время удваиваем ;
3. От максимального времени 198 ( 99 секунд ) отнимаем удвоенное время ;
4. От 198 отнимаем результат предыдущего пункта , записываем результат в Temp4 , с данного адреса массива будем выводить время .
Суть темы такова , МК считает время , выводит только первые два числа ( выводит правильно ) , а потом происходит неизвестно что .
Старался объяснить принцип работы программы , ниже привожу исходный код :

Код
.include "m8def.yms"

.def Temp        =R16          ; рабочая переменная
.def Temp1       =R17
.def Temp2       =R18
.def Temp3       =R19
.def Temp4       =R20
.def Temp5       =R21

.def Temp6       =R22
.def Temp7       =R23
.def Temp8       =R24
.def Temp9       =R25

.def Signal_Time =R26
.def Pouse_Time  =R27
.def Pouse       =R28
.def Sr_Segment  =R29

.cseg

.org 0
rjmp _Riset
.org $0006
rjmp  Timer1_Int

; ************************************************

_Riset:

LDI R16,Low(ROMEND)
OUT SPL,R16
LDI R16,High(ROMEND)
OUT SPH,R16

ldi Temp,0b11111111
out DDRD,Temp

Sig2:

ldi Temp,0b01111111
out DDRB,Temp
ldi Temp,0b10000000
out PORTB,Temp

Sig:

In Temp ,PinB
cpi Temp,0b00000000
brne Sig

Sig1:

Ldi Temp , high(31250)
Out OCR1AH , Temp
Ldi Temp , low(31250)
Out OCR1AL , Temp
Ldi Temp , 0b00000000
Out TCCR1A , Temp

Ldi Temp,0b00010000
out TIMSK,Temp
Ldi Temp,0b00000100          ; тактовый сигнал = CK/256
out TCCR1B,Temp

sei

Inf:rjmp Inf                 ; бесконечный цикл

; ************************************************

; ************************************************

Timer1_Int:

clr Temp
Out TCNT1H , Temp
Out TCNT1L , Temp

; ************************************************

; ************************************************

Pr_Schet:

In Temp ,PinB
cpi Temp,0b00000000
brne m2
m1: cpi Temp2 , 0
brne m13
m12:Inc Signal_Time
cpi Temp1 , 1
brne m50
rcall Obr_Schet
rjmp m51
m50:
Inc Sr_Segment
Out PortD , Sr_Segment
m51:
Ldi Temp2 , 1
Add Pouse_Time , Pouse
clr Pouse
reti
m13:Inc Signal_Time
cpi Temp1 , 1
brne m52
rcall Obr_Schet
rjmp m53
m52:
Inc Sr_Segment
Out PortD , Sr_Segment
m53:
reti

m2: Inc Pouse
cpi Temp1 , 1
brne m54
rcall Obr_Schet
rjmp m55
m54:
Inc Sr_Segment
Out PortD , Sr_Segment
m55:
cpi Pouse , 2
BRSH EndPr_Schet
Ldi Temp2 , 0
reti

EndPr_Schet:Add Signal_Time , Pouse_Time
Ldi Temp1 , 1
cli
clr Temp
Out TCCR1B , Temp

Ldi Sr_Segment , 0b01000000
Out PortD , Sr_Segment
;clr Temp4

Add Signal_Time , Signal_Time

Ldi Temp4 , 198                    ; 99 секунд - максимальное время
m3:cp Temp , Signal_Time
breq m4
yms Temp
dec Temp4
rjmp m3

m4:
clr Pouse_Time
clr Pouse
clr Signal_Time
clr Temp2

clr Temp5

;m4:mov Temp4 , Temp8
;clr Temp8

rjmp Sig2

; ************************************************

; ******************************

Obr_Schet:

cpi Temp4 , 200
brne ReadArray

;clr Temp4
Ldi Sr_Segment , 0b01000000
Out PortD , Sr_Segment

ret

ReadArray:
ldi ZH,High(MyArray*2)
ldi ZL,Low(MyArray*2)
ldi Temp3,0
add ZL,Temp4
adc ZH,Temp5
lpm
mov Temp,R0
out PortD,Temp
yms Temp4

ldi ZH,High(MyArray*2)
ldi ZL,Low(MyArray*2)
ldi Temp3,0
add ZL,Temp4
adc ZH,Temp5
lpm
mov Temp,R0
out PortB,Temp
yms Temp4

ret

; *****************************

; *************************************************************************************************************************

MyArray:

.db  0x6F, 0x6F ,0x7F, 0x6F ,0x07, 0x6F ,0x7D, 0x6F ,0x6D, 0x6F ,0x66, 0x6F ,0x4F, 0x6F ,0x5B, 0x6F ,0x06, 0x6F ,0x3F, 0x6F

.db  0x6F, 0x7F ,0x7F, 0x7F ,0x07, 0x7F ,0x7D, 0x7F ,0x6D, 0x7F ,0x66, 0x7F ,0x4F, 0x7F ,0x5B, 0x7F ,0x06, 0x7F ,0x3F, 0x7F

.db  0x6F, 0x07 ,0x7F, 0x07 ,0x07, 0x07 ,0x7D, 0x07 ,0x6D, 0x07 ,0x66, 0x07 ,0x4F, 0x07 ,0x5B, 0x07 ,0x06, 0x07 ,0x3F, 0x07

.db  0x6F, 0x7D ,0x7F, 0x7D ,0x07, 0x7D ,0x7D, 0x7D ,0x6D, 0x7D ,0x66, 0x7D ,0x4F, 0x7D ,0x5B, 0x7D ,0x06, 0x7D ,0x3F, 0x7D

.db  0x6F, 0x6D ,0x7F, 0x6D ,0x07, 0x6D ,0x7D, 0x6D ,0x6D, 0x6D ,0x66, 0x6D ,0x4F, 0x6D ,0x5B, 0x6D ,0x06, 0x6D ,0x3F, 0x6D

.db  0x6F, 0x66 ,0x7F, 0x66 ,0x07, 0x66 ,0x7D, 0x66 ,0x6D, 0x66 ,0x66, 0x66 ,0x4F, 0x66 ,0x5B, 0x66 ,0x06, 0x66 ,0x3F, 0x66

.db  0x6F, 0x4F ,0x7F, 0x4F ,0x07, 0x4F ,0x7D, 0x4F ,0x6D, 0x4F ,0x66, 0x4F ,0x4F, 0x4F ,0x5B, 0x4F ,0x06, 0x4F ,0x3F, 0x4F

.db  0x6F, 0x5B ,0x7F, 0x5B ,0x07, 0x5B ,0x7D, 0x5B ,0x6D, 0x5B ,0x66, 0x5B ,0x4F, 0x5B ,0x5B, 0x5B ,0x06, 0x5B ,0x3F, 0x5B

.db  0x6F, 0x06 ,0x7F, 0x06 ,0x07, 0x06 ,0x7D, 0x06 ,0x6D, 0x06 ,0x66, 0x06 ,0x4F, 0x06 ,0x5B, 0x06 ,0x06, 0x06 ,0x3F, 0x06

.db  0x6F, 0x00 ,0x7F, 0x00 ,0x07, 0x00 ,0x7D, 0x00 ,0x6D, 0x00 ,0x66, 0x00 ,0x4F, 0x00 ,0x5B, 0x00 ,0x06, 0x00 ,0x00, 0x00

; *************************************************************************************************************************
Заранее спасибо .
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 21:46
Ответы с готовыми решениями:

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

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

Реализация прямого и обратного быстрого преобразования Фурье
Добрый день. Есть задание - Реализация простого и обратного быстрого преобразования Фурье (с...

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

Нужна рабочая функция быстрого/прямого и обратного преобразования Фурье
Нужна рабочая функция быстрого/прямого и обратного преобразования Фурье. В гугле много всего,...

22
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
14.02.2014, 02:23 2
выводит только первые два числа ( выводит правильно )
Timer1_Int:
............................
m55:
cpi Pouse , 2
BRSH EndPr_Schet
Ldi Temp2 , 0
reti
Код
EndPr_Schet:
Add Signal_Time , Pouse_Time
Ldi Temp1 , 1
cli...
Странно , что он выводит первые два числа
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
15.02.2014, 15:41 3
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
выводит только первые два числа ( выводит правильно )
Timer1_Int:
............................
m55:
cpi Pouse , 2
BRSH EndPr_Schet
Ldi Temp2 , 0
reti
Код
EndPr_Schet:
Add Signal_Time , Pouse_Time
Ldi Temp1 , 1
cli...
Странно , что он выводит первые два числа

Спасибо большое за ответ . Ошибка заключалась в том что " нажатие кнопки не выполнялось " в обработчике прерывания , поэтому выполнялась метка m2 . Программа заработала при добавлении инициализиции порта B ( настройка порта B на ввод , подтягивающий резистор ) .

Pr_Schet:

ldi Temp,0b01111111
out DDRB,Temp
ldi Temp,0b10000000
out PORTB,Temp

In Temp ,PinB
cpi Temp,0b00000000
brne m2
m1: cpi Temp2 , 0
brne m13
...

Также решил считать время небольшими отрезками времени , шагом 0.01 секунды . Время решил записывать в 16-разрядный регистр ( регистровую пару ) , ну а потом переводить в секунды .
Вопрос возник для начала в переводе в секунды , т.к. придется делить 16-разрядное значение на 100 .
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
15.02.2014, 20:51 4
Цитата Сообщение от shirysom
решил считать время небольшими отрезками времени , шагом 0.01 секунды
Слишком оптимистично для схемы с кнопкой, так как переходные процессы ("дребезг") при нажатии и отпускании кнопки длятся дольше, чем 0.01 секунды.
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
15.02.2014, 21:04 5
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
решил считать время небольшими отрезками времени , шагом 0.01 секунды
Слишком оптимистично для схемы с кнопкой, так как переходные процессы ("дребезг") при нажатии и отпускании кнопки длятся дольше, чем 0.01 секунды.

В схеме кнопка не будет реализована , программа должна работать при поступлении сигнала . Кнопка только для примитивного моделирования .
Пока все вопросы встали на второй план , необходимо разделить 16-разрядное значение на 8 разрядное , не могу реализовать данную операцию .
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
15.02.2014, 21:54 6
Цитата Сообщение от shirysom
необходимо разделить 16-разрядное значение на 8 разрядное , не могу реализовать данную операцию .
Делается циклическим вычитанием делителя из делимого. При каждом проходе инкрементируется счётчик - в конце цикла его значение будет равно результату - частному от деления.
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
16.02.2014, 13:38 7
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
необходимо разделить 16-разрядное значение на 8 разрядное , не могу реализовать данную операцию .
Делается циклическим вычитанием делителя из делимого. При каждом проходе инкрементируется счётчик - в конце цикла его значение будет равно результату - частному от деления.

т.е. нужно вычитать делитель из младшего байта делимого , а старший байт делимого нужно при этом вычесть с переносом ?
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
16.02.2014, 14:19 8
Цитата Сообщение от shirysom
т.е. нужно вычитать делитель из младшего байта делимого , а старший байт делимого нужно при этом вычесть с переносом ?
Точно! SUB для вычитания младших байтов, потом SBCI для старших (у восьмиразрядного операнда в качестве старшего байта выступает ноль).

P.S. Возьмите на сайте Atmel старенький апноут про простые арифметические алгоритмы на ассемблере AVR.
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
16.02.2014, 15:01 9
И вот ещё полезный совет. Не знаю, почемУ на Си не хотите писать свою программу (может, "религиозное" убеждение или self-education такой), но компилятор Си можно использовать необычным образом... для ответа на все Ваши вопросы по асм-алгоритмам.

Попробуйте:
<ul><li>Скачиваете бесплатную версию CodeVisionAVR, она устанавливается в несколько кликов и сразу готова к работе.</li><li>Набираете минимальный код для выяснения своего вопроса, например про деление 16-тибитного на 8-мибитное:</li></ul>
Код
#include <mega8.h>

void main()
{
unsykned int my16bit = 0x1234;
unsykned char my8bit = 0x56;
unsykned int result = my16bit / my8bit;
}
<ul><li>Нажимаете кнопку "Build" (оптимизацию компилятору лучше отключить, чтобы ассемблер получился совсем чистенький, учебный).</li><li>Открываете сгенерированный *.asm или *.lst и смоТрите, кАк надо _это_ на ассемблере правильно писать.</li></ul>
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
18.02.2014, 20:07 10
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
т.е. нужно вычитать делитель из младшего байта делимого , а старший байт делимого нужно при этом вычесть с переносом ?
Точно! SUB для вычитания младших байтов, потом SBCI для старших (у восьмиразрядного операнда в качестве старшего байта выступает ноль).

ldi ZH,High(MyArray*2)
ldi ZL,Low(MyArray*2)
ldi Temp3,0
add ZL,Temp4
adc ZH,Temp3
lpm
mov Temp,R0
out PortB,Temp

т.к. Temp3=0 , имеет ли смымл выделенная команда?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
18.02.2014, 20:20 11
Цитата Сообщение от shirysom
ldi ZH,High(MyArray*2)
ldi ZL,Low(MyArray*2)
ldi Temp3,0
add ZL,Temp4
adc ZH,Temp3
lpm
mov Temp,R0
out PortB,Temp

т.к. Temp3=0 , имеет ли смымл выделенная команда?
Код
clr ZH
mov ZL, Temp4
subi ZL, LOW (-(MyArray*2))
sbci ZH, HIGH (-(MyArray*2))
lpm Temp, Z
out PortX,Temp
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
18.02.2014, 21:57 12
Цитата Сообщение от dymyurk1978
Цитата Сообщение от shirysom
ldi ZH,High(MyArray*2)
ldi ZL,Low(MyArray*2)
ldi Temp3,0
add ZL,Temp4
adc ZH,Temp3
lpm
mov Temp,R0
out PortB,Temp

т.к. Temp3=0 , имеет ли смымл выделенная команда?
Код
clr ZH
mov ZL, Temp4
subi ZL, LOW (-(MyArray*2))
sbci ZH, HIGH (-(MyArray*2))
lpm Temp, Z
out PortX,Temp
Т.е. мы прибавляем значение из 8-разрядного регистра Temp4 в 16-разрядный регистр , и поэтому Temp4 представляем как 16-разрядный , старший байт которого равен 0.
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
18.02.2014, 22:11 13
Стараюсь считать время по 0.01 секунды , все считается в Y .
Вот что только вышло :

Код
...
Ldi YH , 0
Ldi YL , 0

Ldi XH , 0
Ldi XL , 1
...
Add YL , XL      ; прибавляю 1 каждые 0.01с
adc YH , XH
...
clr Temp
Add YL , Pouse  ; прибавляю также значение
adc YH , Temp   ; от 0 до 100 ( регистр Pouse )
...

m955:                                ; перевожу время в секунды
sub YL , Temp5          ; YL - 100
sbci YH , 0
yms Signal_Time          ; получаю секунды
cpi YH , 0                   ; проверяю Y на 0 для завершения
brne m955
cpi Yl , 150                 ; проверяю Y на 0 для завершения
brlo m977
rjmp m955

m977:
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
18.02.2014, 22:14 14
Цитата Сообщение от shirysom
Вот что только вышло
Перед циклом деления надо ещё обнулять Signal_Timi.

Код
  cpi Yl , 150                 ; проверяю Y на 0 для завершения
brlo m977
- а это что за жёсткий hardsodymk? :-(
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
18.02.2014, 22:22 15
Цитата Сообщение от OtyxPM
Перед циклом деления надо ещё обнулять Signal_Timi.
А так в принципе иду в правильном направлении ?
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
18.02.2014, 22:36 16
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
Вот что только вышло
Перед циклом деления надо ещё обнулять Signal_Timi.

Код
  cpi Yl , 150                 ; проверяю Y на 0 для завершения
brlo m977
- а это что за жёсткий hardsodymk? :-(

150 взял произвольно . Т.е. когда в регистре осталось 150 или меньше - выход из цикла .
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
18.02.2014, 23:14 17
Цитата Сообщение от shirysom
А так в принципе иду в правильном направлении ?
В принципе - да.
Но с этим "допустимым остатком" в 150 единиц - это грубый некрасивый хак, причём он Вам гарантирует баги в будущем. :-( Как говорится, опомнитесь, пока не поздно :-)

Прочитайте в Atmelовский апноут по арифметике, кАк надо делить. Подсказка: у AVR CPU много флагов состояния, соответственно много команд проверки результата вычитания (или сложения - можно и так делать), есть знаковые и беззнаковые операции.

Способ с "подсматриванием" ASM-кода в CVAVR тоже доступен и эффективен. Вы получаете правильный ассемблерный код нужного алгоритма (деления или любого другого).
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
24.02.2014, 19:39 18
Цитата Сообщение от OtyxPM
В принципе - да.
Старался написать программу , осталось реализовать всего лишь одну задачу ( сравнивать время предыдущего сигнала с последующим ) . Сегмент кода выделенный красным цветом это подпрограмма сравнения . Без нее программа работает . С подпрограммой сравнения считает и выводит первый раз правильно , ну а потом индикаторы показывают неизвестно что ( Temp4 имеет значение выше 99 , от 99 до 255 , по программе такого не может должно быть , да и не может ), за вывод символов отвечает регистр Temp4 ( в регистре задается адрес ячейки памяти т.е. элемента массива ) .
В подпрограмме сравнения Temp4 не затрагивается , не могу найти ошибку .

.include "m8def.yms"
.def Temp =R16
.def Temp1 =R17
.def Temp2 =R18
.def Temp3 =R19
.def Temp4 =R20
.def Signal_Time =R21
.def Pouse =R22
.def Sr_Segment =R23
.def Temp5 =R24
.def Temp6 =R25
.def Temp7 =R26
.def Temp8 =R27
.cseg
.org 0
rjmp _Riset
.org $0006
rjmp Timer1_Int
; ************************************************
_Riset:
LDI R16,Low(ROMEND)
OUT SPL,R16
LDI R16,High(ROMEND)
OUT SPH,R16
clr Temp1
clr Temp2
clr Temp3
clr Temp4
clr Temp5
clr Temp6
clr Temp7
clr Temp8
clr Signal_Time
clr Pouse
clr Sr_Segment

Ldi XH , 0
Ldi XL , 1

Ldi Temp5 , 100

ldi Temp,0b11111111
out DDRD,Temp

Sig2:

ldi Temp,0b01111111
out DDRB,Temp
ldi Temp,0b10000000
out PORTB,Temp

Sig:

In Temp ,PinB
cpi Temp,0b00000000
brne Sig

Sig1:

Ldi Temp , high(625)
Out OCR1AH , Temp
Ldi Temp , low(625)
Out OCR1AL , Temp
Ldi Temp , 0b00000000
Out TCCR1A , Temp

Ldi Temp,0b00010000
out TIMSK,Temp
Ldi Temp,0b00000011
out TCCR1B,Temp
sei

Inf:rjmp Inf

; ************************************************
; ************************************************

Timer1_Int:

clr Temp
Out TCNT1H , Temp
Out TCNT1L , Temp

; ************************************************
; ************************************************

Pr_Schet:

sbic PINB, 7
rjmp m2
rjmp m1

m1:

cpi Temp2 , 0
brne m13

m12:

Add YL , XL
adc YH , XH
Ldi Temp2 , 1
clr Temp
Add YL , Pouse
adc YH , Temp
clr Pouse
cpi Temp1 , 0
brne O_S
Inc Sr_Segment
Out PortD , Sr_Segment
reti
O_S:
rcall Obr_Schet
reti

m13:

Add YL , XL
adc YH , XH
cpi Temp1 , 0
brne O_S1
Inc Sr_Segment
Out PortD , Sr_Segment
reti
O_S1:
rcall Obr_Schet
reti

m2:

Inc Pouse
Ldi Temp2 , 0
cpi Pouse , 250
brsh EndPr_Schet
cpi Temp1 , 0
brne O_S2
Inc Sr_Segment
Out PortD , Sr_Segment
reti
O_S2:
rcall Obr_Schet
reti

EndPr_Schet:

clr Temp4
cli
clr Temp
Out TCCR1B , Temp
Ldi Sr_Segment , 0b01001001
Out PortD , Sr_Segment

clr Signal_Time
m955:
sub YL , Temp5
sbci YH , 0
yms Signal_Time
cpi YH , 0
brne m955
cpi Yl , 99
brlo m977
rjmp m955

m977:

clr YH
clr YL
Ldi Temp4 , 99
sub Temp4 , Signal_Time ; 99 - Signal_Time
clr Pouse

; _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cpi Temp1 , 0
brne m550
clr Temp8
Ldi Temp1 , 1
Add Temp8 , Temp4
rjmp Sig2

m550:
cp Temp4 , Temp8
brne m501
rjmp Sig2

m501:

Ldi Temp1 , 0
rjmp Sig2
; _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

rjmp Sig2

; ************************************************

; ******************************

Obr_Schet:

Inc Temp6
cpi Temp6 , 100
breq m700
ret

m700:

clr Temp6

cpi Temp4 , 99
brne ReadArray

Ldi Sr_Segment , 0b01000000
Out PortD , Sr_Segment

ret

ReadArray:

ldi ZH,High(MyArrayMl*2)
ldi ZL,Low(MyArrayMl*2)
ldi Temp,0
add ZL,Temp4
adc ZH,Temp
lpm
mov Temp,R0
out PortD,Temp

ldi ZH,High(MyArraySt*2)
ldi ZL,Low(MyArraySt*2)
ldi Temp,0
add ZL,Temp4
adc ZH,Temp
lpm
mov Temp,R0
out PortB,Temp

yms Temp4

ret

; *****************************

; ***********************************************************************

MyArraySt:

.db 0xEF , 0xEF , 0xEF , 0xEF , 0xEF , 0xEF , 0xEF , 0xEF , 0xEF , 0xEF

.db 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF

.db 0x87 , 0x87 , 0x87 , 0x87 , 0x87 , 0x87 , 0x87 , 0x87 , 0x87 , 0x87

.db 0xFD , 0xFD , 0xFD , 0xFD , 0xFD , 0xFD , 0xFD , 0xFD , 0xFD , 0xFD

.db 0xID , 0xID , 0xID , 0xID , 0xID , 0xID , 0xID , 0xID , 0xID , 0xID

.db 0xE6 , 0xE6 , 0xE6 , 0xE6 , 0xE6 , 0xE6 , 0xE6 , 0xE6 , 0xE6 , 0xE6

.db 0xCF , 0xCF , 0xCF , 0xCF , 0xCF , 0xCF , 0xCF , 0xCF , 0xCF , 0xCF

.db 0xDB , 0xDB , 0xDB , 0xDB , 0xDB , 0xDB , 0xDB , 0xDB , 0xDB , 0xDB

.db 0x86 , 0x86 , 0x86 , 0x86 , 0x86 , 0x86 , 0x86 , 0x86 , 0x86 , 0x86

.db 0x80 , 0x80 , 0x80 , 0x80 , 0x80 , 0x80 , 0x80 , 0x80 , 0x80 , 0x80

; ***********************************************************************

; ***********************************************************************

MyArrayMl:

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

.db 0xEF , 0xFF , 0x87 , 0xFD , 0xID , 0xE6 , 0xCF , 0xDB , 0x86 , 0xBF

; ***********************************************************************
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
24.02.2014, 20:02 19
У вас в прерывании нет сохранения SREG.
Вар. 1:
Код
push r16
in r16, SREG
push r16
......
......
......
pop r16
out SREG, r16
pop r16
reti
Вар. 2:
Код
.def   RSREG = r3

in RSREG, SREG
......
......
......
out SREG, RSREG
reti
Также у вас нет сохранения задействованных регистров в прерывании.
Все то же:
Вар. 1:
Код
push r16
in r16, SREG
push r16
push r19
push r20
......
......
......
pop r19
pop r20
pop r16
out SREG, r16
pop r16
reti
Вар. 2:
Код
.def   RSREG = r3

in RSREG, SREG
push r19
push r20
......
......
......
pop r19
pop r20
out SREG, RSREG
reti
0
shirysom
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
24.02.2014, 20:17 20
Цитата Сообщение от dymyurk1978
У вас в прерывании нет сохранения SREG.
Вар. 1:
Код:
push r16
in r16, SREG
push r16
......
......
......
pop r16
out SREG, r16
pop r16
reti

Странно , поменял регистр Temp8 на Temp3 - заработало как задумано , но радости пока нет т.к. не знаю в чем причина .
Насколько я понял у меня в программе нет сохранения , т.е. у меня не сохраняются флажки и значения регистров ?
Спасибо огромное за ответ .
0
24.02.2014, 20:17
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2014, 20:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Таймер счета времени нахождения в форме
Здравствуйте, необходимо разместить в форме таймер, который будет считать время, которое открыта...

таймер обратного времени
Такая ситуация, нужен на сайте таймер, который бы отсчитывал определенное количество времени до 0...

Таймер обратного времени
Добрый день! Есть скрипт редиректа с таймером обратного времени. В скрипте задаешь время, и он при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.