реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Дайте совет , как правильно дописать подпрограмму, нужно при достижении числа выйти из подрограммы
pavel-pervomaysk
сообщение Jan 24 2008, 18:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



Всем привет !
Возникла у меня проблема в том что никак не могу выйти из данной подпрограммы правильно sad.gif
вот собственно сама подпрограмма

mode_0_255: // выводит в порт Д значения от 00 до FF
ser tmp2
ldi tmp,$01
rcall mod_22

mod_234:

inc tmp // tmp + 1
rcall mod_22 //
rjmp mod_234 //

mod_22:

out portd,tmp // вывести значения регистра в порт
rcall wait
ret

что нужно ?
При достижении числа 0xFF в регистре после ее вывода в порт выйти из подпрограммы в основную
пробовал так :

mod_22:

out portd,tmp // вывести значения регистра в порт
rcall wait
cpc tmp,tmp2 // именно это не работает
brsh main // и это тоже
ret

авр студио ругается на данные команды , подскажите как правильно сделать , может нужно использовать пару старших регистров ?
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 24 2008, 20:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Цитата(Павлик @ Jan 24 2008, 21:30) *
Всем привет !
Возникла у меня проблема в том что никак не могу выйти ......
....
авр студио ругается на данные команды , подскажите как правильно сделать , может нужно использовать пару старших регистров ?

Сделайте так:
Код
//ВАЖНО регистр tmp должен быть определен r16 и выше для команды "out   portd,tmp "!!!
mode_0_255:      // выводит в порт Д значения от 00 до FF
  clr   tmp
m_01:
  rcall wait //здесь не использовать регистр tmp!!! (или сохранять его где нибудь)
  out   portd,tmp
  inc tmp
  brne m_01//равнен ли tmp нулю? если нет то переход на m_01
  ret

Удачи!

зы: да вот еще добавлю....во избежания граблей..
у атмеги8 стекпоинт уже двухбайтный, так что инициализировать надо и ldi temp,LOW(RAMEND) ; Init Stack Pointer
out spl,temp и ldi temp,high(RAMEND) ; Init Stack Pointer
out sph,temp :-)


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Jan 25 2008, 05:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



спасибо за подсказку , все работает , в данном случае мы проверяем на 0 регистр через команду BRNE
кстати ваш вариант чут ли не в 3 раза меньше чем мой a14.gif
А извените за наглость , как же все таки выходить или вызывать подпрограммы при этом сравнивая 2 числа ?
К примеру нам надо сравнить 2 числа 0х35 (образно)

Забыл уточнить , проэкт на ATmega32 про стэк меня тут раньше предупреждали , там все ок ! Регистры начинаются от 16 и выше rolleyes.gif

Сообщение отредактировал Павлик - Jan 25 2008, 05:08
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 25 2008, 06:10
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Цитата(Павлик @ Jan 25 2008, 08:07) *
А извените за наглость , как же все таки выходить или вызывать подпрограммы при этом сравнивая 2 числа ?
К примеру нам надо сравнить 2 числа 0х35 (образно)

Непонятная фраза "сравнить два числа 0х35 " smile.gif
Как я понимаю по равенству с константой выйти из цикла. извольте:
00 до 0x34
Код
mode_0_255:      // выводит в порт Д значения от 00 до 0x34
clr  tmp
ldi  tmp2,0x35 //загрузим константу в регистр
m_01:
  rcall wait //здесь не использовать регистр tmp  и tmp2!!! (или сохранять его где нибудь)
  out   portd,tmp
  inc tmp
  cp tmp,tmp2
  brlo m_01//меньше ли tmp tmp2? если да то переход на m_01
  ret

или так(00 до 0x34):
Код
mode_0_255:      // выводит в порт Д значения от 00 до 0x34
clr  tmp
m_01:
  rcall wait //здесь не использовать регистр tmp  и tmp2!!! (или сохранять его где нибудь)
  out   portd,tmp
  inc tmp
  cpi tmp,0x35
  brlo m_01//меньше ли tmp 0х35? если да то переход на m_01
  ret

а можно так(00 до 0x35):
Код
mode_0_255:      // выводит в порт Д значения от 00 до 0x35
  clr  tmp
  out   portd,tmp//это для начального значения tmp (до инкримента)
m_01:
  rcall wait //здесь не использовать регистр tmp  и tmp2!!! (или сохранять его где нибудь)
  inc tmp
  cpi tmp,0x35
  out   portd,tmp
  brlo m_01//меньше ли tmp 0х35? если да то переход на m_01
  ret

или так(00 до 0x35):
Код
mode_0_255:      // выводит в порт Д значения от 00 до 0x35
clr  tmp
ldi  tmp2,(0x35+1) //загрузим константу в регистр
m_01:
  rcall wait //здесь не использовать регистр tmp  и tmp2!!! (или сохранять его где нибудь)
  out   portd,tmp
  inc tmp
  cp tmp,tmp2
  brlo m_01//меньше ли tmp tmp2(0x36)? если да то переход на m_01
  ret


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Jan 25 2008, 14:26
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



adc я выбрал представленый вами второй вариант beer.gif спасибо !
темку пока не закрываю , писать мне еще долго wink.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016