Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Первая команда в проекте на асме......
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Potter
Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:

.cseg
.org 130

Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего?
Wild007
Цитата(Potter @ Feb 2 2007, 09:03) *
Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:

.cseg
.org 130

Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего?


.cseg -- Означает, что дальнейшее (код, константы) расположены в "програмном" сегменте памяти.
.dseg -- Означает, что дальнейшее (переменные) расположены в сегменте ОЗУ
.eseg -- Означает, что дальнейшее (константы) расположены в сегменте ПЗУ

.org ХХХ -- это "точка" с которой начинается расположение кода .
mse
Цитата(Potter @ Feb 2 2007, 10:03) *
Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:

.cseg
.org 130

Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего?

Выше товарищ дал пральный ответ. Уточню мала-мала...
.org 130 с самого начала ставить бессмысленно и опасно(в одном флаконе).
Бо у АВРа старт программки после сброса начинается с адреса "0" и дальше лежат фиксированные адреса векторов прерываний. В общем, можете огрести. Почитайте секцыю "Интеррупт" своей АВРы.
el34
mse>org 130 с самого начала ставить бессмысленно и опасно(в одном флаконе).
верно...но....
это не страшно..... если в теле программы(в другом ее месте) присутствует и
.cseg
.org 0.....и там описаны вектора....
Potter
Приогромнеешее спасибо.... Дело в том что я пять лет програмлю авр... Но начал я с разу с С++. А теперь хочу разобраться с ассемблером..... Трудновато получается но вроде получается.... По ходу дела могут еще возникать примитивные вопросы и не судите товарищи я буду просить у вас помощи.....
Wild007
Правильно начинать программу так (ИМХО):
Цитата
.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

тогда при смене камня легче переносить код.
add
Хочу добавить, что если это сегмент кода (.cseg) то
.org 130 ;означает что реальный адрес 260 (те. 260-тый байт)
поскольку адресация двухбайтовая.
Potter
Цитата(add @ Feb 2 2007, 11:53) *
Хочу добавить, что если это сегмент кода (.cseg) то
.org 130 ;означает что реальный адрес 260 (те. 260-тый байт)
поскольку адресация двухбайтовая.


Маленький вопросик... Наверно 130 в данном случае это цифра в шеснадцатиричной системе..... Или я что-то непонимаю.....

И еще... При сумирувание однобайтных чисел: если число при сумирувании больше 255 то в определенном регистре в опреленном бите устанавливается единичка... А остаток от 255 заносится в один из регистров... Так вот... подскажите пожалуйста что это за регистр и что это за бит?
add
Хочу добавить, что если это сегмент кода (.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
Wild007
Цитата
И еще... При сумирувание однобайтных чисел: если число при сумирувании больше 255 то в определенном регистре в опреленном бите устанавливается единичка... А остаток от 255 заносится в один из регистров... Так вот... подскажите пожалуйста что это за регистр и что это за бит?


Код
LDI R16,0xFE
LDI R17,0x02
ADD R16,R17


В результате в R16 "имеем" 0х01, а бит С в регистре SREG устанавливается в 1
Potter
Еще раз спасибо за помощь....
add
Прошу прощения за повторы.. неуспел поправить сообщение.. :-(

Хочу добавить, что если это сегмент кода (.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.с.
mse
Цитата(el34 @ Feb 2 2007, 10:35) *
mse>org 130 с самого начала ставить бессмысленно и опасно(в одном флаконе).
верно...но....
это не страшно..... если в теле программы(в другом ее месте) присутствует и
.cseg
.org 0.....и там описаны вектора....

;О) Я-ж и говорю "В общем, можете огрести." Если бы человек был в курсе, как можно тасовать сегменты, он бы такой вопрос не задавал.
el34
mse>;О) Я-ж и говорю "В общем, можете огрести." Если бы человек был в курсе, как можно тасовать сегменты, он бы такой вопрос не задавал.

абсолютно с Вами согласен, но тем более , если чел пытается понять что значит .cseg ....и будет думать . что .cseg с оргом !=0 в начале это ошибка
это его надолго может запутать и поэтому уточнил....
Wild007
Цитата(el34 @ Feb 2 2007, 10:43) *
mse>;О) Я-ж и говорю "В общем, можете огрести." Если бы человек был в курсе, как можно тасовать сегменты, он бы такой вопрос не задавал.

абсолютно с Вами согласен, но тем более , если чел пытается понять что значит .cseg ....и будет думать . что .cseg с оргом !=0 в начале это ошибка
это его надолго может запутать и поэтому уточнил....

Не грузите человека сразу и по многу smile.gif . А то у него каша в голове будет образовываться smile.gif . smile.gif smile.gif
el34
Wild007>Не грузите человека сразу и по многу А то у него каша в голове будет образовываться

обращаю Ваше внимание на

Potter>Дело в том что я пять лет програмлю авр...

так что дело серьезное!

пс я на авр-е программил 3 дня....спаял подцепил бластер...зашил...и ушел...
поэтому по авр-у сказать ничего путного (думаю это замето) не могу...smile.gif
Wild007
Цитата(el34 @ Feb 2 2007, 11:23) *
Wild007>Не грузите человека сразу и по многу А то у него каша в голове будет образовываться

обращаю Ваше внимание на

Potter>Дело в том что я пять лет програмлю авр...

так что дело серьезное!

Я сам недавно переходил с програмирования на асьме на Си и еще помню какая каша, поначалу, была в голове. Постепенно различия в подходах к написанию программ устаканиваются и ты спокойно воспринимаешь любую информацию smile.gif
el34
Wild007>Я сам недавно переходил с програмирования на асьме на Си и еще помню какая каша....

мне кажется у Вас немного другой случай....ведь
-при программировании на асме надо знать процессор
-при программировании на си надо знать си...ну и потом уже детали компилятора а уж потом процессора...
это конечно утрированно .....но мне кажется в этом суть ....IMHO

к стати, думаю что в сишном компиляторе для авр есть какие нибудь #phase для локализации кода -аналоги .org ... не так ли?
SasaVitebsk
Старайся работать также как ты и работал в Си. То есть избегать конкретных цифр. Применять переменные и метки.

Начало будет выглядеть (в небольшом проекте) примерно так:

Код
.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

.....


Можно также указывать мнемонические адреса векторов прерываний. Широко используются макроопределения.
Сергей Борщ
Цитата(Potter @ Feb 2 2007, 09:39) *
Дело в том что я пять лет програмлю авр... Но начал я с разу с С++. А теперь хочу разобраться с ассемблером..... Трудновато получается но вроде получается....
Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом: Пишу кусочек на С. В опциях компилятора даю команду генерить листинг с ассемблерными мнемониками. Смотрю в этот листинг.
add
Цитата
Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом:

Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот.

Цитата
Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом:

Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот.

Цитата
Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом:

Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот.
_Bill
[quote name='add' date='Feb 2 2007, 13:47' post='205490']
[quote]Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом:[/quote]
Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот.

[quote]
А какие там хитрости. Программа разбивается на отдельные программные модули. Имя головной функции - main. Все.
SasaVitebsk
Цитата(add @ Feb 2 2007, 14:50) *
Цитата
Я все последние несколько семейств осваиваю в таком же направлении (C->asm). Могу поделиться своим методом:

Поделился бы кто опытом (asm->C) :-) , а именно хотелось бы посотреть примеры кода рабочих программ, желательно полностью(не кусками) с начальной инициализацией.. и подключением там всяких библиотек.. Поскольку сам код в принципе понятен, хотелось бы увидеть структуру построения программы и всякие хитрости..:-/ вот.


В Си многое зависит от компилятора. Для IAR я писал простенький проект. Он закончен. не претендую на роль учителя, но посмотреть как и что можно. А простота проекта, возможно, Вам поможет.

http://electronix.ru/forum/index.php?showtopic=23814
add
Wild007, невнимательно читаете посты..:-( речь шла про Си.
SasaVitebsk, пасиба, в тему т.к. писал на асме работу с датчиками далласа и жки, проще будет разобраться:-)
prottoss
Цитата(Potter @ Feb 2 2007, 14:03) *
Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:
.cseg
.org 130
Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего?
Уже много чего насоветовали в топике smile.gif Добавлю лишь несколько фалов (PDF), по которым я начал свое знакомство с AVR. Не помню, с каких ресурсов я это взял, так как это было три года назад smile.gif , если кто увидит свое, не пинайте сильно smile.gif

1. Справка по Ассемблеру AVR - довольно удобная штука если хочется быстро найти инфо по команде или директиве ассемблера

2. Система команд AVR - в этом документе все команды подробно расписанны

3. Тех.описание на МК AVR - хотя документ довольно старый, но интерес представляет описание

ATmega603, ATmega603L, ATmega103, ATmega103L - полный перевод из даташита, а так как ядро практически одно и тоже у более современных МК данной серии, то, кому тяжело читать даташиты на АнглицкОм - это в какой то степени просто кладезь информации по работе ядра и периферии

Все доки на русском
Dopler
Цитата(prottoss @ Feb 2 2007, 17:35) *
Цитата(Potter @ Feb 2 2007, 14:03) *
Значит... Создал проект в AVR_studio...... С самого начала я пишу вот такую команду:
.cseg
.org 130
Я не совсем понимаю что она означает.... Я так понимаю что это я указываю размер чего-то.... Но чего?
Уже много чего насоветовали в топике smile.gif Добавлю лишь несколько фалов (PDF), по которым я начал свое знакомство с AVR. Не помню, с каких ресурсов я это взял, так как это было три года назад smile.gif , если кто увидит свое, не пинайте сильно smile.gif

1. Справка по Ассемблеру AVR - довольно удобная штука если хочется быстро найти инфо по команде или директиве ассемблера

2. Система команд AVR - в этом документе все команды подробно расписанны

3. Тех.описание на МК AVR - хотя документ довольно старый, но интерес представляет описание

ATmega603, ATmega603L, ATmega103, ATmega103L - полный перевод из даташита, а так как ядро практически одно и тоже у более современных МК данной серии, то, кому тяжело читать даташиты на АнглицкОм - это в какой то степени просто кладезь информации по работе ядра и периферии

Все доки на русском



А появились эти документы еще в далеком 1999 от господ из КТЦ МК. Не стоит забывать, что некоторые команды с тех пор добавились. Mul, MOVW и т.д.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.