Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Увеличить

Сбрось StopWatch и Cycle Counter, а потом сделай одну итерацию цикла. У меня студия показала 25 машинных циклов и 3.3 микросекунды времени. Это длительность одной итерации.

Теперь посчитаем сколько нам надо таких итераций на секунду. 1/0.75E-6 = 303 030 оборота. Что дофига:) Посчитаем это в байтах нашей шарманки, просто переведем в 16тиричную систему. Получим 0х049FB6 или, если побайтно, то

  0хB6(CCNT) 0х9F(CCNT+1) 0х04(CCNT+2) 0x00(CCNT+3)

Осталось теперь только сравнить число с этим слепком.

Как сравнивать? Да довольно просто. Все зависит от того что мы хотим получить. Если ОДНО событие за ВЕСЬ период глобального счетчика нашей шарманки, то тупо, побайтно. В этом случае у тебя диодик моргнет через секунду после старта, а дальше ты будешь ждать пол часа до переполнения всего четырехбайтного счетчика.

Чтобы он моргал каждую секунду тебе надо при сравнении замаскировать старшие биты глобального счетчика, словно у него разрядность не 32 бита, а меньше (и переполняется он чаще).

Младшие байты сравниваем как есть, а самый старший только до его максимального разряда, остальные надо отрезать.

Т.е. самый старший разряд для этого случая это CCNT+2=0х04 если в двоичном представлении то 0х04 = 00000 100 так вот, счетчик у нас четырех разрядный, значит событие с маской

00 04 9F B6 (00000000 00000 100 10011111 10110110)

до переполнения возникнет дофига число раз. Видишь я нули жирным шрифтом выделил. Старший самый у мы вообще сравнивать не будем, а вот пред старший надо через AND по маске 00000111 продавить, чтобы отсечь старшие биты.

Их еще надо заполнить до переполнения и обнуления счетчика. Но если мы их замаскируем то их дальнейшая судьба нас не волнует. Пусть хоть до второго пришествия тикает — нам плевать.

  LDS R16, CCNT; Грузим числа в регистры LDS R17, CCNT+1 LDS R18, CCNT+2 ANDI R18, 0x07; Накладываем маску   CPI R16, 0xB6; Сравниванем побайтно BRNE NoMatch CPI R17, 0x9F BRNE NoMatch CPI R18, 0x04 BRNE NoMatch   ; Если совпало то делаем экшн Match: INVB PORTD, 7, R16, R17; Инвертировали LED3   ; Не совпало - не делаем:) NoMatch:   Next: INCM CCNT; Проворачиваем шарманку JMP Main

Во, загрузили теперь мигает. Никаких затупов нет, нигде ничего не подвисает, а главный цикл пролетает со свистом, только успевай барабан шарманки проворачивать:)

Вот только мигает заметно медленней чем мы хотели. Не 1 секунда, а 8. Ну а что ты хотел — добавив процедуру сравнения мы удлиннили цикл еще на несколько команд. И теперь он выполняется не 25 тактов, а 36. Пересчитывай все циферки заново:)))))

Но это еще не самый цимес! Прикол в том, что у тебя часть кода выполняется, а часть нет — команды сравнения и перехода. Поэтому точно высчитать задержку по тактам это проще сразу удавиться — надо по каждой итерации высчитать когда и сколько у тебя будет переходов, сколько они тактов займут…

А если код будет еще больше, то ваще труба и погрешность накапливается с каждой итерацией!

Зато, если добавить код обработки кнопок:

  ; Main ========================================================= Main: SBIS PIND, 6; Если кнопка нажата - переход RJMP BT_Push   SETB PORTD, 5; Зажгем LED2 CLRB PORTD, 4; Погасим LED1   Next: LDS R16, CCNT; Грузим числа в регистры LDS R17, CCNT+1 LDS R18, CCNT+2 ANDI R18, 0x07   CPI R16, 0xB6; Сравниванем побайтно BRNE NoMatch CPI R17, 0x9F BRNE NoMatch CPI R18, 0x04 BRNE NoMatch   ; Если совпало то делаем экшн Match: INVB PORTD, 7, R16, R17; Инвертировали LED3   ; Не совпало - не делаем:) NoMatch: NOP     INCM CCNT JMP Main     BT_Push: SETB PORTD, 4; Зажгем LED1 CLRB PORTD, 5; Погасим LED2 RJMP Next   ; End Main =====================================================


То увидим, что от тормозов и следов не осталось. Кнопки моментально реагируют на нажатия, а диодик мигает сам по себе. Многозадачность!:)

 

<== предыдущая лекция | следующая лекция ==>
Основные повреждения полотна и пути их устранения | Безработица. Государственная политика занятости.




© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.