Страница 69 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 11, 2011 02:10:45
DX168B
Ну за успех ликбеза, поздравляю.
Ещё один совет, по поводу оформления векторов.
Если заглянуть в файл
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
Мяууф! Вот хотел раньше спросить, но чето не спросил. Вот в обучалке написано
и
Сначала мы инициализировали 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
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 и бит означающий отрицательное число.
то же самое принять положительное направление тока от "+" к "-", но ведь на самом деле движутся электроны и движутся от "-" к "+". Просто условность.