|
ASM + Xmega128A3 |
|
|
|
Oct 5 2011, 13:11
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Добрый день. Решил написать какой-нить простенький код на асме под хмегу - и сходу попал на грабли: Программа из основного цикла все время вываливается на ресет. + вызов функции (rcall letterd) после сравнения битов. CODE .include "ATxmega128A3def.inc"
.equ fmin=5 .equ grflag2=GPIO_GPIOR2
.cseg ;**************************** INTERRUPT VECTORS***************************************** .org 0 jmp reset .org 0x0100;+++++++++++++++++++++++++++++++++++++++++++++++++++++ main: wdr ldi rtmp,0xD8 out CPU_ccp,rtmp clr rtmp sts WDT_CTRL,rtmp ; WDT OFF cli // думал причина в прерываниях..отключил.. не в них
m1: in r18,grflag2 // r18 все время равен 0, следовательно флаг grflag2.5 = 0 sbic grflag2,fmin // пропускаю и попадаю на nop-> rjmp
rjmp letterd // даже при пустом m1: nop nop rjmp m1 вываливаюсь на ресет rjmp m1;******************************* nop ret
letterd: // как ни странно но в эту функцию я тоже попадаю nop // хотя из условия выше я долже ее обходить ret
;************** RESET ******* // стандартный набор для инициализации
RESET: cli ldi r16,low(RAMEND) out CPU_SPL,r16 ldi r16,high(RAMEND) out CPU_sph,r16 clr r16 clr xh ldi xl,0xff
res1: st x+,r16 cpi xh,high(ramend) brmi res1 ldi rtmp,0b01000111 sts OSC_XOSCCTRL,rtmp ldi rtmp,0b00001001 sts OSC_CTRL,rtmp ser rtmp sts kzad,rtmp call gzad16
lds rtmp,OSC_STATUS sbrs rtmp,3;XOSCRDY rjmp res2
ldi rtmp,0xD8 out CPU_ccp,rtmp
res2: ldi rtmp,0b011 sts clk_ctrl,rtmp ;extern. CLK jmp main
Сообщение отредактировал IgorKossak - Oct 6 2011, 14:04
Причина редактирования: [codebox]
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 18)
|
Oct 6 2011, 14:31
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Pavel_Bor @ Oct 6 2011, 16:30)  2. очистка памяти Только памяти? или ещё и периферии и почему именно с 0x00FF а не с 0? Цитата(Pavel_Bor @ Oct 6 2011, 16:30)  Еще раз говорю что этот ретурн не должен никогда происходить. он после мэйна никому не мешает 100% если R18 всегда =0 должен быть вечный цикл m1: . . . rjmp m1 Цитата(Pavel_Bor @ Oct 6 2011, 16:30)  а без него программа вываливается из основного цикла main. Вот это вообще не понятно  что значит без RET вываливается? Цитата(Pavel_Bor @ Oct 6 2011, 13:01)  Строки ниже дают доступ на несколько секунд к изменению конфигурации. ldi rtmp,0xD8 out CPU_ccp,rtmp Т.е. несколько секунд полного беспредела Вы случаем нечё не путаете? Где про это можно в DS прочитать???
|
|
|
|
|
Oct 6 2011, 20:34
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
CODE .cseg .org 0
jmp RESET ; Reset Handler
// тут пишем вектора всех прерываний
// здесь я обычно размещаю данные, которые нужны, чтоб не париться с указателем адреса внизу // и во время отладки проц пишется быстрее.
RESET: // STACK ldi tmp,low(ramend) // out SPL,tmp // ldi tmp,high(ramend) // out SPH,tmp // cli
// инициализация периферии, настройка портов
Чистка DSEG у меня так :
// Initialization
ldi xl,low (1024) // загружаем размер DSEG ldi xh,high(1024) // ldi yl,low (0x60) // начальный адрес DSEG ldi yh,high(0x60) // ldi data,0x00 // загружаем нужную константу clear_c: // st Y+,data // sbiw xl,1 // brne clear_c //
main: // здесь делаем все что хотим, или работаем по прерываниям
rjmp main
|
|
|
|
|
Oct 7 2011, 06:47
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
Цитата(Pavel_Bor @ Oct 6 2011, 17:30)  Думаете? почему же тогда после in r18, grflag2 r18 = 0 ??? При чем тут вообще R18, если в условии проверяется bit 5 регистра GPIOR2? вы проверяете R18 на ноль ? нет. И что вам мешает переделать: Код m1: in r18,grflag2 // r18 все время равен 0, следовательно флаг grflag2.5 = 0 /////////////////// вот тут не понятно чего вы добивались. SBRC R18,fmin // пропускаю и попадаю на nop-> rjmp И еще раз про сторожевой таймер: 3.12.1. Последовательность записи защищенных регистров ввода-вывода Кодом программы выполняется запись сигнатуры в регистр CCP, что разрешает изменение защищенных регистров ввода-вывода. В течение 4 последующих циклов инструкций кодом программы необходимо записать требуемые данные в защищенный регистр. У большинства защищенных регистров предусмотрен свой бит разрешения записи/разрешения изменения. В данный бит необходимо записать единицу вместе с записью данных. Возможность защищенного изменения блокируется сразу после выполнения ЦПУ операции записи в регистр ввода-вывода или памяти данных, а также, после выполнения инструкции SPM, LPM или SLEEP. И программа никогда не попадет на строки: Код ........ rjmp m1 nop //****** вот сюда ret /////////// и сюда никогда и ни при каких условиях не попадет. Удалите их. ........ Скорее всего программа, которую вы сюда выложили сильно отличается от той, которую вы сейчас "мучаете".
Сообщение отредактировал Navovvol - Oct 7 2011, 07:03
|
|
|
|
|
Oct 7 2011, 07:44
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(Navovvol @ Oct 7 2011, 09:47)  При чем тут вообще R18, если в условии проверяется bit 5 регистра GPIOR2? вы проверяете R18 на ноль ? нет. И что вам мешает переделать: я думал что значение регистра GPIOR2 каким то чудом меняется и для этого решил сохранить его в r18. Код ........ rjmp m1 nop //****** Эти строки как мусор, я же уже согласился с этим. ret /////////// ........ [quote] Только памяти? или ещё и периферии и почему именно с 0x00FF а не с 0? [/qoute] Хорошо подметили. Я здесь только RAM хотел почистить и чистил много лишнего. правильный адреса: Стартовый(RAMSTART) 0x2000 конечной(RAMEND) 0x3fff Всем спасибо за замечания и советы.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|