|
|
  |
ATmega8 адресс метки |
|
|
|
Jun 19 2011, 17:38
|

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

|
Цитата(Shadovv13 @ Jun 19 2011, 21:31)  Частично изменил код... Код s: brtc en b:icall rjmp s Уведомление осталось.... Этот кусок кода будет выполнятся до тех пор, пока не изменится флаг T. Кто (какая команда) его изменит. P.S. Так и не понял Вашей программы, но, наверное, ошибка здесь: должна ли выполняться команда с меткой е00, если не выполнится условие перехода предыдущей команды (breq s)? Цитата(Shadovv13 @ Jun 19 2011, 21:31)  Какой адрес указать для стека в ATmega8? Обычно стек устанавливают так, как это сделано в примерах в DS Цитата $001 RESET:ldi r16,high(RAMEND); Main program start $002 out SPH,r16 ; Set Stack Pointer to top of RAM $003 ldi r16,low(RAMEND) $004 out SPL,r16
|
|
|
|
|
Jun 19 2011, 19:06
|
Участник

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

|
Ну вот так все выглядит. Код ldi r16,high(RAMEND) out SPH,r16 ldi r16,low(RAMEND) out SPL,r16
ldi ZH,high(b) ldi ZL,low(b) s: brtc en b:icall rjmp s
en:sbr r18,252 set ldi ZH,high(e00) ldi ZL,low(e00) cpi r18,252 breq s ldi ZH,high(e01) ldi ZL,low(e01) cpi r18,253 breq s ldi ZH,high(e11) ldi ZL,low(e11) cpi r18,255 breq s ldi ZH,high(e10) ldi ZL,low(e10) cpi r18,254 breq s
e00:clt sbrc r18,0 inc r10 sbrc r18,1 dec r10 ret
e01:clt sbrc r18,0 inc r10 sbrs r18,1 dec r10 ret
e11:clt sbrs r18,0 inc r10 sbrs r18,1 dec r10 ret
e10:clt sbrs r18,0 inc r10 sbrc r18,1 dec r10 ret Результат, все работает но сообщение все равно присутствует!! AVR Simulator: Stack Underflow at 0x0020 Может хрен сним?
|
|
|
|
|
Jun 19 2011, 19:27
|

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

|
Цитата(Shadovv13 @ Jun 19 2011, 23:06)  Может хрен сним? Я в предыдущем своем посте сделал приписку - возможно, Вы её не заметили... По-моему, ошибка вот тут Код breq s
e00: clt Хотя я в Вашей программе не разобрался, но мне кажется, что вместо команды "BREQ S" в этом месте должно быть что-то другое.
|
|
|
|
|
Jun 19 2011, 19:54
|
Участник

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

|
Обратите внимание что вначале стоит Код en:sbr r18,252 значит одно из четырех сравнении Код cpi r18,252;,253,254,255 сработает!
|
|
|
|
|
Jun 19 2011, 20:15
|

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

|
Цитата(Shadovv13 @ Jun 19 2011, 23:54)  значит одно из четырех сравнении сработает! Если Вы в этом уверены, то вместо Код cpi r18,254 breq s "правильнее" было бы записать Код rjmp s Кстати, в Вашей программе регистр r18 не изменяется вовсе (за исключением приведенной Вами команды с меткой en)... Или приведён небольшой фрагмент кода? Тогда я совсем не уверен, что регистр r18 принимает только эти четыре значения.
|
|
|
|
|
Jun 19 2011, 21:14
|
Участник

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

|
Код rjmp s разве что в последнем сравнении! Регистр R18 будет принимать значение из порта(кнопки и 2 младших бита енкодер), после опроса клавиш, старшие 6 бит уст. в 1, для удобства сравнения(положения енкодера определиться по грей коду 00 01 11 10 .... ) Первый вызов программы определяет положение и адрес обработки второго вызова, устанавливает флаг Т как индикатор захвата положения. Второй вызов определяет в какую сторону сместился енкодер, и проводи увеличение или уменьшение R10. Сбрасывает флаг Т, указывая необходимость делать захват положения. Ну вот так как кто!
Сообщение отредактировал Shadovv13 - Jun 19 2011, 21:16
|
|
|
|
|
Jun 19 2011, 22:03
|
Участник

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

|
Если помните, как называлась тема с енкодером, дайте ссылку пожалуйста. А то поиском страниц много.
Ну и вопрос остался открытым.
|
|
|
|
|
Jun 20 2011, 13:33
|
Участник

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

|
Цитата(Палыч @ Jun 20 2011, 07:33)  Посмотрел и прочел! Вопросы, обсуждаемые в теме, я для себя давно решил . И этот код как раз решает проблемы, с дребезгом, с резким поворотом енкодера, а также учет всех перепадов(переходов). Кстати там же я нашел много подобных решений, схожих с моим!!!!! Спасибо за ссылку!!!!
Сообщение отредактировал Shadovv13 - Jun 20 2011, 13:34
|
|
|
|
|
Jun 20 2011, 14:07
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Shadovv13 @ Jun 20 2011, 04:06)  ... ldi ZH,high(b) ldi ZL,low(b) s: brtc en b:icall rjmp s en: ... Результат, все работает но сообщение все равно присутствует!! AVR Simulator: Stack Underflow at 0x0020 Может хрен сним? Ваш фрагмент работает точно так же, как и этот: Код s: brtc en БЕСКОНЕЧНЫЙ_ЦИКЛ: call БЕСКОНЕЧНЫЙ_ЦИКЛ rjmp s en: ... Т.е. если при переходе на метку "s" флаг "T" сброшен, всё будет нормально, но если флаг "T" установлен до перехода на метку "s", то программа входит в бесконечный цикл, непрерывно заполняя стек одним и тем же адресом возврата, о чём и кричит AVRstudio.
|
|
|
|
|
Jun 20 2011, 15:09
|
Участник

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

|
Цитата(ae_ @ Jun 20 2011, 17:07)  Ваш фрагмент работает точно так же, как и этот: Код s: brtc en БЕСКОНЕЧНЫЙ_ЦИКЛ: call БЕСКОНЕЧНЫЙ_ЦИКЛ rjmp s en: ... Т.е. если при переходе на метку "s" флаг "T" сброшен, всё будет нормально, но если флаг "T" установлен до перехода на метку "s", то программа входит в бесконечный цикл, непрерывно заполняя стек одним и тем же адресом возврата, о чём и кричит AVRstudio. Спасибо уважаемый ae_. Кто же мог подумать что AVRstudio будет так глубоко анализировать!!! Думаю убрать метку b, она там в прицепе ненужна а регистр Z задам нулевой адрес(оставлю пустим). Так как Т флаг сто пудов буде сброшен, все будет норм. Ну а если нет РЕСТАРТ с 0
|
|
|
|
|
Jun 20 2011, 15:54
|
Участник

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

|
Цитата(Палыч @ Jun 20 2011, 18:39)  В том то и дело, что сообщение - не результат анализа, а результат выполнения (симуляции выполнения) Вашей программы. Я с вами несогласен!!! В пошаговой отладке видно, что программа работает нормально и в бесконечный цикл не входит! Но при первом RET уведомляет, о возможном опустошении стека(я так думаю).
Сообщение отредактировал Shadovv13 - Jun 20 2011, 15:55
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|