0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
1 | |
Задержка :-)20.11.2010, 22:00. Показов 7298. Ответов 18
Метки нет (Все метки)
Вот хочу помигать св.диодами, начало положено и становится все более ясней. Но вот возник вопрос - как ЛУЧШЕ, ЭФФЕКТИВНЕЙ, ЭКОНОМИЧНЕЙ реализовать задержку на ассемблере. Гдето читал, что - "delay loop generator" не есть гуд.
0
|
20.11.2010, 22:00 | |
Ответы с готовыми решениями:
18
Timer0 задержка в 1сек Задержка на pic18f452 Задержка в stm32 Секундная задержка |
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 2,017
|
|
20.11.2010, 22:03 | 2 |
Ну если процессор больше ничем не будет заниматься, тогда и эта утилита пойдет. Но скорее всего вам нужно использовать таймер, а инверитировать ногу по прерыванию от него.
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
20.11.2010, 22:10 | 3 |
Сообщение от Bomomd
0
|
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
|
|
20.11.2010, 22:13 | 4 |
Сейчас подкину информации к размышлению....
У меня в роботе (на плате контроллера движков) есть пара светодиодов. Юзаются они, в основном, для отладки. Код, обрабатывающий каждый светик, помещён в прерывании от таймера. Само прерывание происходит каждые 40мс. Код
//Зелёный светик: lds r17, Green_light_count //загружаем счётчик из памяти в регистр cpi r17, 0 //если он = 0, то breq kriim_light_skip //выходим SBI PORTB,6 //Если не равен, то зажигаем светик. dec r17 //уменьшаем счётчик на 1 brne kriim_light_skip //если он всё-ещё не = 0, то выходим CBI PORTB,6 //если = 0, то гасим светик kriim_light_skip: sts Green_light_count,r17 //в конце сохраняем регистр обратно Код
ldi r16, 10 sts Green_light_count, r16
0
|
SWK
|
|
20.11.2010, 22:19 | 5 |
Сообщение от vjr
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
20.11.2010, 22:38 | 6 |
Сообщение от SWK
ft232rl с флюсом припаял за 5 сек., а мегу если убью, со временем, в чем я не сомневаюсь, выпаять феном - не дольше.
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
20.11.2010, 22:45 | 7 |
Сообщение от dsodir
0
|
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 2,017
|
|
20.11.2010, 22:55 | 8 |
Да тут же. В учебном курсе есть все.
0
|
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 238
|
|
21.11.2010, 03:26 | 9 |
Сообщение от Bomomd
- записать в TCCR0 1,2,3,4 или 5 (для предделителя 1,8,64,256 и 1024 соответственно) (как вариант: ldi r16,2 out TCCR0,r16) - выставить 0-й бит TIMSK в 1 (разрешает прерывания по таймеру) (как вариант: ldi r16,1 out TIMSK,r16) - записать в TCNT0 ноль (для обнуления) (как вариант clr r16 out TCNT0,r16) - В сегменте кода (.CSEG) прописать такие строчки: .ORG $012 rjmp label (или jmp label), где "label" это метка перехода на обработчик прерывания по переполнению таймера. label: ... ... ... reti
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
21.11.2010, 13:44 | 10 |
OmdyRate & AVRSots юзал кто?
0
|
0 / 0 / 0
Регистрация: 02.11.2004
Сообщений: 1,112
|
|
21.11.2010, 14:11 | 11 |
Сообщение от vjr
я для первых опытов взял пару штук ATTiny13, там тоже всё есть - плюс оно в DIP8 корпусе.
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
21.11.2010, 14:25 | 12 |
Сообщение от Omt
я для первых опытов взял пару штук ATTiny13, там тоже всё есть - плюс оно в DIP8 корпусе. Мне попался перевод DataShietа этой меги, ото и решил на ней.
0
|
0 / 0 / 0
Регистрация: 06.07.2010
Сообщений: 485
|
|
21.11.2010, 18:19 | 13 |
Сообщение от dsodir
lds r17, Green_light_count //загружаем счётчик из памяти в регистр cpi r17, 0 //если он = 0, то breq kriim_light_skip //выходим SBI PORTB,6 //Если не равен, то зажигаем светик. dec r17 //уменьшаем счётчик на 1 brne kriim_light_skip //если он всё-ещё не = 0, то выходим CBI PORTB,6 //если = 0, то гасим светик kriim_light_skip: sts Green_light_count,r17 //в конце сохраняем регистр обратно В результате, если мы хотим, чтобы светик горел, к примеру, 400мс, то делаем так: Код
ldi r16, 10 sts Green_light_count, r16
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
26.11.2010, 00:23 | 14 |
Люди добрые, подскажите (намекните) где бока, причину сам хочу выявить, уж сильно затянуло это, только мозг уже закипает, перечитал А. В. Белова "Использование таймера" - не могу понять! И будет работать код на меге без кварца через JTAG в реальном времени с задержками?
.ymstude "m128def.yms" .list .def temp = R16 .equ kdil = 780 .cseg .org 0 ;------------------Иниц. стека ldi temp,low(ROMEND) out spl,r16 ldi temp,high(ROMEND) out sph,r16 ;------------------Иниц. порта D ldi temp,(1<<6) | (1<<7) out DDRD,temp ;------------------Иниц. таимера ldi temp,0x05 ; делитель 1024 out TCCR1B,temp ;------------------Иниц. компаратора ldi temp,0x80 out ACSR,temp ;------------------Основная программа cikl: ldi temp,(1<<6) ; светится первый светодиод out PORTD,temp rcall woyt ldi temp,(1<<7) ; светится второй светодиод out PORTD,temp rcall woyt ldi temp,(0<<6) ; тушим один светодиод out PORTD,temp rcall woyt ldi temp,(0<<7) ; тушим второй светодиод out PORTD,temp rcall cikl ;----------------- Задержка ------------------------------------ woyt: push temp ;сохраняем содержимое регистра ldi temp,0 ;обнуляем out TCNT1H,temp ;записываем ноль в старш.регистр таймера out TCNT1L,temp ;записываем ноль в младш.регистр таймера wt1: in temp,TCNT1L cpi temp,low(kdil) ;сравниваем младшую brlo wt1 ;переход если temp меньше kdil in temp,TCNT1H cpi temp,high(kdil) ;сравниваем старшую brlo wt1 ;переход если temp меньше kdil pop temp ;востанавливаем значение регистра ret ;выход из подпрограммы ;----------------------------------------------------------------
0
|
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
|
|
26.11.2010, 00:33 | 15 |
Какое-то хитроумное сравнение :)
Почему-бы не сделать так: Код
wt1: in temp, TCNT1L cpi temp, Lo(kdil) ;Сравниваем младший in temp, TCNT1H cpc temp, Hi(kdil) ;Сравниваем старший с учётом переноса brlo wt1 ; Обратно,если меньше
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
26.11.2010, 00:50 | 16 |
Сообщение от dsodir
in temp, TCNT1L cpi temp, Lo(kdil) ;Сравниваем младший in temp, TCNT1H cpc temp, Hi(kdil) ;Сравниваем старший с учётом переноса brlo wt1 ; Обратно,если меньше А ещё можно запихать kdil в регистры OCR1AL:OCR1AH и ждать флага OCF1A, но это уже совсем другая история... Ну а в целом, код, постановка задачи, верна? А работать без кварца в JTAGе будет? Или там задержки долго обрабатываются?
0
|
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
|
|
26.11.2010, 16:33 | 17 |
Сообщение от vjr
0
|
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 66
|
|
26.11.2010, 17:13 | 18 |
Сообщение от svs39
Куда скинуть OmdyRate? И я, таки разобрался (понял) !!! Заставил мигать эти диоды !!! Проблема была в фузе-бите совместимости 128 с 103 мегой, который был установлен по умолчанию.
0
|
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
|
|
26.11.2010, 17:18 | 19 |
Сообщение от vjr
0
|
26.11.2010, 17:18 | |
26.11.2010, 17:18 | |
Помогаю со студенческими работами здесь
19
Не работает задержка Задержка в микросекундах Задержка на МК AT89C51 Задержка в микросекундах Программная задержка Задержка времени в Quartus II Как работает задержка? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |