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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> ATmega8 адресс метки
Shadovv13
сообщение Jun 20 2011, 17:09
Сообщение #31


Участник
*

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



Цитата(Палыч @ Jun 20 2011, 19:41) *
Огласите значение указателя стека после его инициализации в начале программы и перед выполнением команды RET.


Вначале: SP = 0x45F
Перед RET: SP = 0x45D
После RET: SP = 0x45F
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 20 2011, 18:59
Сообщение #32


Гуру
******

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



Цитата(Shadovv13 @ Jun 20 2011, 21:09) *
После RET: SP = 0x45F
И - что? При выполнении RET выдаёт сообщение?

Стало как-то интересно... Поставил Studio, скопировал Вашу программу, оттранслировал, зашёл в режим отладки, дошагал до RET, получил те же значения указателя стека, но сообщение - нет!

Стесняюсь спросить: у Вас в отладчике какой Device выбран?
Go to the top of the page
 
+Quote Post
Shadovv13
сообщение Jun 20 2011, 19:08
Сообщение #33


Участник
*

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



Цитата(Палыч @ Jun 20 2011, 21:59) *
И - что? При выполнении RET выдаёт сообщение?

Стало как-то интересно... Поставил Studio, скопировал Вашу программу, оттранслировал, зашёл в режим отладки, дошагал до RET, получил те же значения указателя стека, но сообщение - нет!

Стесняюсь спросить: у Вас в отладчике какой Device выбран?


Странно!!!
Все перепроверил(может всякое быть) результат тодже 01.gif
Может Студия глючная??
У меня.
AVR Studio 4.12.498 Service Pack 4
GUI Version 4, 12, 0, 491
AVR Simulator 1, 0, 1, 8
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 20 2011, 19:34
Сообщение #34


Гуру
******

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



Цитата(Shadovv13 @ Jun 20 2011, 23:08) *
Может Студия глючная??
Ну, не самая последняя... Я вообще для эксперимента какую-то древность поставил. А, Вы точно указали симулятору в качестве Device значение ATmega8? Случайно что-то там типа mega8535 не указали?
Go to the top of the page
 
+Quote Post
Shadovv13
сообщение Jun 20 2011, 19:41
Сообщение #35


Участник
*

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



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


Не!!! Точна 8-мая!!!!
Спецом проект пересоздал!
Go to the top of the page
 
+Quote Post
ae_
сообщение Jun 20 2011, 22:41
Сообщение #36


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Shadovv13, Вы бы уже показали полный проект, в приведённом фрагменте мало что понятно.
Например, подпрограммы e00, e01, e11, e10 абсолютно одинаковые, зачем сравнивать R18 с 4-мя разными значениями, чтобы затем перейти на одну из 4-х одинаковых подпрограмм?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2011, 04:26
Сообщение #37


Гуру
******

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



Цитата(ae_ @ Jun 21 2011, 02:41) *
подпрограммы e00, e01, e11, e10 абсолютно одинаковые
Они выглядят такими, но отличаются командами SBRS/SBRC. Подозреваю, что ТС во время отладки изменяет регистры, поскольку, приведенная программа - всего лишь заготовка, неимеющая кода считывания состояния энкодера. При этом нарушается "нормальная" последовательность выполнения кода, и программа уходит в бесконечный цикл...
Go to the top of the page
 
+Quote Post
Shadovv13
сообщение Jun 21 2011, 09:13
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2011, 09:59
Сообщение #39


Гуру
******

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



Цитата(Shadovv13 @ Jun 21 2011, 13:13) *
Внес изменения.
Что, так и не избавились от сообщения?
Опробовал Ваш код на студии версии 4.18, скачанной с оф.сайта: сообщений - нет. Попробуйте и Вы.
Go to the top of the page
 
+Quote Post
Shadovv13
сообщение Jun 21 2011, 11:55
Сообщение #40


Участник
*

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



Поставил студию....
AVR Studio 4.18.684
GUI Version 4, 18, 0, 670
AVR Simulator 1, 0, 2, 1

Итог!!!!!

Извините что вам и себе мозги парил и время отнимал! maniac.gif
ВСЕ ЗАРАБОТАЛО!!!!! 08.gif
ВСЕМ СПАСИБО!!!! cheers.gif
Go to the top of the page
 
+Quote Post
ae_
сообщение Jun 22 2011, 11:56
Сообщение #41


Участник
***

Группа: Свой
Сообщений: 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, или ничего. Затем текущее состояние энкодера переместить в "предыдущее" и ждать новых изменений.
Go to the top of the page
 
+Quote Post

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

 


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


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