Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Дайте совет , как правильно дописать подпрограмму
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
pavel-pervomaysk
Всем привет !
Возникла у меня проблема в том что никак не могу выйти из данной подпрограммы правильно 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

авр студио ругается на данные команды , подскажите как правильно сделать , может нужно использовать пару старших регистров ?
adc
Цитата(Павлик @ 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 :-)
pavel-pervomaysk
спасибо за подсказку , все работает , в данном случае мы проверяем на 0 регистр через команду BRNE
кстати ваш вариант чут ли не в 3 раза меньше чем мой a14.gif
А извените за наглость , как же все таки выходить или вызывать подпрограммы при этом сравнивая 2 числа ?
К примеру нам надо сравнить 2 числа 0х35 (образно)

Забыл уточнить , проэкт на ATmega32 про стэк меня тут раньше предупреждали , там все ок ! Регистры начинаются от 16 и выше rolleyes.gif
adc
Цитата(Павлик @ 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
pavel-pervomaysk
adc я выбрал представленый вами второй вариант beer.gif спасибо !
темку пока не закрываю , писать мне еще долго wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.