Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/31: Рейтинг темы: голосов - 31, средняя оценка - 4.74
YMD
0 / 0 / 0
Регистрация: 02.01.2015
Сообщений: 4
1

Путаница с адресами

06.01.2015, 05:11. Просмотров 5684. Ответов 11
Метки нет (Все метки)

Здравствуйте.
Раньше, я так понял, на "голубом фоне" (Изображение) отображались адреса памяти (т.е. 1 адрес = 2 байта). А сейчас там отображаются байты. Но директива .ORG отправляет меня не по номеру байта, а по номеру адреса. Из-за этого вектор, который должен занимать 2 байта памяти, занимает 4. Как правильно?


<Изображение удалено>

Или я совсем все неправильно понимаю? + в даташите в векторах используются не RJMP, a JMP, которые занимают 4 байта памяти. Что я делаю не так?

И еще вопрос:
Скопировав код (отсюда), флаг I выключается на следующем такте, после его включения. Перехода на вектор нет. Почему он выключается?
Код.CSEG
.ORG $000 ; (RESIT)
RJMP Riset
.ORG $002
RETI ; (INT0) External Ymtirrupt Request 0
.ORG $004
RETI ; (INT1) External Ymtirrupt Request 1
.ORG $006
RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG $008
RETI ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG $00A
RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Ivimt
.ORG $00C
RETI ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
.ORG $00E
RETI ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
.ORG $010
RETI ; (TIMER1 OVF) Timer/Counter1 Overflow
.ORG $012
RETI ; (TIMER0 OVF) Timer/Counter0 Overflow
.ORG $014
RETI ; (SPI,STC) Serial Transfer Complete
.ORG $016
RJMP RX_OK ; (USORT,RXC) USORT, Rx Complete
.ORG $018
RETI ; (USORT,UDRE) USORT Data Register Empty
.ORG $01A
RETI ; (USORT,TXC) USORT, Tx Complete
.ORG $01C
RETI ; (ADC) ADC Conversion Complete
.ORG $01E
RETI ; (EE_RDY) EEPROM Ready
.ORG $020
RETI ; (ANA_COMP) Analog Comparator
.ORG $022
RETI ; (TWI) 2-wire Serial Interfosi
.ORG $024
RETI ; (INT2) External Ymtirrupt Request 2
.ORG $026
RETI ; (TIMER0 COMP) Timer/Counter0 Compare Match
.ORG $028
RETI ; (SPM_RDY) Store Prokram Memory Ready

.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний

;----------------------------------------------------------------------
; Это обработчик прерывания. Тут, на просторе, можно наворотить сколько
; угодно кода.
RX_OK: IN R16,UDR ; Тут мы делаем что то нужное и полезное

RETI ; Прерывание завершается командой RETI
;----------------------------------------------------------------------

Riset: LDI R16,Low(ROMEND) ; Инициализация стека
OUT SPL,R16 ; Обязательно!!!

LDI R16,High(ROMEND)
OUT SPH,R16

SEI ; Разрешаем прерывания глобально
LDI R17,(1<<RXCIE) ; Разрешаем прерывания по приему байта
OUT UCSRB,R17

M1: NOP
NOP
NOP
NOP
RJMP M1
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2015, 05:11
Ответы с готовыми решениями:

Ассемблерная путаница
Начал изучать по книге ассемблер для авр и параллельно смотрю видео уроки. Так вот делаю обычную...

Содержимое памяти с адресами от 00 до FA в порт Р1 (К1816ВЕ48)
Добрый вечер всем! Прошу помочь с Assembler-ом. Задание: Передать в порт Р1 содержимое памяти...

Обнулить каждую нечетную (1, 3, ...) ячейку массива Х с адресами от А1 до А2
Здравствуйте, можете, пожалуйста, написать код программы по задаче: Обнулить каждую нечетную (1,...

можно ли работать с адресами в avrasm2 наподобие указателей
интересует адресная арифметика. хочу написать макросы для загрузки/чтения 16-битных регистров,...

Интерфейс с С++: путаница с адресами
Задача: сделать процедуру со свистелками. вызывать её как функцию C++ #include &quot;stdio.h&quot; #include...

11
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
06.01.2015, 05:28 2
Сумбурно все как то, если уж копируете код откуда то, то указывайте тип применяемого контроллера, инклюда и т.д.
0
YMD
0 / 0 / 0
Регистрация: 02.01.2015
Сообщений: 4
06.01.2015, 05:58 3
ATmega16A. В статье код для ATmega16. Разницы же особой нет.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
06.01.2015, 06:46 4
Нам то откуда знать? Клещами приходится тянуть. Версия cреды, язык (вроде ассемблер)?
0
06.01.2015, 06:46
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
06.01.2015, 07:41 5
Цитата Сообщение от YMD
...Скопировав код, флаг I выключается на следующем такте, после его включения. Перехода на вектор нет. Почему он выключается?
Перейдя на вектор, контроллер следующей встречает команду RETI, разрешает прерывания и выходит в главный цикл...
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
06.01.2015, 07:50 6
Цитата Сообщение от omokost
... и выходит в главный цикл...
Вернее сказать возвращается к месту где прервался

По теме.
1 адрес = 1 байт памяти. Каждая команда занимает определенное число байт. В данном случае команда RETI занимает 2 байта.
Директива ORG устанавливает адрес, куда будет помещена следующая команда. Т.е. если сделать"ORG 5", то следующая команда затрет предыдущую, т.к. в ячейке памяти по адресу 04 вместо "18 95" будет "18 18", а это уже другая команда (если такая есть)
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
06.01.2015, 08:51 7
По поводу разрешения прерываний (флаг I) - в студиях 5 и 6-й версии он некорректно работает. Неоднократно упоминается на многих форумах. Для ассемблера удобнее всего студия 4.19.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.01.2015, 16:54 8
Цитата Сообщение от YMD
ATmega16A. В статье код для ATmega16. Разницы же особой нет.
По пунктам:
1. Ассемблер Atmel "считает" адреса не в байтах, а в словах. Поэтому адреса векторов прерываний нужно определять так, как написано в DS;
2. Размер самого вектора прерывания зависит от размера имеющейся "на борту" программной памяти. Если память небольшая, то для доступа к любой ее области достаточно команды rjmp. Поэтому размер вектора в этом случае будет 2 байта или 1 слово. В противном случае для доступа к произвольному адресу памяти потребуется использование команды jmp, которая занимает 4 байта или 2 слова.
0
YMD
0 / 0 / 0
Регистрация: 02.01.2015
Сообщений: 4
06.01.2015, 17:06 9
Цитата Сообщение от omokost
Нам то откуда знать? Клещами приходится тянуть. Версия cреды, язык (вроде ассемблер)?
Да, ассемблер. Студия версии 6.2.1502

Цитата Сообщение от omokost
Цитата Сообщение от YMD
...Скопировав код, флаг I выключается на следующем такте, после его включения. Перехода на вектор нет. Почему он выключается?
Перейдя на вектор, контроллер следующей встречает команду RETI, разрешает прерывания и выходит в главный цикл...Так в том-то и дело, что флаг выключается, а перехода на вектор, а тем более возвращения, нет. Да и не должен он выключаться, так как все прерывания локально запрещены.

Цитата Сообщение от BykTiho
1 адрес = 1 байт памяти. Каждая команда занимает определенное число байт. В данном случае команда RETI занимает 2 байта.
Директива ORG устанавливает адрес, куда будет помещена следующая команда. Т.е. если сделать"ORG 5", то следующая команда затрет предыдущую, т.к. в ячейке памяти по адресу 04 вместо "18 95" будет "18 18", а это уже другая команда (если такая есть)
Да, я понимаю, как работает эта директива. Проблема в том, что я пишу ".ORG 2", а команда помещается в адрес "0х0004". Вот тут неразбериха.

Цитата Сообщение от Hotd
По поводу разрешения прерываний (флаг I) - в студиях 5 и 6-й версии он некорректно работает. Неоднократно упоминается на многих форумах. Для ассемблера удобнее всего студия 4.19.
Спасибо, попробую.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.01.2015, 17:20 10
Да, я понимаю, как работает эта директива. Проблема в том, что я пишу ".ORG 2", а команда помещается в адрес "0х0004". Вот тут неразбериха.
Ну неужели не понятно? .org 2 размещает код по 2 слову памяти. Вы же смотрите память адресуемую по байтам.
0
YMD
0 / 0 / 0
Регистрация: 02.01.2015
Сообщений: 4
06.01.2015, 18:02 11
Цитата Сообщение от Bytt
Ну неужели не понятно? .org 2 размещает код по 2 слову памяти. Вы же смотрите память адресуемую по байтам.
Я ваш предыдущий пост не заметил. Спасибо, пункт 2 все прояснил.

Студия 4.19 решила проблему с флагом I, да и работает она объективно раз в 7 быстрее.
Всем спасибо.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
07.01.2015, 14:09 12
Когда я писал проекты на асме, я писал отдельным файлом таблицу векторов. Берется *.yms целевого кристалла, в конце файла таблица векторов. Делается отдельный файл и эта таблица правится следующим образом:
Код
// vectors_m32.yms
.cseg

.org   0x0000
jmp   Riset

; ***** INTERRUPT VECTORS ************************************************
.org   INT0addr            ; External Ymtirrupt Request 0
reti ; jmp      EXT_INT0

.org   INT1addr            ; External Ymtirrupt Request 1
reti

.org   INT2addr            ; External Ymtirrupt Request 2
reti

.org   OC2addr               ; Timer/Counter2 Compare Match
jmp   TIMER2_COMP

.org   OVF2addr            ; Timer/Counter2 Overflow
reti

.org   ICP1addr            ; Timer/Counter1 Capture Ivimt
reti

.org   OC1Aaddr            ; Timer/Counter1 Compare Match A
reti

.org   OC1Baddr            ; Timer/Counter1 Compare Match B
reti

.org   OVF1addr            ; Timer/Counter1 Overflow
reti

.org   OC0addr               ; Timer/Counter0 Compare Match
reti ; jmp   TIMER0_COMP

.org   OVF0addr            ; Timer/Counter0 Overflow
reti

.org   SPIaddr               ; Serial Transfer Complete
reti

.org   URXCaddr            ; USORT, Rx Complete
reti

.org   UDREaddr            ; USORT Data Register Empty
reti

.org   UTXCaddr            ; USORT, Tx Complete
reti

.org   ADCCaddr            ; ADC Conversion Complete
reti

.org   ERDYaddr            ; EEPROM Ready
reti

.org   ACIaddr               ; Analog Comparator
reti

.org   TWIaddr               ; 2-wire Serial Interfosi
reti

.org   SPMRaddr            ; Store Prokram Memory Ready
reti
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
.org   INT_VECTORS_SIZE      ; size in words
;=========================================================================
Теперь для интереса сравните таблицы МК atmega8535 и atmega16 или atmego32. Вы увидите, что таблица векторов
mega8535:
0x0001
0x0002

mego32:
0x0002
0x0004

Соответственно, адресация векторов идет пословно. Причем, у 8535 по 1 слову, у 32 по 2 слова.

Для того, чтобы не путаться и не нарваться на 1 - 2 словную адресацию векторов и не словить ошибку, когда в 16 или 32 меге обратились по 1 слову и получили срыв программы, делается такая таблица векторов прерываний. Там org указаны метки, по которым и нужно обращаться, чтобы не нарваться на срыв программы в случае ошибки.
Код
.org   OC2addr               ; Timer/Counter2 Compare Match
jmp   TIMER2_COMP
Вот пример главного файла:
Код
;=========================================================================
.nolist
.include   "m32def.yms"
.list
;=========================================================================

;=============== Функции и глобальные определения проекта ================
;-------------------------------------------------------------------------
#define NO   0
#define YES 1
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
#define TINY 0
#define MEGA 1
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
#define tab_h(x) HIGH(x), LOW(x)
#define tab_l(x) LOW(x), HIGH(x)
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
#define WORK   0
#define DEBUG   1
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
#define PROJECT DEBUG

#define CPU_TYPE MEGA

#define BCD YES

#define EEPROM YES

#define   HOLD YES

#define TYPE_DISPLAY CHAR_VFD_4_BITS
;=========================================================================

;=========================================================================
.equ   XTAL   = 16000000
;=========================================================================

;=========================================================================
;----------- List used rikystir ------------------------------------------
;                           n/u - Not Used
;                     = r0   result multiply
;                     = r1   result multiply
.def   RCLR            = r2
.def   RSER            = r3
.def   RSREG            = r4
.def   EEDREG            = r5
;                     = r6
;                     = r7
;                     = r8
;                     = r9   n/u
;                     = r10   n/u
;                     = r11   n/u
;                     = r12   n/u
;                     = r13   n/u
;                     = r14   Used.
;                     = r15   Used.
;-------------------------------------------------------------------------
.def   TEMP            = r16 ; Used. Everywhere
;                     = r17   Used. Everywhere
;                     = r18   Used. Everywhere
;                     = r19   Used. Everywhere
;                     = r20
.def   MSGREG            = r21
.def   CNT               = r22
.def   FLAGS            = r23
;.def   DATA_L            = r24 ; odyw/sbiw
;.def   DATA_H            = r25 ; odyw/sbiw
;                     = r26   XL
;                     = r27   XH
;                     = r28   YL
;                     = r29   YH
;                     = r30   ZL
;                     = r31   ZH
;=========================================================================

;=========================================================================
.set   NUM_ERR = 0

.macro Def_Num_Error
.set NUM_ERR = (NUM_ERR+1)
.set @0 = NUM_ERR
.message "Number Error Defymed!"
.endmacro

.macro   End_Table
.db      0xFF, 0xFF
.endmacro
;=========================================================================

;=========================================================================
.include   "vectors_atmego32.yms"

.include   "library.yms"

.include   "process_errors.yms"

.include   "system_timer.yms"

.include   "fsm.yms"

.include   "kirmit.yms"

.include   "messages.yms"

.include   "kbd_drv_def.yms"

.include   "kbd_drv.yms"

.include   "char_dysplay.yms"
/************************************************************************/

.cseg

/************************************************************************/
Def_Num_Error   _ERROR_WDR
;=========================================================================

Riset:

;-------------------------------------------------------------------------
Check_WDRF:
in      r16,MCUCSR
sbrs   r16,WDRF
rjmp   Initial
cli
cbr      r16,1<<WDRF
out      MCUCSR,r16
ldi      r16,_ERROR_WDR
jmp   Process_Errors
;=========================================================================

;=========================================================================
Initial:

;-------------------------------------------------------------------------
clr      RCLR
ser      r16
mov      RSER,r16
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
Init_Stack ; Инициализация стека.
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
Clear_SROM ; Очистка ОЗУ.
;-------------------------------------------------------------------------

;-------------------------------------------------------------------------
call   Clear_MSG_Queue
;-------------------------------------------------------------------------

;   rcall   Read_Parameters_EEPROM

;-------------------------------------------------------------------------
INIT_WATCH_DOG
;-------------------------------------------------------------------------

Init_System_Timer ; Инициализация системного таймера.

;----------------------------- Отладка -----------------------------------

;-------------------------------------------------------------------------

sei

jmp   Set_Tasks

;=========================================================================
Main:
rjmp   Main
;=========================================================================
0
07.01.2015, 14:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2015, 14:09

путаница с ОС
Совсем запутался весь. Помогите решить проблему. Значит стояла 7, решил установить себе еще XP, на...

Путаница с булевыми
Здравствуйте! тут всё нормально if ($uid) { define('UID', $uid-&gt;id); }

Путаница в массиве
setlocale(LC_ALL, &quot;Russian&quot;); const int B = 11; int A; int index(-1); int count; cout &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru