Разъясните чуть подробней,почему после ссылок на все прерывания
закоментированы именно те прерывания,которые используются в программе(Reset и Timer1_comp1),а не наоборот?Логичнее исключить прерывания,которые не используются.Или здесь что-то особенное?
И ещё - при компиляции последней версии проги(с прерываниями)
компилер ругается:
code asm:27 Error:Label'INT0' already defined at line 87 in 'c:\avr\
avrasv\appnotes\2313DEF.inc'
Аналогично и о "INT1". :
В подпрограмме Delay наверное надо:
out DDRB,Temp
-----------------------------------------------------------------------------------
И не сомневайся даже
отдых - кайф,работа - лажа
Я ж уже давно это исправил...
Переобзови метки, например INT_0, INT_1.
По прерываниям: смари, в самом начале проги, по каждому вектору прерывания мы даем ссылку на обработчик этого прерывания. Если это прерывание используется и обработчик для него написан - замечательно. Но если прерывания нет, мы все равно обязаны написать метку на обработчик. Иначе компилер, увидев ссылку на несуществующую метку страшно выругается и обидится Поэтому мы прописываем пачкой все метки и выполняем по ним команду reti.
Можно было бы просто поставить по векторам ссылки только на обработчики используемых прерываний, а остальные адреса забить nop'ами:
Но это не очень удобно: если мы захотим использовать в программе еще какое-то прерывание - надо будет лезть в даташит, смотреть его адрес и прописывать.
А данная структура универсальна. Всего-то надо - закомментировать используемые прерывания и все...
Адреса прерываний нахально слиты из даташита на Мегу16, но вместо прерывания по таймеру на строке
rjmp TIM1_COMPA ; Timer1 CompareA Handler программа переходит на строчку
rjmp USART_UDRE ; UDR Empty Handler
Не могу понять почему. Поясните плиз если знаете ответ.
Еще, стек необходимо инициализировать до его использования, лучше всего если это будут первые строки.
команды относящиеся к инициализации одной и той же перефирии лучше писать подряд, иначе уже через месяц вы убьете кучу времени и сил пытаясь разобраться в вами же написаном.
если начинаете программировать то лучше сразу приучить себя к единому порядку оформления текста программ, и заставьте себя перед метками переходов на обработчики прерываний ставить директиву .org <addr> ;Описание вектора, очень помогает при переброске программы с одного МК на другой, (к примеру с меги16 на мегу32 если вдруг памяти не хватит)
Поверьте, в будушем это съэкономит вам такую уйму времени...
Обучалка великолепная, за что отдельная благодарность. Только при работе с прерыванием по таймеру огни стартуют начиная со второго. Оно и правильно, ведь сначала сдвигаем а потом уже выводим на индикацию. Вроде мелочь, а как-то того...
З.Ы. А вот за что учетку мою удалили (второй раз уже) непонятно. Я так понимаю, под тяжелую руку санитара попал. Пришлось заново регистрироваться.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Всё просто. В таблице векторов на каждый вектор отводится 2 слова или 4 байта. Команда RJMP занимает 2 байта, а JPM все 4.
В вашем примере таблица стала в 2 раза короче.
Как вариант для проверки, добавьте после каждого RJMP команду NOP. Будет работать. Но не делайте так в программах
GP1 и asteroid7 спасибо! Сравнил даташиты - точно в тиньке адреса различаются на байт а в меге на слово. Ну и ну ... может на Сях начать писать пока не поздно. Таких подводных камней я не ожидал ... это что мне теперь размер всех команд учить что ли? И где их взять? В смысле размеры команд.
Razor писал(а):... это что мне теперь размер всех команд учить что ли? И где их взять? В смысле размеры команд.
Да нет. Достаточно учитывать если память контроллера до или равно 4кБ - RJMP, больше JMP.
Хороший хелп по командам есть в AVR Studio. Постоянно им пользуюсь.
Razor писал(а):...Ну и ну ... может на Сях начать писать пока не поздно. Таких подводных камней я не ожидал ...
Ну да, на Си проще, а на Бейсике так вообще элементарно. Дело-то в другом. Знать язык, и писать на нем - две разные вещи. Писать можно на чем угодно, а вот для того что бы "увидеть" что происходит внутри контроллера при выполнении программы - без АСМ не обойтись.
P.S. Да и вообще, этот язык интересен и логичен. Сам сейчас занимаюсь его изучением.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон