А это значит, что тот-же мой пример, который я показывал выше, можно оформить и так: Показываю только вектора:
Код:
.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 ;Это указывает на конец таблицы векторов прерываний
_________________ I am DX168B and this is my favourite forum on internet!
А это значит, что тот-же мой пример, который я показывал выше, можно оформить и так: Показываю только вектора:
Код:
.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 ;Это указывает на конец таблицы векторов прерываний
первый раз встретил ситуацию, ктогда кто-то другой (не я) советует ПРАВИЛЬНО оформлять векторы прерываний!!!! браво!!!! неужели в массы пошло ЗНАНИЕ?!?!?!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
первый раз встретил ситуацию, ктогда кто-то другой (не я) советует ПРАВИЛЬНО оформлять векторы прерываний!!!! браво!!!! неужели в массы пошло ЗНАНИЕ?!?!?!
Всё зависит от количества словленных граблей. Видимо, DX168B их целый сарай насобирал
А серьёзно - у большинства осваивающих МК дело редко доходит дальше мигания светодиодами. Типа получилось - хорошо, теперь я знаю и умею, если что понадобится - напишу.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт фев 11, 2011 12:51:03
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Нееет. С векторами прерываний у меня никогда граблей небыло. Это совсем элементарное. Когда читал первый раз о векторах, я уже знал, что это такое, так как до АВРов имел дело с другими процессорами. Но в них был только один вектор, а хто вызвал прерывание - это уже надо было вручную флаги проверять. Там и ассемблер был совсем другой. Просто так, во первых, как сказал ARV - правильно, а во вторых - писанины намного меньше и в третьих - не ошибёшься, если правильно всё сделаешь. Мне этот метод самому понравился, вот и пользуюсь.
_________________ I am DX168B and this is my favourite forum on internet!
Пожалуста подскажите, почему при INC r17 значение в регистре не меняеться напроизвольное от 0 до 11? причем если выполнять пожагово, то все выполняется корректно..
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб фев 12, 2011 21:04:31
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
А потому что МК восьмибитный. Сколько будет комбинаций единиц и нулей в восьми битах? Верно - 256 комбинаций. Начиная от 0b00000000 (0) и заканчивая 0b11111111 (255). То есть это циклическая особенность. Было 0x00, после декремента стало 0xFF, ещё один декремент и стало 0xFE , ещё один и стало 0xFD. И так пока не станет 0x00. За тем всё повторяется. То есть число циклом крутится, как белка в колесе.
_________________ I am DX168B and this is my favourite forum on internet!
У тебя восемь светодиодов. Только восемь. Изобрази ими число -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"
Ладно про 256 понял, я и сам так думал, т. к. 256/8. Но вот 128? Откуда? Понятно что это половина от 256.
ЗЫ. Светодиодов у мну нет, так как нужен контроллер и программатор а их на халяву не дают, а денга нет т. к. недавно был куплен осцилл, и еще делаеться блок питания, у мну только комп и вы!
Последний пост я ваще не вкуриваю, можно это как-нить для семикласника объяснить?
_________________ Ко мне можно на "ты", так даже лучше!
10000001 = -1. первый "светодиод" знак числа (0-положительное, 1-отрицательное), остальные семь - модуль числа в двоичном формате.
Ну а теперь попробуй применить обычную арифметическую операцию - вычти из него единицу. Должно быть -2, а у тебя получится -0 (кстати, будет два нуля, -0 и +0 (10000000 и 00000000) )
10000001 = -1. первый "светодиод" знак числа (0-положительное, 1-отрицательное), остальные семь - модуль числа в двоичном формате.
Ну а теперь попробуй применить обычную арифметическую операцию - вычти из него единицу. Должно быть -2, а у тебя получится -0 (кстати, будет два нуля, -0 и +0 (10000000 и 00000000) )
так из него я буду вычитать сложением, у меня же для этого единица стоит, обозначающая отрицательное число, она и будет инвертировать вычисление))) а два нуля, это да, согласен) пофигу)))) это же только пример для понимания)
sergeys писал(а):
Последний пост я ваще не вкуриваю, можно это как-нить для семикласника объяснить?
Если это по поводу моего поста, то задавайте вопросы. Будем объяснять.
А фиг получится! Подумай логически. АЛУ пофигу, что там за число. Если ему надо вычесть из 10 число 5 - он вычтет, результат будет 5. А если из 10 вычесть 20? Получается вручную будешь в цикле вычитать до нуля и прибавлять после? А если эти данные неподконтрольны программисту (приходят извне)?
Именно поэтому и приняли второй способ. Во-первых ноль один, во-вторых все арифметические операции корректны.
Именно поэтому и приняли второй способ. Во-первых ноль один, во-вторых все арифметические операции корректны.
да что ты прицепился) я же написал: "это же только пример для понимания)" было 10 = 00001010, нужно вычесть 20 = 00010100, видим что 20 больше 10, тогда выставляем старший разряд и вычитаем из двадцати десять. получаем 10 и бит означающий отрицательное число. то же самое принять положительное направление тока от "+" к "-", но ведь на самом деле движутся электроны и движутся от "-" к "+". Просто условность.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 157
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения