|
Интересная функция задержки, Вопрос по ассемблеру |
|
|
|
Aug 25 2006, 12:26
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 9-05-05
Пользователь №: 4 855

|
Есть вот такая интересная функция задержки времени. Сначала задается: ldi AL, 125 Потом вызывается сама функция: dly: mov _Stm1, AL tst _Stm1 brne PC-1 ret При кварце в 10 МГц задержка выходит примерно в 500 мс. Вопрос - как это работает, а именно, что постепенно обнуляет регистр _Stm1?
|
|
|
|
|
 |
Ответов
|
Aug 28 2006, 18:58
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(vet @ Aug 28 2006, 23:57)  prottoss к чему ирония? разумеется, измерение отрезка времени таймером точнее, чем с помощью цикла, неизвестно на сколько времени продлённого разнообразными возникающими по ходу работы прерываниями. Так и я о том же, а уважаемый defunct пытается доказать обратное Цитата(singlskv @ Aug 29 2006, 02:39)  Интересно, а если у нас вся работа происходит в прерываниях, то что мы будем делать, в то время пока не произошло интересуещее нас событие (ИМХО, ковырять в носу в каком-нибудь пустом цикле  ). Кто то ковыряет в носу, а кто то спокойно спит)))
Сообщение отредактировал prottoss - Aug 28 2006, 19:00
--------------------
|
|
|
|
|
Aug 28 2006, 19:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Aug 28 2006, 22:58)  Кто то ковыряет в носу, а кто то спокойно спит))) Угу, а если после наступления события нам необходимо очень оперативно отреагировать ? Типа, реалтайм какой-нибудь, а событие такое что выход из sleep не прикрутить ? Дальше "спокойно спим". Уважаемый prottoss, если Вы умеете делать выводы о коде на основании 5-6 команд на ассемблере, то вероятно вы выбрали не ту профессию, возможно Вас ждет большой успех в области ясновидения. P.S. без обид пожалуйста
|
|
|
|
|
Aug 28 2006, 19:56
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(singlskv @ Aug 29 2006, 03:14)  Угу, а если после наступления события нам необходимо очень оперативно отреагировать ? Типа, реалтайм какой-нибудь, а событие такое что выход из sleep не прикрутить ? Дальше "спокойно спим". Уважаемый prottoss, если Вы умеете делать выводы о коде на основании 5-6 команд на ассемблере, то вероятно вы выбрали не ту профессию, возможно Вас ждет большой успех в области ясновидения. P.S. без обид пожалуйста  Что Вы, какие обиды) Я просто стараюсь не обращать внимание на глупые реплики подобные вашим... Я всего лишь сказал, что не вижу смысла делать задержку на прерывании, если выхода из функции все равно нет! Раз уж все накинулись на меня скопом) давайте найдем истину). Вот обсуждаемый код: Код Сначала задается: ldi AL, 125 Потом вызывается сама функция: dly: mov _Stm1, AL tst _Stm1 brne PC-1 ret Потоки, работающие по прерываниям и так отработают свое.. О какой точности идет речь? Между tst _Stm1 и brne PC-1 может возникнуть прерывание, которое сведет всю вашу точность на нет. И, наконец, можете описать, или придумать, хотя бы одну ситуацию, где нельзя прикрутить sleep хотя бы в режиме idle?
Сообщение отредактировал prottoss - Aug 28 2006, 19:58
--------------------
|
|
|
|
|
Aug 28 2006, 20:07
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(prottoss @ Aug 28 2006, 22:56)  Потоки, работающие по прерываниям и так отработают свое.. О какой точности идет речь? Между tst _Stm1 и brne PC-1 может возникнуть прерывание, которое сведет всю вашу точность на нет. И, наконец, можете описать, или придумать, хотя бы одну ситуацию, где нельзя прикрутить sleep хотя бы в режиме idle? Можно, но это сути не меняет. Давайте просто проэкспериментируем: Итак условия задачи: atmega8, частота 14372800 16-ти битный таймер занят, ну например, "опросом датчиков". То есть режим CTC, прерывание 4мс. В голове надо сформировать следующую диаграму на порт b.outx "1" - 500мс, "0" - 300мс, "1" - 200мс, "0" По версии НЕИЗВЕСТНОГО АВТОРА это выглядело примерно так. 1) Версия ассемблера atmel. В прерывании ..... dec cnt_ms ..... В голове ..... .equ wt_tim1 = 4 ; 4ms .... .macro setout ; задать таймаут ldi cnt_ms,@0/4 ; установить время таймаута tst cnt_ms brne PC-1 .endm ..... sbi portb,outx setout 500 cbi portb,outx setout 300 sbi portb,outx setout 200 cbi portb,outx ...... Подведём итоги: Задействовано регистров - 1 стек - 0 длина проги в прерывании - 2байта/1такт общая длина проги - 28 байт число строк программы - 14 ================================================== Попробуем на С В прерывании ..... cnt_ms--; ..... В голове ..... #define wt_tim1 = 4 // 4ms ..... PORTB |= (1<<OUTX); cnt_ms = 500/wt_tim1; while(cnt_ms); PORTB &= ~ (1<<OUTX); cnt_ms = 300/wt_tim1; while(cnt_ms); PORTB |= (1<<OUTX); cnt_ms = 200/wt_tim1; while(cnt_ms); PORTB &= ~ (1<<OUTX); ...... Подведём итоги: Задействовано переменных - 1 длина проги в прерывании - 2байта/1такт общая длина проги - хх байт число строк программы - 12 ================================================ Предложите Ваш вариант. Я с удовольствием воспользуюсь красивым решением этой задачи.
|
|
|
|
|
Aug 28 2006, 21:21
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(SasaVitebsk @ Aug 29 2006, 04:07)  Давайте просто проэкспериментируем: Итак условия задачи: atmega8, частота 14372800 16-ти битный таймер занят, ну например, "опросом датчиков". То есть режим CTC, прерывание 4мс. В голове надо сформировать следующую диаграму на порт b.outx "1" - 500мс, "0" - 300мс, "1" - 200мс, "0" По версии НЕИЗВЕСТНОГО АВТОРА это выглядело примерно так. 1) Версия ассемблера atmel. В прерывании ..... dec cnt_ms .....
В голове .....
.equ wt_tim1 = 4 ; 4ms
.... .macro setout ; задать таймаут ldi cnt_ms,@0/4 ; установить время таймаута tst cnt_ms brne PC-1 .endm
..... sbi portb,outx setout 500 cbi portb,outx setout 300 sbi portb,outx setout 200 cbi portb,outx ......
Подведём итоги: Задействовано регистров - 1 стек - 0 длина проги в прерывании - 2байта/1такт общая длина проги - 28 байт число строк программы - 14 ==================================================
Попробуем на С
В прерывании ..... cnt_ms--; .....
В голове .....
#define wt_tim1 = 4 // 4ms
..... PORTB |= (1<<OUTX); cnt_ms = 500/wt_tim1; while(cnt_ms); PORTB &= ~ (1<<OUTX); cnt_ms = 300/wt_tim1; while(cnt_ms); PORTB |= (1<<OUTX); cnt_ms = 200/wt_tim1; while(cnt_ms); PORTB &= ~ (1<<OUTX); ......
Подведём итоги: Задействовано переменных - 1 длина проги в прерывании - 2байта/1такт общая длина проги - хх байт число строк программы - 12
================================================ Предложите Ваш вариант. Я с удовольствием воспользуюсь красивым решением этой задачи. Ну а чем плох вот такой вариант на С? Код
#define delay1 3000// сдесь поставте свои значения задрержек #define delay2 2000// так как эти от фонаря #define delay3 1000//
#define OUTX 1
void main(void) { PORTB |= (1 << OUTX); __delay_cycles(delay1); PORTB &= ~ (1 << OUTX); __delay_cycles(delay2); PORTB |= (1 << OUTX); __delay_cycles(delay3); PORTB &= ~ (1 << OUTX); } ИТОГО: *ни одной переменной *не надо прерываний *работает абсолютно так же *число строк 6 *число байт кода 46
--------------------
|
|
|
|
Сообщений в этой теме
Reboot_s Интересная функция задержки Aug 25 2006, 12:26 vet Очевидно, прерывание; предположительно, по таймеру... Aug 25 2006, 12:37 Reboot_s Цитата(vet @ Aug 25 2006, 16:37) Очевидно... Aug 25 2006, 13:13 prottoss Я бы сказал, что функция не интересная, а наоборот... Aug 25 2006, 13:09 SasaVitebsk Цитата(prottoss @ Aug 25 2006, 16:09) Я б... Aug 26 2006, 19:49  prottoss Цитата(SasaVitebsk @ Aug 27 2006, 03:49) ... Aug 26 2006, 21:25   SasaVitebsk Цитата(prottoss @ Aug 27 2006, 00:25) Цит... Aug 27 2006, 22:41    CDT Цитата(prottoss @ Aug 25 2006, 16:09) Я б... Aug 28 2006, 05:17   defunct Цитата(prottoss @ Aug 27 2006, 00:25) Цит... Aug 28 2006, 12:01    prottoss Цитата(defunct @ Aug 28 2006, 20:01) ну я... Aug 28 2006, 15:45 singlskv Цитата(prottoss @ Aug 25 2006, 17:09) Я б... Aug 28 2006, 18:39    singlskv Цитата(prottoss @ Aug 28 2006, 23:56) Пот... Aug 28 2006, 20:49     SasaVitebsk Цитата(singlskv @ Aug 28 2006, 23:49) Пот... Aug 28 2006, 21:09     prottoss Цитата(singlskv @ Aug 29 2006, 04:49) Пот... Aug 28 2006, 21:12      singlskv Цитата(prottoss @ Aug 29 2006, 01:12) Цит... Aug 28 2006, 21:39       prottoss Цитата(singlskv @ Aug 29 2006, 05:39) При... Aug 28 2006, 21:47        singlskv Цитата(prottoss @ Aug 29 2006, 01:47) Цит... Aug 28 2006, 22:03         prottoss Цитата(singlskv @ Aug 29 2006, 06:03) Мож... Aug 28 2006, 22:16          singlskv Цитата(prottoss @ Aug 29 2006, 02:16) Цит... Aug 28 2006, 22:29           prottoss Цитата(singlskv @ Aug 29 2006, 06:29) Око... Aug 28 2006, 22:44            singlskv Цитата(prottoss @ Aug 29 2006, 02:44) Цит... Aug 28 2006, 23:10            SasaVitebsk Цитата(prottoss @ Aug 29 2006, 01:44) Цит... Aug 30 2006, 17:42             prottoss Цитата(SasaVitebsk @ Aug 31 2006, 01:42) ... Aug 30 2006, 18:12              defunct Цитата(prottoss @ Aug 30 2006, 21:12) Цит... Aug 31 2006, 13:17  defunct Цитата(prottoss @ Aug 28 2006, 21:58) Цит... Aug 29 2006, 13:29   prottoss Цитата(defunct @ Aug 29 2006, 21:29) типи... Aug 29 2006, 14:01    defunct Цитата(prottoss @ Aug 29 2006, 17:01) Над... Aug 29 2006, 14:48     prottoss Цитата(defunct @ Aug 29 2006, 22:48) Вы э... Aug 29 2006, 15:43      defunct Цитата(prottoss @ Aug 29 2006, 18:43) Цит... Aug 29 2006, 18:25       prottoss Цитата(defunct @ Aug 30 2006, 02:25) PS: ... Aug 29 2006, 18:39        defunct Цитата(prottoss @ Aug 29 2006, 21:39) Цит... Aug 29 2006, 20:50 prottoss Я предложу, но объясните мне, непонятливому, зачем... Aug 28 2006, 20:42 SasaVitebsk Цитата(prottoss @ Aug 28 2006, 23:42) Я п... Aug 28 2006, 21:18 vet prottoss
Ваш вариант хуже в смысле точности, и нам... Aug 29 2006, 05:51 prottoss Цитата(vet @ Aug 29 2006, 13:51) prottoss... Aug 29 2006, 06:09 vet Опять не понимаете. Таймер тикает независимо от пр... Aug 29 2006, 07:09 GetSmart prottoss
Если вы такой умный насколько и нагловаты... Aug 29 2006, 16:16 prottoss Цитата(GetSmart @ Aug 30 2006, 00:16) pro... Aug 29 2006, 16:47 GetSmart Ну то есть задание вы провалили. Приходите через г... Aug 29 2006, 16:58 SasaVitebsk Специально использую класический смайл так как он ... Aug 30 2006, 20:20 prottoss 2 SasaVitebsk: объяснения об улыбках, ухмылках, и ... Aug 31 2006, 14:57 defunct LMD Aug 31 2006, 23:10 SpiritDance А дык чего вы хотите от Пиннокио? Ж))) Sep 1 2006, 05:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|