Главная страница

Справочник по программированию «Bascom-AVR» (М.Л. Кулиш). Справочник по программированию Bascomavr Создание микропроцессорной системы Теория


Скачать 1.18 Mb.
НазваниеСправочник по программированию Bascomavr Создание микропроцессорной системы Теория
АнкорСправочник по программированию «Bascom-AVR» (М.Л. Кулиш).pdf
Дата21.03.2017
Размер1.18 Mb.
Формат файлаpdf
Имя файлаСправочник по программированию «Bascom-AVR» (М.Л. Кулиш).pdf
ТипСправочник
#4054
КатегорияПромышленность. Энергетика
страница8 из 8
1   2   3   4   5   6   7   8
' | | |
=============================================================================
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
1   2   3   4   5   6   7   8


написать администратору сайта