ATmega64 проблема с выходом из подпрограммы

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 6
Зарегистрирован: Ср апр 23, 2008 19:52:30

Сообщение Александр А. »

При отладке программы в симуляторе 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

это провокация: приведенный код не может быть скомпилирован без ошибок!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 6
Зарегистрирован: Ср апр 23, 2008 19:52:30

Сообщение Александр А. »

Извинияюсь, убрал лишнее.
Хотел покомпактнее сделать.

.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
Грызет канифоль
Аватара пользователя
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

Сообщение Tohey »

Адрес возврата от куда?

jmp cycle
ret
Отсюда?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 6
Зарегистрирован: Ср апр 23, 2008 19:52:30

Сообщение Александр А. »

из функции 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
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

А почему ты захотел вместо call использовать rcall, а вместо jmp -> rjmp не захотел?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не может этого быть! такая программа никуда не денется - выйдет как миленькая. может, просто тактовая МК слишком маленькая (или он вообще не тактируется - благодаря фьюзикам разлюбезным) - вот и вся проблема?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Сообщения: 6
Зарегистрирован: Ср апр 23, 2008 19:52:30

Сообщение Александр А. »

Проблема не решена.
Дополнительные данные:
Программатор 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

По отладчику и появлению сигнала на порту видно, что схема тактируется.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Может деться, попробывал, не работает, а если вместо jmp поставить rjmp то все ОК. Незнаю даже где грабли.
Встал на лапы
Сообщения: 119
Зарегистрирован: Вт апр 17, 2007 15:24:47
Откуда: Новосиб

Сообщение Artem333 »

ты команды push-pop не юзаешь? Такое бывает если неверно использовать стек.
Всё просто как самогонный аппарат
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Думаю тут дело в этих загадочных .org 0x46, по памяти было сталкивался что авр студио на них не особо оказывает влияние, поэтому и компилирует и отлаживает отлично, и команды переходов и вызовов отрабатывает корректно. Но в проце на это нельзя забивать.
Встал на лапы
Сообщения: 119
Зарегистрирован: Вт апр 17, 2007 15:24:47
Откуда: Новосиб

Сообщение Artem333 »

а зачем тебе вообще ORG нужен??? Я его использую только если надо разместить бинарник в какомто особом месте. Компилятор всё сам сделает.
Всё просто как самогонный аппарат
Родился
Сообщения: 6
Зарегистрирован: Ср апр 23, 2008 19:52:30

Сообщение Александр А. »

org использую чтобы пропустить адреса прерываний
это не влияет на глюк, также как и rjmp и jmp, rcall и call.
pop и push не использую
Грызет канифоль
Аватара пользователя
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

Сообщение Tohey »

А разве компилятор это делать не умеет? Попробуй без .ОРГ.
rjmp и jmp в документации описаны, и они отличаются, так же как и call rcall icall...
Встал на лапы
Сообщения: 119
Зарегистрирован: Вт апр 17, 2007 15:24:47
Откуда: Новосиб

Сообщение Artem333 »

для конечного пользователя они не отличаются. А прерывания по дефолту отключены, такчто можешь смело писать прогу с нулевого адреса.
Всё просто как самогонный аппарат
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Скорее всего, как сказал ARV что-то с фьюзами или подключением или со схемой. А так все работет, лично проверил. Не полениля светодиод к ноге припаять, мигает с частотой ~2-3 Гц.
Родился
Сообщения: 6
Зарегистрирован: Ср апр 23, 2008 19:52:30

Сообщение Александр А. »

Проблема решилась.
Дело и правдо было в неверно выставленных фъюзах.
Был включен режим совместимости ATmega103. А в этом режиме память распределяется немного подругому. И то что компилятор считает последним адресом сегмента данных SRAM, на самом деле оказывается адресом сегмента External SRAM.
Открыл глаза
Аватара пользователя
Сообщения: 44
Зарегистрирован: Пт апр 04, 2008 22:51:33

Сообщение murashh »

ЯХУУУУУ! Вот где засада сидела. Хвала автору проблемы. Дурацкий бит, а сколько проблем.
Ответить

Вернуться в «AVR»