реклама на сайте
подробности

 
 
> ASM + Xmega128A3
Pavel_Bor
сообщение Oct 5 2011, 13:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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]
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 18)
zombi
сообщение Oct 6 2011, 14:31
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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.

Вот это вообще не понятно laughing.gif
что значит без RET вываливается?

Цитата(Pavel_Bor @ Oct 6 2011, 13:01) *
Строки ниже дают доступ на несколько секунд к изменению конфигурации.
ldi rtmp,0xD8
out CPU_ccp,rtmp

Т.е. несколько секунд полного беспредела biggrin.gif
Вы случаем нечё не путаете? wacko.gif
Где про это можно в DS прочитать??? rolleyes.gif
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Oct 6 2011, 20:34
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 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






Go to the top of the page
 
+Quote Post
Navovvol
сообщение Oct 7 2011, 06:47
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Oct 7 2011, 07:44
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 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

Всем спасибо за замечания и советы.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016