|
ATmega8 адресс метки |
|
|
|
Jun 20 2011, 17:09
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Цитата(Палыч @ Jun 20 2011, 19:41)  Огласите значение указателя стека после его инициализации в начале программы и перед выполнением команды RET. Вначале: SP = 0x45F Перед RET: SP = 0x45D После RET: SP = 0x45F
|
|
|
|
|
Jun 20 2011, 19:08
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Цитата(Палыч @ Jun 20 2011, 21:59)  И - что? При выполнении RET выдаёт сообщение?
Стало как-то интересно... Поставил Studio, скопировал Вашу программу, оттранслировал, зашёл в режим отладки, дошагал до RET, получил те же значения указателя стека, но сообщение - нет!
Стесняюсь спросить: у Вас в отладчике какой Device выбран? Странно!!! Все перепроверил(может всякое быть) результат тодже  Может Студия глючная?? У меня. AVR Studio 4.12.498 Service Pack 4 GUI Version 4, 12, 0, 491 AVR Simulator 1, 0, 1, 8
|
|
|
|
|
Jun 20 2011, 19:41
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Цитата(Палыч @ Jun 20 2011, 22:34)  Ну, не самая последняя... Я вообще для эксперимента какую-то древность поставил. А, Вы точно указали симулятору в качестве Device значение ATmega8? Случайно что-то там типа mega8535 не указали? Не!!! Точна 8-мая!!!! Спецом проект пересоздал!
|
|
|
|
|
Jun 21 2011, 04:26
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(ae_ @ Jun 21 2011, 02:41)  подпрограммы e00, e01, e11, e10 абсолютно одинаковые Они выглядят такими, но отличаются командами SBRS/SBRC. Подозреваю, что ТС во время отладки изменяет регистры, поскольку, приведенная программа - всего лишь заготовка, неимеющая кода считывания состояния энкодера. При этом нарушается "нормальная" последовательность выполнения кода, и программа уходит в бесконечный цикл...
|
|
|
|
|
Jun 21 2011, 09:13
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Внес изменения. Полностью не исключает зависание в цикле, но на пошаговом должно быть видно не правильные переходы. Код ldi r16,high(RAMEND) out SPH,r16 ldi r16,low(RAMEND) out SPL,r16
ldi ZH,0 ldi ZL,0
ldi r18,255 s: brtc en icall rjmp s
en:sbr r18,252
|
|
|
|
|
Jun 21 2011, 11:55
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Поставил студию.... AVR Studio 4.18.684 GUI Version 4, 18, 0, 670 AVR Simulator 1, 0, 2, 1 Итог!!!!! Извините что вам и себе мозги парил и время отнимал! ВСЕ ЗАРАБОТАЛО!!!!! ВСЕМ СПАСИБО!!!!
|
|
|
|
|
Jun 22 2011, 11:56
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Shadovv13 @ Jun 21 2011, 20:55)  ВСЕ ЗАРАБОТАЛО!!!!! Прошу прощения, проглядел SBRS/SBRC в подпрограммах e00-e11. В Вашей программе обработка состояний энкодера выполняется за два хода, первый-второй. Номер хода(условно) хранится во флаге Т, а состояние первого хода сохраняется в виде адреса подпрограммы в ZH:ZL. Энкодер для МК - очень медленное устройство, за время между изменениями состояния энкодера могут выполниться миллионы инструкций. Неужели ZH:ZL нигде более не используется в Вашей программе? Если используется, то приходится многократно сохранять/восстанавливать два регистра. Кстати, если забыли сохранить Z, то это причина переполнения стека, т.к. ICALL выполняется неизвестно куда. Зачем? Ведь можно хранить всего лишь 2 бита - предыдущее состояние энкодера, не используя уникальную пару ZH:ZL. И зачем обрабатывать изменения энкодера за два хода? ведь любой из двух сигналов с него может перескочить 1/0 или 0/1 и вернуться обратно (от помехи или если энкодер находится на границе переключения). Не нужно считать первый-второй, можно каждое изменение считать сразу "вторым ходом". Далее, считываем текущее значение, сопоставляем его с предыдущим, решаем что нужно сделать: +1,-1, или ничего. Затем текущее состояние энкодера переместить в "предыдущее" и ждать новых изменений.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|