![]() |
|
![]() ![]() ![]() |
|
BEDNII_Student |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Профессионалы и любители AVR помогите!
Граждане, решается судьба Бедного студента. Нужно решить такую простенькую (для Вас) задачку Программирование ATmega16 AVR Задание: Делаем 2 нажатия на кнопку. Измерить длительность каждого нажатия с точностью не меньше 10 мск После – среднее значение времени передать в последовательный порт со скоростью 9600 бит/сек Ниже приведены фрагменты, взятые из разных источников, насколько правильно не знаю. Буду очень благодарен, если напишите программку. Заранее благодарю! .include "m16def.inc" .def Temp =r16 ; Temporary register ;объявление регистров . 1Делаем бесконечный цикл, в нем опрос кнопки. Если нажата – запустить внутренний цикл с проверкой, пока нажат, в котором наращиваем счетчик и вызываем подпрограмму задержки 10 мск LOOP: out PORTB,temp ; Запись регистра temp в порт B sbis PIND,0x00 ; If (Port D, pin0 == 0) Если бит 0 в порт B установлен inc Temp ; то увеличение значения регистра temp на 1 men: in rez, ADCh subi rez, 0b00001001 brmi men bol: call za4 call za4 call za2; задержка на 10 милисекунд in rez,ADCh subi rez, 0b01000011 out portb, rez rjmp Loop za4: ldi r19, 200 m3: ldi r20, 192 m2: ldi r21, 192 m1: dec r21 brne m1 dec r20 brne m2 dec r19 brne m3 ret za2: ldi r19, 100 m3: ldi r20, 192 m2: ldi r21, 192 m1: dec r21 brne m1 dec r20 brne m2 dec r19 brne m3 ret 2 Так же второе нажатие 3. Складываем и сдвиг вправо Lsr (сдвиг вправо?) 4.Настройка порта LOOP: out PORTB,temp ; Запись регистра temp в порт B 5.Вывод Пример программы на ассемблере, использующей таймер/счетчика .include "m16def.inc" .def Treg = r16 .def Preg1 = r22 .cseg .org $000 ; Установка положения в сегменте (см. тему: сброс и установку прерывания) rjmp start ; назначения перехода на начало программы метка «start» .org $012 ;назначения перехода по переполнению счетчика на метку «tim» rjmp tim Tim: Out DDRB, preg1 inc preg1 call inittime reti start: clr preg1 ; очищаем регистр (инициализация) sei ; разрешение прерываний установка биту 7 регистра SREG лог. 1 ldi Treg, 00000001b ;запись числа в «Treg» out TIMSK, Treg ;запись регистра «Treg» в регистр «Timsk» call inittime ; вызов подпрограммы «inittime» ldi Treg, 10000101b out TCCR0, Treg ; установка тактирования rcall loop ; вызов «Loop» Loop: rjmp loop ret inittime: ldi Treg, 00001111b out TCNT0, Treg ; установка начального значения с которого начинается «отчет до переполнения» ret |
|||
|
||||
try_to_get |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 426 Регистрация: 19.3.2007 Где: Россия Репутация: нет Всего: 2 |
BEDNII_Student, Коды программ нужно помещать в [ code = ] [/code]
![]() Это сообщение отредактировал(а) try_to_get - 1.9.2007, 19:55 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |