Страница 69 из 400

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт фев 11, 2011 02:10:45
DX168B
Ну за успех ликбеза, поздравляю. :beer:
Ещё один совет, по поводу оформления векторов. :)
Если заглянуть в файл m16def.inc то там можно найти следующее:

Код: Выделить всё

.equ	INT0addr=$002	;External Interrupt0 Vector Address
.equ	INT1addr=$004	;External Interrupt1 Vector Address
.equ	OC2addr =$006	;Output Compare2 Interrupt Vector Address
.equ	OVF2addr=$008	;Overflow2 Interrupt Vector Address
.equ	ICP1addr=$00A	;Input Capture1 Interrupt Vector Address
.equ	OC1Aaddr=$00C	;Output Compare1A Interrupt Vector Address
.equ	OC1Baddr=$00E	;Output Compare1B Interrupt Vector Address
.equ	OVF1addr=$010	;Overflow1 Interrupt Vector Address
.equ	OVF0addr=$012	;Overflow0 Interrupt Vector Address
.equ	SPIaddr =$014	;SPI Interrupt Vector Address
.equ	URXCaddr=$016	;UART Receive Complete Interrupt Vector Address
.equ	UDREaddr=$018	;UART Data Register Empty Interrupt Vector Address
.equ	UTXCaddr=$01A	;UART Transmit Complete Interrupt Vector Address
.equ	ADCCaddr=$01C	;ADC Interrupt Vector Address
.equ	ERDYaddr=$01E	;EEPROM Interrupt Vector Address
.equ	ACIaddr =$020	;Analog Comparator Interrupt Vector Address
.equ    TWIaddr =$022   ;Irq. vector address for Two-Wire Interface
.equ	INT2addr=$024   ;External Interrupt2 Vector Address
.equ	OC0addr =$026   ;Output Compare0 Interrupt Vector Address
.equ	SPMRaddr=$028   ;Store Program Memory Ready Interrupt Vector Address
А это значит, что тот-же мой пример, который я показывал выше, можно оформить и так:
Показываю только вектора:

Код: Выделить всё

.cseg
.org 0x0000
jmp RESET ;От суда мы идем в начало программы, после подачи питания.
.org OVF1addr
jmp TIM1_OVF ;От суда мы идём в обработку прерывания по переполнению таймера 1
.org URXCaddr
jmp USART_RXC ;От суда мы идём в обработку прерывания приёма данных с USART
.org ADCCaddr
jmp ADC ;От суда мы идём в обработку прерывания АЦП
.org INT_VECTORS_SIZE ;Это указывает на конец таблицы векторов прерываний

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт фев 11, 2011 08:25:14
ARV
DX168B писал(а):А это значит, что тот-же мой пример, который я показывал выше, можно оформить и так:
Показываю только вектора:

Код: Выделить всё

.cseg
.org 0x0000
jmp RESET ;От суда мы идем в начало программы, после подачи питания.
.org OVF1addr
jmp TIM1_OVF ;От суда мы идём в обработку прерывания по переполнению таймера 1
.org URXCaddr
jmp USART_RXC ;От суда мы идём в обработку прерывания приёма данных с USART
.org ADCCaddr
jmp ADC ;От суда мы идём в обработку прерывания АЦП
.org INT_VECTORS_SIZE ;Это указывает на конец таблицы векторов прерываний
первый раз встретил ситуацию, ктогда кто-то другой (не я) советует ПРАВИЛЬНО оформлять векторы прерываний!!!! браво!!!! неужели в массы пошло ЗНАНИЕ?!?!?!

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт фев 11, 2011 10:27:56
ploop
первый раз встретил ситуацию, ктогда кто-то другой (не я) советует ПРАВИЛЬНО оформлять векторы прерываний!!!! браво!!!! неужели в массы пошло ЗНАНИЕ?!?!?!
Всё зависит от количества словленных граблей. Видимо, DX168B их целый сарай насобирал :))

А серьёзно - у большинства осваивающих МК дело редко доходит дальше мигания светодиодами. Типа получилось - хорошо, теперь я знаю и умею, если что понадобится - напишу.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт фев 11, 2011 12:51:03
DX168B
Нееет. С векторами прерываний у меня никогда граблей небыло. :)
Это совсем элементарное. Когда читал первый раз о векторах, я уже знал, что это такое, так как до АВРов имел дело с другими процессорами. Но в них был только один вектор, а хто вызвал прерывание - это уже надо было вручную флаги проверять. Там и ассемблер был совсем другой.
Просто так, во первых, как сказал ARV - правильно, а во вторых - писанины намного меньше и в третьих - не ошибёшься, если правильно всё сделаешь. :)
Мне этот метод самому понравился, вот и пользуюсь. :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт фев 11, 2011 19:55:35
Jack_A
DX168B писал(а):

Код: Выделить всё

.cseg
.org 0x0000
jmp RESET ;От суда мы идем в начало программы
От суда никакие векторы не спасут, только кража, пожар или взятка :-)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 16:37:54
Rikorsev
Пожалуста подскажите, почему при INC r17 значение в регистре не меняеться напроизвольное от 0 до 11? причем если выполнять пожагово, то все выполняется корректно..


return1:clr R17
return2:out 0x12,R17
inc R17
cpi R17,0x0b
brsh return1
brne return2

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 16:54:14
sergeys
Мяууф! Вот хотел раньше спросить, но чето не спросил. Вот в обучалке написано

Код: Выделить всё

ldi temp, 0
loop: dec  temp
brne loop
и
Сначала мы инициализировали Temp числом 0. Далее из Temp вычитается 1. Его значение становится -1 (иначе говоря, 255).
Почему 255? Вес-то и вопрос!

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 17:17:12
akl
Повикипедируй - "дополнительный код числа"

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 18:18:22
ploop
Почему 255? Вес-то и вопрос!
А что должно быть? :)
При этом устанавливается флаг переноса. Если это младший разряд числа - из старшего вычитается единица, млпдший становится 255.

Например, если из 50 вычесть 1 сколько будет? И что будет с младшим разрядом? Был 0, станет 9 (49).

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 18:43:55
sergeys
ну был 0, вычли 1 сколько будет? -1, а откуда 255? если 255, то было 256, откуда?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 18:46:52
ChipKiller

Код: Выделить всё

ldi temp, 0
loop: dec  temp
brne loop
ploop писал(а):При этом устанавливается флаг переноса.
.. нет - инструкции dec и inc не влияют на флаг переноса.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 19:07:27
sergeys
Ну так почему 255? Почему не 300 например, откуда это число? 0-1=-1

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 21:04:31
DX168B
А потому что МК восьмибитный.
Сколько будет комбинаций единиц и нулей в восьми битах? Верно - 256 комбинаций.
Начиная от 0b00000000 (0) и заканчивая 0b11111111 (255).
То есть это циклическая особенность. Было 0x00, после декремента стало 0xFF, ещё один декремент и стало 0xFE , ещё один и стало 0xFD. И так пока не станет 0x00. За тем всё повторяется. То есть число циклом крутится, как белка в колесе.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Сб фев 12, 2011 21:13:25
ploop
.. нет - инструкции dec и inc не влияют на флаг переноса.
Я даже не видел, что речь идёт о dec. А так да, только Z и еще какие-то.
ну был 0, вычли 1 сколько будет? -1, а откуда 255? если 255, то было 256, откуда?
У тебя восемь светодиодов. Только восемь. Изобрази ими число -1

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс фев 13, 2011 02:46:59
ibiza11
ploop писал(а):У тебя восемь светодиодов. Только восемь. Изобрази ими число -1
10000001 = -1. первый "светодиод" знак числа (0-положительное, 1-отрицательное), остальные семь - модуль числа в двоичном формате. :)))

TO ALL
только то, что я написал всего условность, которую я могу для себя принять. на самом деле условность давно уже приняли и она отличается от моей.
в этой арифметике принято два вида целых чисел: знаковые и беззнаковые. (для примера рассмотрим 8-битную машину)
беззнаковые: 8 бит данных, которые соответствуют числу от 0 до 255. максимальное кол-во комбинаций в 8-битном регистре равно 2^(8)=256 (два в восьмой степени), 8 это число бит в регистре. соответственно если регистр 16-битный, то кол-во комбинаций равно 2^(16)=65536.
знаковые: Это те же 8 бит данных, кол-во комбинаций также не изменилось и равно 256, только люди по другому их "конвертируют" в нашу арифметику, а именно, если старший бит (в данном случае самый левый) равен нулю(0), то число как и обычное беззнаковое конвертируется в значения от 0 до 127,
(кстати кол-во комбинаций от 0 до 127 = 128 = 2^(7) , подумайте над этим на досуге),
если же старший бит равен единице(1), то число отрицательное, остальная часть числа воспринимается как модуль числа, только не в нормальном формате, а инвертированном, а именно 1111111=1, 1111110=2, 1111101=3.....0000001=127, 0000000=0. :)))

в итоге число b'10000010 можно представить двумя способами:
1)если число беззнаковое, то оно равно "129"
2)если число знаковое, то оно равно "-126"

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс фев 13, 2011 07:35:10
sergeys
Ладно про 256 понял, я и сам так думал, т. к. 256/8. Но вот 128? Откуда? Понятно что это половина от 256.

ЗЫ. Светодиодов у мну нет, так как нужен контроллер и программатор а их на халяву не дают, а денга нет т. к. недавно был куплен осцилл, и еще делаеться блок питания, у мну только комп и вы! :)))

Последний пост я ваще не вкуриваю, можно это как-нить для семикласника объяснить?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс фев 13, 2011 10:55:11
ploop
10000001 = -1. первый "светодиод" знак числа (0-положительное, 1-отрицательное), остальные семь - модуль числа в двоичном формате.
Ну а теперь попробуй применить обычную арифметическую операцию - вычти из него единицу. Должно быть -2, а у тебя получится -0 (кстати, будет два нуля, -0 и +0 (10000000 и 00000000) :) )

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс фев 13, 2011 11:21:45
ibiza11
ploop писал(а):
10000001 = -1. первый "светодиод" знак числа (0-положительное, 1-отрицательное), остальные семь - модуль числа в двоичном формате.
Ну а теперь попробуй применить обычную арифметическую операцию - вычти из него единицу. Должно быть -2, а у тебя получится -0 (кстати, будет два нуля, -0 и +0 (10000000 и 00000000) :) )
так из него я буду вычитать сложением, у меня же для этого единица стоит, обозначающая отрицательное число, она и будет инвертировать вычисление))) а два нуля, это да, согласен) пофигу)))) это же только пример для понимания)
sergeys писал(а):Последний пост я ваще не вкуриваю, можно это как-нить для семикласника объяснить?
Если это по поводу моего поста, то задавайте вопросы. Будем объяснять. :?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс фев 13, 2011 11:44:55
ploop
так из него я буду вычитать сложением
А фиг получится!
Подумай логически. АЛУ пофигу, что там за число. Если ему надо вычесть из 10 число 5 - он вычтет, результат будет 5. А если из 10 вычесть 20? Получается вручную будешь в цикле вычитать до нуля и прибавлять после?
А если эти данные неподконтрольны программисту (приходят извне)?

Именно поэтому и приняли второй способ. Во-первых ноль один, во-вторых все арифметические операции корректны.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс фев 13, 2011 13:07:12
ibiza11
ploop писал(а):Именно поэтому и приняли второй способ. Во-первых ноль один, во-вторых все арифметические операции корректны.
да что ты прицепился) я же написал: "это же только пример для понимания)"
было 10 = 00001010, нужно вычесть 20 = 00010100, видим что 20 больше 10, тогда выставляем старший разряд и вычитаем из двадцати десять. получаем 10 и бит означающий отрицательное число. :)))
то же самое принять положительное направление тока от "+" к "-", но ведь на самом деле движутся электроны и движутся от "-" к "+". Просто условность.