|
Первая команда в проекте на асме......, Мне не совсем понятно что она означает...... |
|
|
|
Feb 2 2007, 10:14
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Potter @ Feb 2 2007, 09:03)  Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:
.cseg .org 130
Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего? .cseg -- Означает, что дальнейшее (код, константы) расположены в "програмном" сегменте памяти. .dseg -- Означает, что дальнейшее (переменные) расположены в сегменте ОЗУ .eseg -- Означает, что дальнейшее (константы) расположены в сегменте ПЗУ .org ХХХ -- это "точка" с которой начинается расположение кода .
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Feb 2 2007, 10:28
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(Potter @ Feb 2 2007, 10:03)  Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:
.cseg .org 130
Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего? Выше товарищ дал пральный ответ. Уточню мала-мала... .org 130 с самого начала ставить бессмысленно и опасно(в одном флаконе). Бо у АВРа старт программки после сброса начинается с адреса "0" и дальше лежат фиксированные адреса векторов прерываний. В общем, можете огрести. Почитайте секцыю "Интеррупт" своей АВРы.
|
|
|
|
|
Feb 2 2007, 10:46
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Правильно начинать программу так (ИМХО): Цитата .CSEG ;********************** Вектора перехода ******************************* .ORG 0 RJMP RESET ;вектор перехода по сбросу .ORG INT0addr ; External Interrupt Request 0 RETI .ORG INT1addr ; External Interrupt Request 1 RETI ; .ORG ICP1addr ; Timer/Counter1 Capture Event RETI .ORG OC1Aaddr ; Timer/Counter1 Compare Match A RETI ;RJMP ;вектор перехода по совпадению таймера1 .ORG OVF1addr ; Timer/Counter1 Overflow RETI ;RJMP ;вектор перехода по переполнению таймера1 .ORG OVF0addr ; Timer/Counter0 Overflow RETI ;RJMP ;вектор перехода по переполнению таймера0 .ORG URXCaddr ; USART, Rx Complete RETI .ORG UDREaddr ; USART Data Register Empty RETI .ORG UTXCaddr ; USART, Tx Complete RETI .ORG ACIaddr ; Analog Comparator RETI .ORG PCIaddr ; RETI .ORG OC1Baddr ; RETI .ORG OC0Aaddr RETI .ORG OC0Baddr ; RETI .ORG USI_STARTaddr ; USI Start Condition RETI .ORG USI_OVFaddr ; USI Overflow RETI .ORG ERDYaddr ; RETI .ORG WDTaddr ; Watchdog Timer Overflow RETI А програмный код: Код .CSEG .ORG INT_VECTORS_SIZE RESET: CLI тогда при смене камня легче переносить код.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Feb 2 2007, 11:04
|

Частый гость
 
Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508

|
Цитата(add @ Feb 2 2007, 11:53)  Хочу добавить, что если это сегмент кода (.cseg) то .org 130 ;означает что реальный адрес 260 (те. 260-тый байт) поскольку адресация двухбайтовая. Маленький вопросик... Наверно 130 в данном случае это цифра в шеснадцатиричной системе..... Или я что-то непонимаю..... И еще... При сумирувание однобайтных чисел: если число при сумирувании больше 255 то в определенном регистре в опреленном бите устанавливается единичка... А остаток от 255 заносится в один из регистров... Так вот... подскажите пожалуйста что это за регистр и что это за бит?
|
|
|
|
|
Feb 2 2007, 11:14
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Хочу добавить, что если это сегмент кода (.cseg) то .org 130 ;означает что реальный адрес 260 (те. 260-тый байт) поскольку адресация двухбайтовая. К примеру если использовать косвенную адресацию,и командой lpm читать данные из флеш,то в регистры zh:zl необходимо записать именно 230. ldi zl,low(230); ldi zh,high(230); lpm ;далее читаем r0 в котором лежит 0x12 .org 130 .db 0x12,0x14 .... зы: Но всеже лучше использовать ссылку на место во flash так: ldi zl,low(data*2) ldi zh,high(data*2); lpm ;далее читаем r0 в котором лежит 0x12 data: .db 0x12,0x14 .... Цитата Маленький вопросик... Наверно 130 в данном случае это цифра в шеснадцатиричной системе..... Или я что-то непонимаю.....
И еще... При сумирувание однобайтных чисел: если число при сумирувании больше 255 то в определенном регистре в опреленном бите устанавливается единичка... А остаток от 255 заносится в один из регистров... Так вот... подскажите пожалуйста что это за регистр и что это за бит? в десятичке-130, 0x130 и 130h (шеснадцатирич) , 0b0000000 - двоичка. При сложении устанавл. перенос флаг "C" регистра SREG. add r16,r17 ;сложение с переносом adc r18,r19
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Feb 2 2007, 11:14
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата И еще... При сумирувание однобайтных чисел: если число при сумирувании больше 255 то в определенном регистре в опреленном бите устанавливается единичка... А остаток от 255 заносится в один из регистров... Так вот... подскажите пожалуйста что это за регистр и что это за бит? Код LDI R16,0xFE LDI R17,0x02 ADD R16,R17 В результате в R16 "имеем" 0х01, а бит С в регистре SREG устанавливается в 1
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Feb 2 2007, 11:20
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Прошу прощения за повторы.. неуспел поправить сообщение.. :-( Хочу добавить, что если это сегмент кода (.cseg) то .org 130 ;означает что реальный адрес 260 (те. 260-тый байт) поскольку адресация двухбайтовая. К примеру если использовать косвенную адресацию,и командой lpm читать данные из флеш,то в регистры zh:zl необходимо записать именно 230. ldi zl,low(230); ldi zh,high(230); lpm ;далее читаем r0 в котором лежит 0x12 .org 130 .db 0x12,0x14 .... зы: Но всеже лучше использовать ссылку на место во flash так: ldi zl,low(data*2) ldi zh,high(data*2); lpm ;далее читаем r0 в котором лежит 0x12 data: .db 0x12,0x14 .... Цитата Маленький вопросик... Наверно 130 в данном случае это цифра в шеснадцатиричной системе..... Или я что-то непонимаю.....
И еще... При сумирувание однобайтных чисел: если число при сумирувании больше 255 то в определенном регистре в опреленном бите устанавливается единичка... А остаток от 255 заносится в один из регистров... Так вот... подскажите пожалуйста что это за регистр и что это за бит? в десятичке-130, 0x130 и 130h (шеснадцатирич) , 0b0000000 - двоичка. При сложении устанавл. перенос флаг "C" регистра SREG. add r16,r17 ;сложение с переносом adc r18,r19 При сумировании никуда ничего незаносится, а устанавливается флаг переноса, и если сложить два регистра без учета перполнения то данные потеряются. т.е 254 + 10 в регистре к которому прибавляли будет 8 и установиться флаг SREG.с.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Feb 2 2007, 12:23
|

инженер
   
Группа: Свой
Сообщений: 717
Регистрация: 4-03-05
Пользователь №: 3 064

|
Wild007>Не грузите человека сразу и по многу А то у него каша в голове будет образовываться обращаю Ваше внимание на Potter>Дело в том что я пять лет програмлю авр... так что дело серьезное! пс я на авр-е программил 3 дня....спаял подцепил бластер...зашил...и ушел... поэтому по авр-у сказать ничего путного (думаю это замето) не могу...
Сообщение отредактировал el34 - Feb 2 2007, 12:32
--------------------
........поужинали вяленой рыбой, кот лежал рядом, молчали.......
|
|
|
|
|
Feb 2 2007, 12:42
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Старайся работать также как ты и работал в Си. То есть избегать конкретных цифр. Применять переменные и метки. Начало будет выглядеть (в небольшом проекте) примерно так: Код .equ TOb = 500; Обновлять данные ч/з 0.5 секунды .equ SegH = 7 ; Сегмент H выведен в D7
; Порт B .equ adr0 = pb0; Тестовая линия 0. .equ adr1 = pb1; Тестовая линия 1. .equ adr2 = pb2; Тестовая линия 2. .equ adr3 = pb3; Тестовая линия 3.
.equ RE = PD2; Разрешение приёма RS485 (0) .equ Kl0 = PD3; Ответ от клавиатуры 0. .equ Kl1 = PD4; Ответ от клавиатуры 1.
.....
.def zap = r1; положение запятой в числе .def tmpr0 = r2; для сохранения r0 в прерываниях .def tmpsreg = r3; для сохранения sreg в прерываниях .def tmpZl = r4; для сохранения Zl в прерываниях .def tmpZh = r5; для сохранения Zh в прерываниях .def par = r6; номер параметра .def Len = r7; длина сообщения .def rCRCl = r8; CRC мл. на приём .def rCRCh = r9; CRC ст. на приём
.....
.equ lbuf = 40
.dseg .org $60 RxBuf: .byte lBuf; Буфер приёма длиной lBuf ERxBuf: ; Адрес конца буфера приёма
n: .byte 8; число bin: .byte 60; для предварительной обработки RStek: .byte 20 Stek:
.....
.cseg rjmp init; Переход на инициализацию
rjmp int_0 rjmp int_1 rjmp Tim1Cap rjmp Tim1CmpA
..... Можно также указывать мнемонические адреса векторов прерываний. Широко используются макроопределения.
|
|
|
|
|
Feb 2 2007, 13:50
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом: Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот. Цитата Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом: Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот. Цитата Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом: Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Feb 2 2007, 15:14
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(add @ Feb 2 2007, 14:50)  Цитата Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом: Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот. В Си многое зависит от компилятора. Для IAR я писал простенький проект. Он закончен. не претендую на роль учителя, но посмотреть как и что можно. А простота проекта, возможно, Вам поможет. http://electronix.ru/forum/index.php?showtopic=23814
|
|
|
|
|
Feb 2 2007, 17:35
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Potter @ Feb 2 2007, 14:03)  Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду: .cseg .org 130 Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего? Уже много чего насоветовали в топике  Добавлю лишь несколько фалов (PDF), по которым я начал свое знакомство с AVR. Не помню, с каких ресурсов я это взял, так как это было три года назад  , если кто увидит свое, не пинайте сильно 1. Справка по Ассемблеру AVR - довольно удобная штука если хочется быстро найти инфо по команде или директиве ассемблера 2. Система команд AVR - в этом документе все команды подробно расписанны 3. Тех.описание на МК AVR - хотя документ довольно старый, но интерес представляет описание
ATmega603, ATmega603L, ATmega103, ATmega103L - полный перевод из даташита, а так как ядро практически одно и тоже у более современных МК данной серии, то, кому тяжело читать даташиты на АнглицкОм - это в какой то степени просто кладезь информации по работе ядра и периферии
Все доки на русском
--------------------
|
|
|
|
|
Feb 2 2007, 22:36
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(prottoss @ Feb 2 2007, 17:35)  Цитата(Potter @ Feb 2 2007, 14:03)  Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду: .cseg .org 130 Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего? Уже много чего насоветовали в топике  Добавлю лишь несколько фалов (PDF), по которым я начал свое знакомство с AVR. Не помню, с каких ресурсов я это взял, так как это было три года назад  , если кто увидит свое, не пинайте сильно 1. Справка по Ассемблеру AVR - довольно удобная штука если хочется быстро найти инфо по команде или директиве ассемблера 2. Система команд AVR - в этом документе все команды подробно расписанны 3. Тех.описание на МК AVR - хотя документ довольно старый, но интерес представляет описание
ATmega603, ATmega603L, ATmega103, ATmega103L - полный перевод из даташита, а так как ядро практически одно и тоже у более современных МК данной серии, то, кому тяжело читать даташиты на АнглицкОм - это в какой то степени просто кладезь информации по работе ядра и периферии
Все доки на русском А появились эти документы еще в далеком 1999 от господ из КТЦ МК. Не стоит забывать, что некоторые команды с тех пор добавились. Mul, MOVW и т.д.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|