Например TDA7294

Форум РадиоКот :: Просмотр темы - ATmega64 проблема с выходом из подпрограммы
Форум РадиоКот
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/