Справочник по программированию «Bascom-AVR» (М.Л. Кулиш). Справочник по программированию Bascomavr Создание микропроцессорной системы Теория
Скачать 1.18 Mb.
|
' | | | ============================================================================= 35 ===================================== Справочник по программированию «Bascom-AVR» == '---- ---------- --- - - --- ------- 'Sda-------------------------------- '-------------------------- 'СОСТОЯНИЕ ОЖИДАНИЯ БИТА ОТВЕТА (ПОДТВЕРЖДЕНИЕ) Slave_ack: Sbi Ddrc , 0 'УСТАНОВКА И ОЖИДАНИЯ ОТПУСКАНИЯ ЛИНИИ Scl_l Nop ' ---- Cbi Ddrc , 1 '¦ ¦ ¦ Nop ' ------ --- Cbi Ddrc , 0 'Scl------------- Nop ' Nop '---------------- Sbi Ddrc , 0 ' ¦ | | Ret '----- ------ 'Sda------------- '-------------------------- 'БЕЗ ВЫДАЧИ СИГНАЛА ПОДТВЕРЖДЕНИЯ И ЕЩЕ ОДНА ОПЕРАЦИЯ No_ack: Cbi Ddrc , 1 'УСТАНОВКА И ОЖИДАНИЯ ОТПУСКАНИЯ ЛИНИИ Scl_l ' ------ Cbi Ddrc , 0 ' ¦ ¦ Nop '---- ---- Nop 'Scl------------- Sbi Ddrc , 0 '---------------- '¦ '- 'Sda------------- '-------------------------- 'ФОРМИРОВАНИЕ СТОП-БИТА Stop_bit: Sbi Ddrc , 1 ' --------- ' ¦ '----- Cbi Ddrc , 0 'Scl------------ Nop ' ---- Cbi Ddrc , 1 '¦ ¦ Ret ' --------- 'Sda------------ '------------------------------------------ 'ЧТЕНИЕ С ЛИНИИ БАЙТА ДАННЫХ В R31 R_byte: Cbi Ddrc , 1 'НА ВСЯКИЙ СЛУЧАЙ Ldi R30 , 8 'ЧИСЛО СЧИТЫВАЕМЫХ БИТ R_by0: Cbi Ddrc , 0 'ЦИКЛ СЧИТЫВАНИЯ Sec 'УСТАНОВКА И ОЖИДАНИЯ ОТПУСКАНИЯ ЛИНИИ SCL Nop '------- --- -- ---- ' ¦ ¦ ¦ ¦ ¦ ¦ Sbis Pinc , 1 '-- ---- ---- ----- Clc 'SCL-------------------------------- Sbi Ddrc , 0 '---------------- - ---------------- Rol R31 '¦ | R | R | R Dec R30 '¦ | D | D | D Brne R_by0 ' --------- - - ------- -------- Ret 'SDA-------------------------------- '-------------------------- 'ВЫДАЧА СИГНАЛА ПОДТВЕРЖДЕНИЯ Mstr_ack: Sbi Ddrc , 0 Nop 'УСТАНОВКА И ОЖИДАНИЯ ОТПУСКАНИЯ ЛИНИИ SCL Sbi Ddrc , 1 ' ------ Nop '¦ ¦ ¦ Cbi Ddrc , 0 ' -------- ----- Nop 'SCL------------------- Sbi Ddrc , 0 '---- -- Nop ' ¦ ¦ Cbi Ddrc , 1 ' -------------- Ret 'SDA------------------- '------------------------------------------ $end Asm -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 4 Я читал, что Bascom дает громоздкий и неоптимальный код. Это правда? Тогда какие выгоды дает примене- ние этого компилятора? ============================================================================= 36 ===================================== Справочник по программированию «Bascom-AVR» == Ответ 4 Не нужно паниковать о том, что Bascom дает некомпактный код. Размер кода полностью соответствует классу компиляторов с языков высокого уровня. Уступает только CodeVision на малых проектах, а с другими компиляторами Си успешно конкурирует. Bascom особенно хорош в больших проектах, когда мелочная оптими- зация уже не приносит заметного выигрыша, а важнее структурированность исходного текста. Размер кода в громадной степени зависит от стиля написания. Нужно применять тоже приемы, что и при программировании на ассемблере: - похожие программы оформлять в подпрограммы. Различия формировать ветвлением и дроблением участ- ков; - применять простые конструкции, минимум вложенности (от вложенности код становится еще больше). Лучше больше ветвится по тексту программы, чем применять вложенные проверки условий. Чем длиннее текст и применяются более мелкие операторы, тем короче код и он быстрее работает; - программы прерывания писать на ассемблере, осуществляя минимум действий. Запрещать автоматически сохранять регистры; - применять больше переменных (на каждый чих свою, обычно ресурсов хватает), чтобы было меньше "за- морочек", чтобы не вспоминать лишний раз о возможности одновременного использования; - применять конструкцию On … Goto с таблицей переходов даже избыточной, а не любимую многими Select Case; - применять табличные методы установки и выбора параметров Lookup(offset,Table); - программа должна построена таким образом, чтобы обращение к каждому элементу периферии встреча- лось в программе только один раз; - также как и задание числовых данных нужно делать один раз. Не рекомендуется применять экзотические методы передачи параметров (через стек). Просто советы: - не вставлять Return внутрь закрытых конструкций (типа if.. do.. for..) , а применять переход Goto на вы- ходную метку; - не располагать переменные (Single, массивы и строковые) на границе страниц памяти. Поступать так - скомпилить и посмотреть. При необходимости определить распределение памяти для Single и String самостоя- тельно вручную. Например: Dim Kzr0 As Single At 1024 Dim Kzr1 As Single At 1028 или набить промежутки на границе страниц пустыми неиспользуемыми переменными; - не забывать один оператор - одно действие (это не Си). -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 5 При преобразовании демоверсии 1.11.8.1 в полную, добавление dll-файлов библиотека не расширяется. Как быть? Ответ 5 Неполность библиотек не имеет большого значения. Большинство из них просто не представлено в виде исходного текста, который можно править и добавлять. За 10 лет использования Bascom ни разу в исходном она мне понадобилась. На самом деле, отсутствуют только утилиты уникального оборудования, которое, все равно, приходится описывать "вручную", чтобы не потерять критичные свойства. Во-вторых, имеющиеся библиотеки часто не обеспечивают совместную (параллельную) работу с другим оборудованием (параллельными задачами). В-третьих, со сложной периферией МК приходится работать напрямую - просто пишешь и читаешь регистры, анализируешь биты. Так вернее и полезней - иначе нельзя использовать все возможности и не будешь отчетливо представлять ее работу. Если лень читать, можно применять утилиту CodeVizard компилятора CodeVision. Сдела- но очень точно. -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 6 Не могу понять, как правильно использовать эту настройку. 1. По поводу настройки ТАЙМЕРА1.В оригинальном описании написано: CONFIG TIMER1 = COUNTER | TIMER | PWM , EDGE=RISING | FALLING , PRESCALE= 1|8|64|256|1024 , NOISE CANCEL=0 |1, CAPTURE EDGE = RISING | FALLING , CLEAR TIMER = 1|0, COMPARE A = CLEAR | SET | TOGGLE I DISCONNECT , COMPARE B = CLEAR | SET | TOGGLE I DISCONNECT ============================================================================= 37 ===================================== Справочник по программированию «Bascom-AVR» == Ответ 6 Не пользуйтесь для настройки конфигурации ключевыми словами Баскома. Забыть их! Ведь кристаллы разные, расположение битов и регистров различное, очень велика вероятность, что вы или компилятор ошибется. Например, в Bascom-8051 кристаллы совместимы по периферии и все поэтому работает надежно. В Bascom-AVR такие настройки оставлены для совместимости. Читайте Datasheet на процессоры и записывайте необходимые настройки сами. Причем лучше пользоваться оригинальными документами. В переводных много ошибок. Их цен- ность только в возможности быстрее изучить интересующий вопрос. -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 7 Как записать значение в регистр совпадения OCR1A, причём так, чтобы это можно было сделать в любом месте программы? Как записать в значение в сам таймер-счётчик (регистр TCNT1)? Ответ 7 'Да. Например, число 12345. Преобразуем в калькуляторе в HEX 12345=3039h OCR1AH=&H30 : OCR1AL=&H39 'при записи обязательно старший байт первым '----------------------------- TCNT1H=&h11:TCNT1H=&hFF 'по записи первым старший потом младший Byte1=TCNT1H:Byte2=TCNT1H 'при чтении первым младший потом старший '----------------------------- TCNT1H=High(word):TCNT1H=low(word) 'так записывается двухбайтное число TEMPh=TCNT1H : TEMPl=TCNT1H : Word=Makeint(Temph,Templ) 'так читается в двухбайтовое число '----------------------------- 'и как это выглядит на ассемблере '----------------------------- 'считать значение, полученное в счетчике таймера 1 Rd_tim1: $asm In R30 , Tcnt1l 'СЧИТАТЬ ДАННЫЕ In R31 , Tcnt1h 'из таймера Sts {r_bd} , R30 Sts {r_bd + 1} , R31 Lds R30 , {c_msb} '--------- In R31 , Tifr 'проверим бит переполнения таймера 1 Sbrs R31 , 2 'этой операцией мы учтем еще не обработанное переполнение таймера Rjmp Rdtim_1 'если бит переполнения таймера 1 установлен, Inc R30 'добавим единицу в счетчик старших разрядов '--------- Rdtim_1: Sts {r_bd + 2} , R30 Clr R31 Sts {r_bd + 3} , R31 $end Asm Return '---------------------------------------------- 'оформление прерывания на ассемблере '---------------------------------------------- 'обработка прерывания от таймера 1 Timer1_int: $asm Push R31 'сохраним регистры In R31 , Sreg Push R31 '--------------------- Lds R31 , {c_msb} Inc R31 Sts {c_msb} , R31 'добавить единицу в счетчик старших разрядов '--------------------- Pop R31 'восстановим регистры Out Sreg , R31 Pop R31 Reti $end Asm Return '---------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 8 ============================================================================= 38 ===================================== Справочник по программированию «Bascom-AVR» == Как подключить таймер1 в режиме сравнения к выводу OC1A?(а так же OC1B)? Ответ 8 'все назначения конфигурации записывать в основной программе так TCCR1A=&b01010000 'переключение выходов по совпадению OCR1A и OCR1B) TCCR1B=&b00001001 'считать с частотой Fкв, перезагрузка по OCR1A 'если конфигурация делается в теле прерывания оформлять так '---------------------------------------------- 'запретить прерывание таймера 1 Dis_timer1: $asm Ldi R31 , &b00000001 Out Timsk , R31 'сбросить бит разрешения прерывания таймера 1. Ldi R31 , &b00000100 Out Tifr , R31 'после запрещения сбросить флаг прерывания таймера 1 $end Asm Return '----------------------------- 'запретить внешнее прерывание 1 Dis_int0: $asm Ldi R31 , &b00000000 'сбросить бит разрешения внешнего прерывания. Out Gimsk , R31 'по datasheet этот регистр называется Gicr Ldi R31 , &b01000000 Out Gifr , R31 'после запрещения сбросить флаг прерывания. $end Asm Return -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 9 Могу ли я одновременно использовать COMPARE A и COMPARE В? Ответ 9 'Да, но режим CTC (сброс по совпадению) возможен только от OCR1A 'или от OCR1B если не используется OCR1A 'вообще это "скользкое" место, плохо прописанное в оригинальной документации 'при этом коэффициент деления определяется OCR1A, 'а переключение выхода совпадением и с OCR1A и с OCR1B -------------------------------------------------------------------------------------------------------------------------------------------------- Вопрос 10 Что означает Compare = Off(On) для компаратора? Я так понял, что это функция захвата таймера1, подклю- ченного непосредственно к выходу компаратора. 'смотри регистр ACSR. Эта опция - фактически бит ACSR.2 'когда ACSR.2 = 1 по любому переключению компаратора значение TCNT1 запоминается в ICR1, 'как и по перепаду на входе CP1 Как можно в самой программе включить и выключить компаратор? 'это бит ACSR.7. По сбросу компаратор включен! ACSR=&B1xxxxxxxx 'выключить ACSR=&B0xxxxxxxx 'включить, значение остальных битов смотри сам ============================================================================= 39 |