Страница 1 из 1
ATmega64 проблема с выходом из подпрограммы
Добавлено: Ср апр 23, 2008 20:09:23
Александр А.
При отладке программы в симуляторе 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
Добавлено: Ср апр 23, 2008 20:38:24
ARV
это провокация: приведенный код не может быть скомпилирован без ошибок!
Добавлено: Ср апр 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
Добавлено: Ср апр 23, 2008 21:04:55
Tohey
Адрес возврата от куда?
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
Добавлено: Чт апр 24, 2008 08:52:43
__Alexander
А почему ты захотел вместо call использовать rcall, а вместо jmp -> rjmp не захотел?
Добавлено: Чт апр 24, 2008 09:41:56
ARV
не может этого быть! такая программа никуда не денется - выйдет как миленькая. может, просто тактовая МК слишком маленькая (или он вообще не тактируется - благодаря фьюзикам разлюбезным) - вот и вся проблема?
Добавлено: Чт апр 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
По отладчику и появлению сигнала на порту видно, что схема тактируется.
Добавлено: Пт апр 25, 2008 09:08:49
__Alexander
Может деться, попробывал, не работает, а если вместо jmp поставить rjmp то все ОК. Незнаю даже где грабли.
Добавлено: Пт апр 25, 2008 09:44:03
Artem333
ты команды push-pop не юзаешь? Такое бывает если неверно использовать стек.
Добавлено: Пт апр 25, 2008 23:59:08
__Alexander
Думаю тут дело в этих загадочных .org 0x46, по памяти было сталкивался что авр студио на них не особо оказывает влияние, поэтому и компилирует и отлаживает отлично, и команды переходов и вызовов отрабатывает корректно. Но в проце на это нельзя забивать.
Добавлено: Сб апр 26, 2008 04:47:07
Artem333
а зачем тебе вообще ORG нужен??? Я его использую только если надо разместить бинарник в какомто особом месте. Компилятор всё сам сделает.
Добавлено: Сб апр 26, 2008 08:19:32
Александр А.
org использую чтобы пропустить адреса прерываний
это не влияет на глюк, также как и rjmp и jmp, rcall и call.
pop и push не использую
Добавлено: Сб апр 26, 2008 08:37:06
Tohey
А разве компилятор это делать не умеет? Попробуй без .ОРГ.
rjmp и jmp в документации описаны, и они отличаются, так же как и call rcall icall...
Добавлено: Сб апр 26, 2008 09:40:10
Artem333
для конечного пользователя они не отличаются. А прерывания по дефолту отключены, такчто можешь смело писать прогу с нулевого адреса.
Добавлено: Сб апр 26, 2008 12:06:00
__Alexander
Скорее всего, как сказал ARV что-то с фьюзами или подключением или со схемой. А так все работет, лично проверил. Не полениля светодиод к ноге припаять, мигает с частотой ~2-3 Гц.
Добавлено: Вс апр 27, 2008 19:11:20
Александр А.
Проблема решилась.
Дело и правдо было в неверно выставленных фъюзах.
Был включен режим совместимости ATmega103. А в этом режиме память распределяется немного подругому. И то что компилятор считает последним адресом сегмента данных SRAM, на самом деле оказывается адресом сегмента External SRAM.
Re: ATmega64 проблема с выходом из подпрограммы
Добавлено: Ср окт 17, 2012 04:17:25
murashh
ЯХУУУУУ! Вот где засада сидела. Хвала автору проблемы. Дурацкий бит, а сколько проблем.