| Форум РадиоКот https://radiokot.ru/forum/ |
|
| ATmega64 проблема с выходом из подпрограммы https://radiokot.ru/forum/viewtopic.php?f=57&t=8985 |
Страница 1 из 1 |
| Автор: | Александр А. [ Ср апр 23, 2008 20:09:23 ] |
| Заголовок сообщения: | ATmega64 проблема с выходом из подпрограммы |
При отладке программы в симуляторе AVR Studio 4, программа работает нормально, но при работе на микроконтроллере не записывает адрес возврата в стек и следовательно возвращается не по тому адресу. В чем может быть проблема? .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m64def.inc" .def Temp1=R16 .def Temp2=R17 .def Temp3=R18 .cseg .org 0 rjmp reset .org 0x46 reset: ; init cli ldi Temp1,low(ramend) out SPL,Temp1 ldi Temp1,high(ramend) out SPH,Temp1 ser temp1 out ddrb,Temp1 clr temp1 out portb,temp1 cycle: out portb,temp2 sbi portb,6 rcall wait cbi portb,6 rcall wait inc temp2 jmp cycle ret wait: ldi Del1, 1 ldi Del2, 25 ldi Del3, 10 ddl1: dec Del1 brne ddl1 dec Del2 brne ddl1 dec Del3 brne ddl1 ret |
|
| Автор: | ARV [ Ср апр 23, 2008 20:38:24 ] |
| Заголовок сообщения: | |
это провокация: приведенный код не может быть скомпилирован без ошибок! |
|
| Автор: | Александр А. [ Ср апр 23, 2008 20:43:21 ] |
| Заголовок сообщения: | |
Извинияюсь, убрал лишнее. Хотел покомпактнее сделать. .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m64def.inc" .def Temp1=R16 .def Temp2=R17 .def Temp3=R18 .def Rsaddr=R19; working rs address .def Lcd=R20; data to or from LCD .def T1=R21 .def T2=R22 .def Del1=R23 .def Del2=R24 .def Del3=R25 .cseg .org 0 rjmp reset .org 0x46 reset: ; init cli ldi Temp1,low(ramend) out SPL,Temp1 ldi Temp1,high(ramend) out SPH,Temp1 ser temp1 out ddrb,Temp1 clr temp1 out portb,temp1 cycle: ; out portb,temp2 sbi portb,6 rcall wait cbi portb,6 rcall wait inc temp2 jmp cycle ret wait: ldi Del1, 1 ldi Del2, 25 ldi Del3, 10 ddl1: dec Del1 brne ddl1 dec Del2 brne ddl1 dec Del3 brne ddl1 ret |
|
| Автор: | Tohey [ Ср апр 23, 2008 21:04:55 ] |
| Заголовок сообщения: | |
Адрес возврата от куда? jmp cycle ret Отсюда? |
|
| Автор: | Александр А. [ Чт апр 24, 2008 06:00:19 ] |
| Заголовок сообщения: | |
из функции wait wait: ldi Del1, 1 ldi Del2, 25 ldi Del3, 10 ddl1: dec Del1 brne ddl1 dec Del2 brne ddl1 dec Del3 brne ddl1 ret |
|
| Автор: | __Alexander [ Чт апр 24, 2008 08:52:43 ] |
| Заголовок сообщения: | |
А почему ты захотел вместо call использовать rcall, а вместо jmp -> rjmp не захотел? |
|
| Автор: | ARV [ Чт апр 24, 2008 09:41:56 ] |
| Заголовок сообщения: | |
не может этого быть! такая программа никуда не денется - выйдет как миленькая. может, просто тактовая МК слишком маленькая (или он вообще не тактируется - благодаря фьюзикам разлюбезным) - вот и вся проблема? |
|
| Автор: | Александр А. [ Чт апр 24, 2008 20:54:14 ] |
| Заголовок сообщения: | |
Проблема не решена. Дополнительные данные: Программатор JTAG ICE. Включены фьюзы: CompMode OCDEN JTAGEN SPIEN BOOTSZ - Boot Flash size = 4096 words Boot Address=$7000 BODLEVEL - VCC = 2.7 SUT_CKSEL - ext. crystal/resonator high freq; start up time 1K CK+64ms EXTENDED=0xFD HIGH=19 LOW=0xCF По отладчику и появлению сигнала на порту видно, что схема тактируется. |
|
| Автор: | __Alexander [ Пт апр 25, 2008 09:08:49 ] |
| Заголовок сообщения: | |
Может деться, попробывал, не работает, а если вместо jmp поставить rjmp то все ОК. Незнаю даже где грабли. |
|
| Автор: | Artem333 [ Пт апр 25, 2008 09:44:03 ] |
| Заголовок сообщения: | |
ты команды push-pop не юзаешь? Такое бывает если неверно использовать стек. |
|
| Автор: | __Alexander [ Пт апр 25, 2008 23:59:08 ] |
| Заголовок сообщения: | |
Думаю тут дело в этих загадочных .org 0x46, по памяти было сталкивался что авр студио на них не особо оказывает влияние, поэтому и компилирует и отлаживает отлично, и команды переходов и вызовов отрабатывает корректно. Но в проце на это нельзя забивать. |
|
| Автор: | Artem333 [ Сб апр 26, 2008 04:47:07 ] |
| Заголовок сообщения: | |
а зачем тебе вообще ORG нужен??? Я его использую только если надо разместить бинарник в какомто особом месте. Компилятор всё сам сделает. |
|
| Автор: | Александр А. [ Сб апр 26, 2008 08:19:32 ] |
| Заголовок сообщения: | |
org использую чтобы пропустить адреса прерываний это не влияет на глюк, также как и rjmp и jmp, rcall и call. pop и push не использую |
|
| Автор: | Tohey [ Сб апр 26, 2008 08:37:06 ] |
| Заголовок сообщения: | |
А разве компилятор это делать не умеет? Попробуй без .ОРГ. rjmp и jmp в документации описаны, и они отличаются, так же как и call rcall icall... |
|
| Автор: | Artem333 [ Сб апр 26, 2008 09:40:10 ] |
| Заголовок сообщения: | |
для конечного пользователя они не отличаются. А прерывания по дефолту отключены, такчто можешь смело писать прогу с нулевого адреса. |
|
| Автор: | __Alexander [ Сб апр 26, 2008 12:06:00 ] |
| Заголовок сообщения: | |
Скорее всего, как сказал ARV что-то с фьюзами или подключением или со схемой. А так все работет, лично проверил. Не полениля светодиод к ноге припаять, мигает с частотой ~2-3 Гц. |
|
| Автор: | Александр А. [ Вс апр 27, 2008 19:11:20 ] |
| Заголовок сообщения: | |
Проблема решилась. Дело и правдо было в неверно выставленных фъюзах. Был включен режим совместимости ATmega103. А в этом режиме память распределяется немного подругому. И то что компилятор считает последним адресом сегмента данных SRAM, на самом деле оказывается адресом сегмента External SRAM. |
|
| Автор: | murashh [ Ср окт 17, 2012 04:17:25 ] |
| Заголовок сообщения: | Re: ATmega64 проблема с выходом из подпрограммы |
ЯХУУУУУ! Вот где засада сидела. Хвала автору проблемы. Дурацкий бит, а сколько проблем. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


