Страница 80 из 280

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 00:18:08
Jack_A
Roman Venom писал(а): П.С. Я без стека отлично обхожусь... Тем более в аврах. Тем более что это просто запись в ОЗУ. Почему бы не использовать другие ячечки памяти? В этом случае проблем с соблюдением уровня стека не возникнет.
Ну, это уже на Нобелевку тянет - во всей программе - ни одного прерывания и ни одного вызова подпрограммы ( они, как известно, используют стек ) !
Проблемы со стеком не возникает, если писа'ть программу внимательно и с ясным пониманием того, что делаешь.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 02:29:58
rukez
ахтунг!
сегодня внезапно напоролся (расслабился я простостой и дружелюбностью протеуса)
вообщем если на схему положить потенциометр (RV-POT) и при переносе в арес присвоить ему корпус SIL-3 (что вполне логично - нынче каждый второй подстроичник в таком кузове) то вопреки всякой человеческой логике нога выхода (средняя) станет первым пином в разъеме :shock: :evil: :kill:

вообщем вот так ноги расставятся:

Изображение

(это просто VR-POT разведенный на схеме по принципу VR_1-J_1; VR_2-J_2; VR_3-J_3)
Вообщем будте внимательны :)))

пысы кстати, почему переодически отключается автонумировка элементов? (к каждому элементу вместо номера приписывается вопросительный знак) - как включить нумиратор?

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 10:02:19
nsl2004
Roman Venom писал(а):nsl2004
Ну так пройдите программу в отладчике пошагово. .
Так что мы имеем.
AVR Program memory
Watch Windov
AVR CPU Registers
AVR EEROM Memory
AVR I/O registers
AVR Variable
AVR Source Code
AVR Data memory вот этот похож по размеру на ОЗУ ( 128 байт для Тини 2313 ). Что искать? Беглый просмотр показал что он на 70 % пустой. Если скажем стеки или что токуда то уезжает что надо увидеть? Я еще на Вы с контролерами,подскажите.
Roman Venom писал(а):nsl2004
Тем более что это просто запись в ОЗУ..
Где эту запись увидеть в окошке Data Memory ?
Почему бы не использовать другие ячечки памяти? В этом случае проблем с соблюдением уровня стека не возникнет.
С удовольствием, но как это сделать, или хотя бы как сформулировать вопрос , что бы найти в Гугле :-) Размещение стека в памяти AVR ? Т.е в каком направление копать. А так спасибо, что помогаете Роман. Уже не так грустно.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 10:15:36
nsl2004
Проблемы со стеком не возникает, если писа'ть программу внимательно и с ясным пониманием того, что делаешь.
Спасибо конечно, но это типа "Земля круглая". Абсолютно точно. :))

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 10:30:46
Engineer_Keen
nsl2004 писал(а):AVR Data memory вот этот похож по размеру на ОЗУ ( 128 байт для Тини 2313 ).
Да, это и есть ОЗУ
nsl2004 писал(а):Что искать? Беглый просмотр показал что он на 70 % пустой. Если скажем стеки или что токуда то уезжает что надо увидеть?
Если стек проинициализирован правильно, то при первой записи в него, данные (адрес, если это прерывание/CALL или байт если по команде PUSH) запишутся в последнюю ячейку ОЗУ, следующие в предпоследнюю (или предпредпоследнюю, если адрес), и т.д.
nsl2004 писал(а):Где эту запись увидеть в окошке Data Memory ?
Измененные с последнего просмотра данные (было например 0х00, записалось 0хF3) протеус подсвечивает желтым.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 11:04:39
nsl2004
to Engineer_Keen
Спасибо попробую понять.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 21:18:57
nsl2004
Engineer_Keen
Если стек проинициализирован правильно, то при первой записи в него, данные (адрес, если это прерывание/CALL или байт если по команде PUSH) запишутся в последнюю ячейку ОЗУ, следующие в предпоследнюю (или предпредпоследнюю, если адрес), и т.д.
Подскажите пожалуйста, где про это можно прочитать? Не подскажете материальчик. Что то рою по запросу типа использование озу в AVR, память AVR и натыкаюсь на ерунду разную. Т.к моя проблема однозначно в этом. Пошаговая отладка показала что расположившиеся в конце значения ползут вверх , забивают всю дата мемори и устройство перестает функционировать. Причем с верху таблицы распологается 8 байтовая переменная и торчит там постоянно. Ее я так понимаю тоже лучше убрать.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 21:47:06
Jack_A
nsl2004 писал(а): С удовольствием, но как это сделать, или хотя бы как сформулировать вопрос , что бы найти в Гугле :-) Размещение стека в памяти AVR ? Т.е в каком направление копать.
Для этого не надо прогугливать весь интернет, достаточно почитать даташиты.
Вот что я навскидку нашел в доке на Tiny2313 :

0x0013 RESET: ldi rl6, low(RAMEND);
0x0014 out SPL,rl6
0x0015 sei

Так что для инициализации стека не надо быть семи пядей во лбу. Важно, что сделать это надо сразу же после подачи питания, до sei. Надо следить за указателями собственных данных, чтобы они не зацепили стек. Вылет может быть и не только по переполнению или порче стека: выполнение несуществующей инструкции, запись по несуществующему адресу. Со стеком как раз проблем - минимум : соблюдать аккуратность : сколько положил в стек на входе в п/п, столько и извлек на выходе из нее. Не хулиганить : типа зашел по rjmp, а вышел по ret или наоборот.
Впрочем, все эти советы - для программера, пишущего на асме и ясно представляющего себе, что он делает. А когда пишешь на С или всяких извратах с рисованием квадратиков со стрелочками связей, не надо удивляться , что результат будет непредсказуемым. "Я написал вроде правильно, а что там компайлер наваял - неизвестно". А компилятор отвечает : "А мне вообще все по фигу - синтаксические ошибки есть? - нет. А дальше т...сь как хотите".
Рискуя прослыть ретроградом, все же считаю : учиться программить все же надо на асме, чтобы прочувствовать архитектуру МК, понять, как выполняется та или другая инструкция. А уж потом, когда почувствуешь себя корифаном и проги захочешь выпускать как горячие пирожки - берись за С с твердой уверенностью, что если он там ( или скорее ты с ним ) накосячили, в результирующем коде сумеешь разобраться.
Каждому -свое, как говорили в Освенциме.

PS А стек традиционно размещается в конце памяти, хотя это и не догма. Бывает, что для одного и того же компа, но для разных на нем операционных систем стек размещается по разному.

Ой, кажется, не в свою тему вломился - я Протеус не использую.

А то, что Роман советует вообще не использовать стек ( в т.ч. и прерывания, и подпрограммы ) - жжжесть !

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 22:13:45
Roman Venom
Jack_A
Ну, это уже на Нобелевку тянет - во всей программе - ни одного прерывания и ни одного вызова подпрограммы ( они, как известно, используют стек ) !
Проблемы со стеком не возникает, если писа'ть программу внимательно и с ясным пониманием того, что делаешь.
Вы неправильно меня поняли... Я не использую команды положить/извлечь. Прерывания, подпрограммы естессно присутствуют. Как же без них? :))) И никаких недоразумений со стеком не было... Кстати ещё вот что. Были непонятные баги когда прерывания срабатывали во время операций положить/извлечь в ОЗУ.
А когда пишешь на С или всяких извратах с рисованием квадратиков со стрелочками связей, не надо удивляться , что результат будет непредсказуемым. "Я написал вроде правильно, а что там компайлер наваял - неизвестно". А компилятор отвечает : "А мне вообще все по фигу - синтаксические ошибки есть? - нет. А дальше т...сь как хотите".
Ну вот я начинал с асма, сейчас учу С/С++(пытаюсь, по крайней мере), т.к. появились задачи обработки данных, цифровой фильтрации, а на асме это невыполнимо. И сомневаюсь что компилятор такой дурной, тупее среднего программера на асм.
П.С. Так что там с багой?

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 23:08:11
nsl2004
Jack_A Для этого не надо прогугливать весь интернет, достаточно почитать даташиты.
Вот что я навскидку нашел в доке на Tiny2313 :
Спасибо я теперь знаю где почитать. Т.к. даже если бы я прочел пару раз это место, я бы все равно не заподозрил, что это инициализация стека. Просто я к асму даже не прикасался. Прога которую мучаю на баскоме. Я понял очень важную вещь. Что конкретно в моей проге надо как то принудительно зафиксировать то, что распологается в конце ОЗУ. А то оно начинает смещатся и забивает весь ОЗУ ( Дата мемори в Протеусе )

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 23:11:18
nsl2004
Roman Venom писал(а): П.С. Так что там с багой?
Если это мне то бага на месте. Пробую вручную распределить ОЗУ под переменные !? Может повезет :))

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 15, 2011 23:19:49
Roman Venom
nsl2004
Если это мне то бага на месте. Пробую вручную распределить ОЗУ под переменные !? Может повезет
Повезёт - плохое слово. Так можно часами сидеть... Найди лучше примеры таких прог/попроси чтобы выложили. Как правильно оформлять.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 00:16:53
nsl2004
Roman Venom писал(а):nsl2004
Если это мне то бага на месте. Пробую вручную распределить ОЗУ под переменные !? Может повезет
Повезёт - плохое слово. Так можно часами сидеть... Найди лучше примеры таких прог/попроси чтобы выложили. Как правильно оформлять.
Нет таких прог - это эмулятор DS2413 1-wire.
Удача любит удачливых и стремящихся к удаче. Переменные стали как вкопанные и рядком. Сразу стала видна проблема. Как сюда изображение вставить? Разберусь вернусь. Короче в конец озу записывается, наверно стек, и он начинает снизу вверх заполнять Озу . Забивает напрочь переменные все и проц останавливается. Задача остановить полузуна. Т.е я так понимаю стеку надо задать размер. Сделал. И место где распологатся. Вот как сделать это, мне пока не известно. Ищу.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 00:21:16
Roman Venom
nsl2004
И место где распологатся. Вот как сделать это, мне пока не известно. Ищу.

Код: Выделить всё

0x0013 RESET: ldi rl6, low(RAMEND);
0x0014 out SPL,rl6
Вот.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 00:29:28
nsl2004
Включаю, переменные распологаютсяодна за другой от 60 до 8D. То, что я думаю стек, расположилось в конце

Код: Выделить всё

60: 09 00 00 00 65 3A 14 C5 B8 00 00 00 65 00 00 00 00 00 00 00 | ....e:......e.......
74: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
88: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
9C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
C4: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
D8: 00 00 00 00 06 72 00 63  | .....r.c
Делаем пару десятков шагов, видите начинает заполнять снизу подлый. :))

Код: Выделить всё

60: 04 C6 FF 80 09 3A 14 C5 B8 00 00 00 65 3A 14 C5 B8 00 00 00 | .....:......e:......
74: 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | e...................
88: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
9C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ..
C4: 00 00 00 00 00 00 00 00 02 70 02 70 02 70 02 70 02 63 00 92 | .........p.p.p.p.c..
D8: 02 60 00 92 02 61 00 92  | .`...a..
И финал когда симуляция умирает

Код: Выделить всё

60: 00 02 02 00 8B 00 92 02 60 02 62 00 92 3A FF C5 B8 00 00 00 | ........`.b..:......
74: 65 63 01 92 02 60 00 92 02 63 00 60 02 60 00 92 02 60 00 92 | ec...`...c.`.`...`..
88: 80 4A B5 92 02 60 00 92 02 60 00 92 02 63 00 92 02 60 00 92 | .J...`...`...c...`..
9C: 02 60 00 92 02 61 02 61 02 63 00 92 02 60 00 92 02 63 00 92 | .`...a.a.c...`...c..
B0: 02 60 00 92 02 63 00 92 02 60 00 92 02 60 00 92 02 61 02 61 | .`...c...`...`...a.a
C4: 02 63 00 92 02 60 00 92 02 63 00 92 02 60 00 92 02 63 00 92 | .c...`...c...`...c..
D8: 02 60 00 92 3A 61 00 92  | .`..:a..
Интересно как без симулятора можно отловить такую ошибку. Протеус рулит.
Но проблема осталась, как его остановить и что в этом стеке лежит? Промежуточные значения таймера могут?

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 00:43:42
nsl2004
Roman Venom писал(а):nsl2004
И место где распологатся. Вот как сделать это, мне пока не известно. Ищу.

Код: Выделить всё

0x0013 RESET: ldi rl6, low(RAMEND);
0x0014 out SPL,rl6
Вот.
Спасибо. Но прога на Баскоме и асм еще надо как то вставить. Синтаксис полагаю не тот. Но надо попробовать поигратся.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 01:00:16
nsl2004
Roman Venom писал(а):nsl2004
И место где распологатся. Вот как сделать это, мне пока не известно. Ищу.

Код: Выделить всё

0x0013 RESET: ldi rl6, low(RAMEND);
0x0014 out SPL,rl6
Вот.
SPL помогло - сделал запись Spl = &HDF - - это нижний край ОЗУ движение остановилось
Вроде работает. Но в симуляторе появилось
PC=0x0000[AVR CPU] RET address = 0x0000. Не знаете что сие значит? И можно ли это игнорировать?

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 12:08:08
Engineer_Keen
nsl2004 писал(а):SPL помогло - сделал запись Spl = &HDF - - это нижний край ОЗУ движение остановилось
Вроде работает.
Приведенные выше дампы памяти показывают что стек и до этого был проинициализирован правильно, так как он рос с конца ОЗУ вниз. Другой вопрос почему он рос бесконечно. Нужно смотреть в каком месте программы стек изменялся. Ведь ограничить его никак нельзя, можно только следить чтобы он не переполнился.
nsl2004 писал(а): Но в симуляторе появилось
PC=0x0000[AVR CPU] RET address = 0x0000. Не знаете что сие значит? И можно ли это игнорировать?
Это означает, что в в том месте в стеке где должен был лежать адрес возврата почему-то лежит 0, возврат по этому адресу равносилен сбросу (адрес вектора прерывания "сброс" - 0-я ячейка). Это следствие того, что стек кто-то попортил...

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 12:22:41
Murka
Нужно наверное найти кто бросает в стек, обычно это вызовы подпрограмм, (по call) сохранения данных в стек (по push).
Так вот если из подпрограммы не вернуться (по ret) или не забрать данные (по pop), то они станут накапливаться до переполнения стека (ну или ОЗУ "закончится") и в протеусе вы получите ошибку PC=0x0000[AVR CPU] RET address = 0x0000. Что означает что программа получила по ret из стека (или якобы из стека) адрес "0" что является "холодным стартом" и протеус интересуется "Вы сознательно так делаете?"

Во!! не успел! :cry:

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 16, 2011 13:24:00
Engineer_Keen
В общем тут косяки надо искать в прошивке, а это уже в ветку про МК и ПЛИС, а то тут оффтоп пошел...