Хм, посмотрел...
А зачем ты заменил:
.include "2313def.inc"
на
.include file "C:\AVR\AvrAssembler2\Appnotes\tn2313def.inc"
???
2313def.inc стандартный файл, зачем его менять на экзотику? Как ты понимаешь у меня по твоему пути нет такого файла, соотв. студия выдает ошибку при компиляции. Я поменял обратно...
А зачем ты дал русское название своей программе? Это плохой тон, в мире люди плохо себе представляют, что такое "русский". Соотв. студия отказывается его компилить. Переименовал в impulse.asm
Ошибка на ссылку:
.include file "C:\AVR\WH4\hd44780.asm"
закомментировал...
Соотв. появились ошибки на "rcall LCD_WriteCommand" и.т.д. Закомментировал.
Зачем ты их вообще сейчас включаешь, если до вывода на индикатор как до луны пешком?
Начало компилиться, теперь появились варнинги:
- Код: Выделить всё • Развернуть
C:\avr\test\impulse.asm(23): warning: Register r11 already defined by the .DEF directive
C:\avr\test\impulse.asm(29): warning: Register r16 already defined by the .DEF directive
Так, становится скучновато. Ладно, разберемся потом с этим. Запускаем дебагер, жмем f11
Доходим до основного цикла "Inf". Йо майо, зачем ты опять засунул разрешение глобального прерывания в основной цикл? Ты когда ходишь по коридору туда сюда, жмешь выключатель чтоб включить свет, даже когда он горит? Или делаешь это один раз? Убрал sei из цикла.
Так, почему идет опрос флагов, которые не инициировались раньше? "sbrc flags, EventForward ". Почему ты убрал "clr flags" в инициализации ???
Куда делось опять форматирование программы? Почему команды начинаются с начала строки? Почитай это:
http://kazus.ru/forums/showpost.php?p=5 ... ostcount=4Взял тута:
http://kazus.ru/forums/showthread.php?p=576123Пожалей меня и нас
Вот как должны выглядеть программы:
http://www.electroclub.fatal.ru/RusAVR/ ... CDapp2.htmhttp://caxapa.ru/49289.htmlТы дебагером пользуешься?
Ладно, мы зациклены в основном цикле "inf", в котором ничего не происходит. Давай поставим курсор на "rjmp Forward" и правой кнопкой мыши выберем "set next Statement". Жмем f11, перешли на "Forward:" . Тут делается "inc temp1", это твой двоичный счетчик, который, кста, нигде не инициирован, т.е. там мусор от использования этого регистра для настройки портов. Ладно, он инкрементировался, у меня он стал 0xC1 (R19). Ок, давай посмотрим как его будет преобразовывать bin2ASCII16 в ascii код. bin2ASCII16 пытается преобразовать двоичный код в регистрах fASCIIL,fASCIIH, которые дефайном сделаны r11,r12. A твой счетчик в temp1, который в R19. С чего он должен правильно считать???
Так, пойду покурю, т.е. я не курю, но теперь курю
Добавлено спустя 51 минуту 18 секунд:Курнул, ща пойдет лучше
Делаем ресет в дебагере. Тактика: попробуем проверить работоспособность bin2ASCII16, мы знаем, что двоичный код должен быть в fASCIIL,fASCIIH (r11,r12). При подходе к этой процедуре, засунем в эти регистры ff ff , это 0xffff - в десятичном виде это 65535.
Поехали...
Ладно, мы зациклены в основном цикле "inf", в котором ничего не происходит. Давай поставим курсор на "rjmp Forward" и правой кнопкой мыши выберем "set next Statement". Жмем f11, перешли на "Forward:"
Попадаем в bin2ASCII16. В регистры r11 и r12 забиваем "ff"
Все пока хорошо, bin2ASCII_digit_loop вычитает из нашего 0xffff число 10000, пока не произойдет переполнение. Колич. вычетов подсчитывается в cnt16a, это и будет наше десятичное число пятого знака "65535". Йес, cnt16a (r16) насчитал "6" и вывалился из цикла. Опс, пошли какие-то:
- Код: Выделить всё • Развернуть
ldi r16,0x01 ;Команда очистки дисплея
Ну йо майо, там наш "6" многострадальный был. Стоп дебагер. Удаляем весь бред до "ret". Компилим. Доходим до этого места. Во, сбросим "Cycle counter", посмотрим сколько циклов занимает преобразование.
Поехали, ура, преобразовалась одна цифра "6", прошло 49 тактов, цифра записалась в:
- Код: Выделить всё • Развернуть
mov tASCII4, cnt16a
Так, мы знаем что теперь все работает, чтоб не жамкать пошагово f11, поставим точку останова на ret в bin2ASCII_digit_loop. И будем запускать отладку f5, в нужном месте прога остановится и мы будем видеть как преобразовывается число.
Опс, получили 4-й знак и он = 5
- Код: Выделить всё • Развернуть
mov tASCII3, cnt16a
Опс, получили 3-й знак и он = 5
- Код: Выделить всё • Развернуть
mov tASCII2, cnt16a
Опс, получили 2-й знак и он = 3
, и почему-то вывалились из bin2ASCII16, полученное число осталось в cnt16a, а остаток единиц "5" остался в fASCIIL, ок, будем знать.
Итог, число 0xffff преобразовалось в 65535 (десятичное) и лежит в tASCII4,tASCII3,tASCII2,cnt16a,fASCIIL. Заняло 162 такта. Все работает.
Сложно? Кассандра? Ушел курить