;-- Назначаем имена выводам микроконтроллера (их функции) и регистрам
.equ LED1 =0 ;PB0 Name Output .equ SB2 =1 ;PB1 Name Output .equ SB1 =2 ;PB2 Name Output .equ AnalogIN =3 ;PB3 Name Input .equ LED2 =4 ;PB4 Name Output
.org 0 ;Задание нулевого адреса старта программы rjmp init ;Безусловный переход к метке reset .org 3 ;Задание адреса прерывания по переполнению таймера 0 rjmp timer0_ovf ;Безусловный переход к метке timer0_ovf
ldi Temp, RAMEND ;Загрузка в регистр Temp адреса верхней границы ОЗУ out SPL, Temp ;Адрес границы ОЗУ - в регистр указателя стека SPL ldi Temp, (1<<TOIE0) ;Установка бита разрешения прерывания TOIE0 out TIMSK0,Temp ;Разрешаем прерывание по таймеру ldi Temp, (1<<CS00)|(1<<CS02);Задание делителя частоты Clk/1024 установкой CS00 и CS02 out TCCR0B,Temp ;Включаем делитель частоты Clk/1024 ldi Mask,(1<<4)|(1<<0) ;Задаем конфигурацию выводов на диоды out DDRB, Mask ;РВ0 и РВ4 - выход на диоды sbi PortB,1 ;Включаем второй диод в противофазе ldi Delay,5; ;Задание задержки. Каждая единица - примерно 2 Герца sei ;Глобальное разрешение прерываний
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; Главный программный цикл ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
main: ;Основной цикл программы rjmp main ;Вернуться к метке main
timer0_ovf: ;Прерывание по переполнению таймера 0 dec Delay ;Уменьшаем счетчик задержкина 1 brne exit ;Если Cчетчик задержки не обнулен - возврат из прерывания. Иначе - eor Temp,Mask ;Определяем какой диод горит, а какой потушен out PORTB,temp ;Включаем/выключаем диоды. ldi Delay,5 ;Восстанавливаем значение задержки exit: reti ;Возврат из прерывания
Добрался до пятого задания с отступлением от генеральной линии. В смысле пришлось добавить неизученные ранее инструкции. Это, кстати, "вина" учителя. Не выходит сделать задание строго ограничившись набором изученных инструкций. 8-) Кстати задание 4-2 тоже не сделал. Не знаю куда там EOR приляпать. Без него могу - с ним никак.
Сообщение отредактировал Donke - Понедельник, 02.12.2013, 14:39
Кстати задание 4-2 тоже не сделал. Не знаю куда там EOR приляпать. Без него могу - с ним никак.
А у меня наконец таки получилось, но пришлось в дебаггере посидеть, что бы код отладить
P.S Сергей, не могу вставить код, так как форум пишет "Текст сообщения превышает допустимый лимит" Ну и прикрепить тоже нельзя, пишет "Не допустимый формат изображения"
Кстати нет ли у вас схемы платы под ЛУТ, а то без перемычек не получается красиво сделать.
Добавлено (21.01.2014, 13:09) --------------------------------------------- Donke, вот ответ на 2ое задание из 5го урока, с использованием только изученных команд.
Код
.include "C:\Temp\asm\Appnotes\tn13def.inc" .org 0 ;Задание нулевого адреса старта программы rjmp reset ;Безусловный переход к метке reset .org 3 ;Задание адреса прерывания по переполнению таймера 0 rjmp timer0_ovf ;Безусловный переход к метке timer0_ovf
reset: ldi r16, RAMEND ;Загрузка в регистр r16 адреса верхней границы ОЗУ out SPL, r16 ;Копирование значения из r16 в регистр указателя стека SPL ldi r16, (1<<TOIE0) ;Загрузка в регистр r16 "1", смещенной на TOIE0 out TIMSK0,r16 ;Копирование значения из регистра r16 в регистр TIMSK0 ldi r16, (1<<CS00)|(1<<CS02);Загрузка двух "1", смещенных на CS00 и CS02 out TCCR0B,r16 ;Копирование значения из регистра r16 в регистр TCCR0B ldi r17,(1<<1) ;Загрузка в регистр r17 "1", смещенной на 4 разр. влево out DDRB, r17 ;Копирование из r17 в DDRB (РВ4 - выход) clr r16 ;Очистка регистра r16 ldi r18, 4 ;Частота примерно 0.5Гц sei ;Глобальное разрешение прерываний
main: ;Основной цикл программы rjmp main ;Вернуться к метке main
timer0_ovf: ;Прерывание по переполнению таймера 0 sbci r18, 1 ; Вычитание с преносом brcc return ; Проверка и переход eor r16,r17 ;Исключающее ИЛИ регистров r16 и r17 out PORTB,r16 ;Копирование из r16 в PORTB ldi r18, 4 ;Возобновление знаения регистра r18 reti
return: reti ; Выход из подпрограммы
А вот 4.2
Код
.include "C:\Temp\asm\Appnotes\tn13Adef.inc" ldi r16, RAMEND ;Загрузка в регистр r16 адреса верхней границы ОЗУ out SPL, r16 ;Копирование значения из r16 в регистр указателя стека SPL ldi r18, 0b00000010 ;Загрузка в регистр r17 "1", смещенной на 4 разряда влево ldi r17, 0b00010000 ;Загрузка в регистр r17 "1", смещенной на 4 разряда влево eor r17, r18 ;0b00010010 out DDRB, r17 ;Копирование из r17 в DDRB (РВ4 - выход) ldi r17, 0b00010000 ;Загрузка в регистр r17 "1", смещенной на 4 разряда влево ldi r16, 0b00000101 ;Загрузка в регистр r16 "1", смещенной на 2 разряда влево
main: ;Основной цикл программы out PORTB,r16 ;Копирование из r16 в PORTB sbis PINB, 2 ;Проверка 2ой кнопки rjmp wait2 ;Переход sbic PINB, 0 ;Если РВ2=0 (кнопка нажата), пропустить след. строку rjmp main ;Возврат к началу цикла rcall delay ;Вызов подпрограммы задержки на дребезг контактов wait: ;Цикл ожидания, пока нажата кнопка sbis PINB, 0 ;Если РВ2=1 (кнопка отпущена), пропустить след. строку rjmp wait ;иначе перейти к началу цикла ожидания rcall delay ;Вызов подпрограммы задержки на дребезг контактов sbic PINB, 0 ;Если РВ2=0 (кнопка нажата), пропустить след. строку eor r16,r17 ;Исключающее ИЛИ регистров r16 и r17 rjmp main ;Возврат к метке main
wait2: ;Цикл ожидания, пока нажата кнопка sbis PINB, 2 ;Если РВ2=1 (кнопка отпущена), пропустить след. строку rjmp wait2 ;иначе перейти к началу цикла ожидания rcall delay ;Вызов подпрограммы задержки на дребезг контактов sbic PINB, 2 ;Если РВ2=0 (кнопка нажата), пропустить след. строку eor r16,r18 ;Исключающее ИЛИ регистров r16 и r17 rjmp main ;Возврат к метке main
delay: ;Начало подпрограммы задержки ldi r19, 255 ;Загрузка значения в регистр r18 ldi r20, 31 ;Загрузка значения в регистр r19 del: ;Цикл задержки subi r19, 1 ;Вычитание 1 из регистра r18 sbci r20, 0 ;Вычитание 0 из регистра r19 с учетом переноса brcc del ;Если не было переноса вернуться к метке del ret ;Возврат из подпрограммы
Сообщение отредактировал GranDAD - Среда, 22.01.2014, 01:08
Не знаю насчет вставки кода. Может, ограничения движка сайта. Я большие объемы текста не вставлял как код.
Плата под ЛУТ конечно есть. Вам в каком формате сделать? Я в DipTrace рисовал, могу в растровый формат конвертировать.
Donke,
Цитата
Добрался до пятого задания с отступлением от генеральной линии. В смысле пришлось добавить неизученные ранее инструкции. Это, кстати, "вина" учителя. Не выходит сделать задание строго ограничившись набором изученных инструкций. 8-) Кстати задание 4-2 тоже не сделал. Не знаю куда там EOR приляпать. Без него могу - с ним никак.Donke,
Я все задания писал с таким расчетом, чтоб можно было их выполнить только используя уже известный набор команд, проявляйте фантазию
mimino, плату достаточно в DipTrace формате выложить, благо он на компьютере уже имеется А насчет заданий из 4- и 5го уроков, Вы не посмотрели мои решения, может можно как-то улучшить?
Сообщение отредактировал GranDAD - Пятница, 24.01.2014, 01:53
Файл правильный, но у меня вопрос по схеме. Насколько я понял схема питается от программатора, но вот с контактами непонятки. У тебя +5В берется от 3-го контакта шлейфа программатора, в то время как у USBASP, да и у остальных стандартных 10 пиновых программаторов +5В на 2-ом контакте, а 3-ий помечен как NC. Или нужна перемычка?
GranDAD, А, да. Это у меня тут нестандартный немного разъем. Для стандартного питание нужно перекинуть на 2-й контакт с 3-го. И еще надо 8-й контакт соединить с землей, а не с 7-м, иначе КЗ будет.
Ну тогда понятно Походу все равно придется с перемычкой делать, ибо до 2-го контакта так просто не дотянуться )
Добавлено (26.01.2014, 21:08) --------------------------------------------- Собрал 3ю плату (без перемычки удалось), но с впаянным LED1 программатор не разпознает чип, на выходах обоих светодиодов 0.30В при вставленном мк и паз. КЗ нигде не замеченно. И R2 по схеме, на 320 Ом.
Собрал еще одну плату (по другой схеме уже), та же история, с впаянным LED1 программатор кричит на проблемму в соеденении. Без него все нормально прошивается, кз нет.
Сам ничего не понимаю, когда на макетке делал, все нормально было, а тут...
Увеличил сопротивление до 470 Ом и заметил что led2 стал слегка загорать при подачи питания, даже без мк в пазе. Но программатор все равно ругался. Попробовал 1 кОм, теперь все нормально, и свечение led2 пропало А в чем была проблемма, с MOSI не подружились?
Сообщение отредактировал GranDAD - Пятница, 31.01.2014, 23:29