Файл: Справочник по программированию «Bascom-AVR» (М.Л. Кулиш).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.06.2025

Просмотров: 747

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

===================================== Справочник по программированию «Bascom-AVR» ==

'

-----------------------------------------------------------

'ШЕСТНАДЦАТИРИЧНЫЕ ЦИФРЫ

Tabseg0:

&HC0

, &HF9

' 0 , 1

-d0 -

Data

I

Data

&HA4

, &HB0

' 2 , 3 I

Data

&H99

, &H92

' 4 , 5 D5

D1

Data

&H82

, &HF8

' 6 , 7 I

-d6 -

I

Data

&H80

, &H90

' 8 , 9

I

Data

&H88

, &H83

' A , B I

Data

&HC6

, &HA1

' C , D D4

D2

Data

&H86

, &H8E

' E , F I

-D3-

I

'

'

[D7]

----------------------------------------------------------------------------------

программы клавиатуры

'

'---------------------------------------------------------

' ---------------------------------------

|

AVR-WATCH

|

'

' ---------------------------------

|

|

---

---

---

---

|

|

'

|

|

|

|

|

|

'

| | |

|

|

|

| |

'

|

|

---

|

|

---

|

---

|

---

|

|

'

| | |

|

|

|

| |

'

|

|

---

[]

--- []

--- []

--- [] |

|

' ---------------------------------

|

1

2

3

4

|

'

|

|

'

|

_

_

_

_

|

'

|

|_|

|_|

|_|

|_|

|

'

|

Reset

+

+

-

|

'

|

|

'

|

Min

Hour

Min

Min

|

' ---------------------------------------

'выполнение программ обработки кнопок - основной список

'0: пустой переход из-за того, что кнопки нумеруются с 1-й, а не с 0-й

'1: Сбросить минуты 2: Добавить час 3: Добавить минуту 4: Убавить минуту

'---------------------------------------------------------

Программа обНазначение кнопок выбрано произвольно. Для перехода к программам обработки кнопок работки кнопок используется специальная функция On – Goto с индексированием списка меток. Дает быстрый и экономичный код. Применение функции Select Case не рекомендуется, так как не по-

зволяет вкладывать объемные конструкции.

W_klb:

On Buf_kl Goto Kn , Km1 , Km2 , Km3 , Km4

'обработать нажатие кнопки

'---------

Km1:

'сбросить минуты

Rmin = 0

If Rmin > 30 Then

'при необходимости округления

Goto Km2

'скорректировать счетчик минут

End If

Km1_1:

'поставить признак обновления индикации

Ddat = 255

Kn:

Return

'---------

Km2:

'плюс час

Incr Rhour

If Rhour > 23 Then

'при необходимости

Rhour = 0

'скорректировать счетчик часов

End If

Goto Km1_1

'---------

Km3:

'плюс минута

Incr Rmin

If Rmin > 59 Then

'при необходимости

Rmin = 0

'скорректировать счетчик минут

End If

Goto Km1_1

'---------

Km4:

'минус минута

Decr Rmin

If Rmin = 255 Then

'при необходимости

Rmin = 59

'скорректировать счетчик минут

End If

Goto Km1_1

'----------------------------------------------------------------------------------

============================================================================= 11


===================================== Справочник по программированию «Bascom-AVR» ==

Первая версия программы готова, она полностью работоспособна, но функционально бедна. Структура программы во всех компонентах открыта для расширения функциональных возможностей. Определив набор добавляемых функций, следует выбрать путь реализации новых задач. Существует несколько подходов:

-простое добавление новых функций по имеющимся правилам работы программы. Этот путь пригоден для небольших добавлений, похожих на уже имеющиеся;

-добавление новых функций по другим правилам построения программы. Необходимость в этом возникает при создании многофункциональных систем и обычно решается создание других разделов с собственной структурой ГЦ;

-добавление сложных функций в виде отдельных модулей, содержащих все необходимые компоненты ввода и отображения данных. Это приемлемый вариант реализации небольшого количества функций при некритичном времени реагирования на внешние воздействия. Примером таких функций могут быть программы тестирования, сохранения данных, обработка протокола установления связи;

-создание новых функций посредством специальных инструментов – утилит. Утилиты – специальные программы, облегчающие реализацию часто повторяющихся операций. Использование утилит для расширения системы наиболее эффективно при реализации большого количества несложных и похожих функций. Рассмотрим примеры построения и применения утилит.

Этап 5. «Создание утилит для расширения функциональных возможностей». Задача этапа – создание набора стандартных программных модулей для выполнения элементарных операций.

Требуемый для расширения набор утилит определяется составом добавляемых функций. Выберем, например, следующий набор расширяемых режимов:

-выбор с помощью меню;

-многофункциональная клавиатура;

-отображение текстовых сообщений.

Для этого нам понадобятся следующие утилиты:

-вывод указанного текстового сообщения на индикатор, например, с помощью индекса;

-останов на фиксированное время с ожиданием нажатия кнопки.

При добавлении этих утилит прошлось расширить список используемых переменных и функций прерывания реального времени. Все изменения в программе можно наблюдать в полном измененном тексте, который будет приведен дальше.

Этап 6. «Расширение функциональных возможностей с помощью утилит».

В программу версии 2 добавлено:

-несколько новых переменных для обеспечения работы новых систем;

-расширена функция программы прерывания таймера 0. Добавлена ветка формирования временных интервалов 64 мс и проверка запрета звукового сигнала;

-расширена функция программы формирования изображения;

-добавлен и выделен отдельно раздел утилит (вспомогательных универсальных программ формирования изображения и управления). Там же расположены расширенные таблицы кодов сегментов и сообщений;

-добавлено начальное сообщение;

-изменены и добавлены функции клавиатуры. Функции, конечно, надуманные, но это демонстрационная программа. Показан один из основных механизмов создания многофункциональной клавиатуры;

-добавлены программы коррекции монтажа индикатора и клавиатуры (при отклонении фактической разводки от теоретической модели.

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

Этап 7. «Оптимизация программы».

Прагматичный (лишь бы работало) стиль программирования часто оказывается, безответственным. Практика показывает, что встроенное программное обеспечение часто подвергается доработке в процессе производства и даже эксплуатации. Законченный программный проект в той или иной степени должен удовлетворять возможности дальнейшей доработки или, в крайней случае, должен быть пригоден для заимствования его частей для других проектов. Что нужно для этого сделать? Следующее:

-просмотреть текст программы и одинаковые участки, даже если это всего одна строка, попытаться оформить в качестве отдельной подпрограммы. В приведенной программе такие примеры имеются;

-попробовать свести к одной подпрограмме похожие участки программы, сделав, например, несколько входов с различными параметрами и промежуточное преобразование;

-устранить слишком длинные участки программ, оформив их как функционально законченную подпрограмму. В первую очередь это относится к вычислительным программам;

============================================================================= 12


===================================== Справочник по программированию «Bascom-AVR» ==

-провести подробное комментирование программы. Особенно тщательно описывая, протоколы, форматы данных, условия принятия решение, обязательно применительно к тем физическим процессам, с которыми взаимодействует программа;

-в максимальной степени представить применяемые цифровые константы в символьном виде. Их определение вынести в заголовки и указать их назначение;

-обязательно указать номер версии продукта, разницу в версиях (историю доработок), дату создания (компиляции), версию и тип компилятора.

После оптимизации (и в процессе тоже) необходимо провести повторную компиляцию и проверку функционирования.

ПРОГРАММА 4

Вторая версия программы Содержит все добавления.

'------------------------------------------

' Программа "AVR-WATCH" (версия 2)

'------------------------------------------

типа ATMEGA8

' Микроконтроллер

'------------------------------------------

Fuses:

' Программируемые

- низкочастотный кварцевый резонатор

' CKSEL3...

CKSEL0

= 1001

'CKOPT=0 - внутренние конденсаторы подключены к кварцевому резонатору

'RSTDISBL=1 - порт PC6 используется как сброс

'WDTON=1 - сторожевой таймер разрешен

'SPIEN=0 - последовательное программирование разрешено

'BOOTSZ1,BOOTSZ0 = 00, BOOTRST=1 - параметры загрузчика

'EESAVE = 1 - НЕ ОЧИЩАТЬ EEPROM при программировании

'BODLEVEL=1, BODEN=1 - ПАРАМЕТРЫ СБРОСА

'SUT1=1,SUT1=0 - ВРЕМЯ СТАРТА

'------------------------------------------

'Ресурсы:

'Генератор RC - внутренний 1 МГц, а к TOSC1 and TOSC2 подключен кристалл 32768 Гц

'На выходе PB3 (OC2) импульсы длительностью 1 с (0.5 Гц)

'На выходе PB1 (OC1A) звуковой сигнал

'Порт Portd выход сегментов

' Portc0...

Portc3 - код знакоместа (позиционный) он же порт сканирования клавиатуры

' Четыре кнопки: Port0...

Portc3 - код сканирования клавиатуры, Portc4 - линия возврата клавиатуры

'------------------------------------------

'определить тип микроконтроллера

$regfile = "m8def.dat"

'------------------------------------------

'признак "обновить данные"

Dim Ndat As Byte

Dim Ddat As Byte

'признак "обновить индикатор"

'---------------------

'режим отображения: 0 - ЧЧММ, 1 - ММСС, 2 - погашен

Dim Mdisp As Byte

Dim Msnd As Byte

'режим звука: 0 - включен, <>0 - выключен

'---------------------

'программный счетчик времени

Dim S_tim As Byte

Dim W_tim As Byte

'счетчик времени задержек

Dim R_btim As Byte

'счетчик времени звонка

'---------------------

'счетчик секунд

Dim Rsec As Byte

Dim Rmin As Byte

'счетчик минут

Dim Rhour As Byte

'счетчик часов

'---------------------

'код нажатой кнопки

Dim Buf_kl As Byte

Dim Buf_pkl As Byte

'предварительный код нажатой кнопки

Dim R_ckl As Byte

'счетчик удержания клавиатуры

'---------------------

'буфер индикации (копия сегментов)

Dim Buf_dis(4) As Byte

Dim Cnt_dis As Byte

'счетчик индикации

Dim Tmpb As Byte

'временное значение

Dim Index As Byte

'временное значение

Dim Value As Byte

'временное значение

'---------------------

'текстовая строка

Dim Bufr As String * 10

'------------------------------------------

'генератор 1 МГц, необходим компилятору для правильного

$crystal = 1000000

'

' вычисления задержек и других временных параметров

'назначение векторов прерывания.

On Timer0 Timer0_int Nosave

'вектор прерывания

от

таймера 0

On Timer2 Timer2_int Nosave

'вектор прерывания

от

таймера 2

'------------------------------------------

'режим IDLE - разрешить

Mcucr = &B10000000

============================================================================= 13


===================================== Справочник по программированию «Bascom-AVR» ==

'ТАЙМЕРЫ

Tccr0 = &B00000011

'режим таймера 0: Fкв/64 - часы реального времени

'

---------------------

'режим таймера 1:

Tccr1a

= &B01000000

'генератор звука 2 кГц с выходом на PB1 (OC1A)

Tccr1b

= &B00001000

'делитель Fкв / 1 и с выходам Oc1a

Ocr1ah

= 0 : Ocr1al = 250

'и коэффициетном Fкв/250*2

'

---------------------

'режим таймера 2: генератор секундых импульсов

Assr.3

= 1 : Wait 1

'включить НЧ-генератор AS2 и подождать стабилизации амплитуды

Tcnt2 = 0 : Waitms 10

'очистить счетчик и подождать пока значение

Ocr2 =

128 : Waitms 10

'перепишется из временного буфера

'установить значение сравнения

Tccr2 = &B00010101

'установить коэффициент деления прескалера К=128

'и выход секундных импульсов на PB3 (OC2)

'

---------------------ПОРТЫ

'

'направление линий порта B: 1 - на вывод

Ddrb = &B00001010

Portb = &B11111111

'исходное состояние линий B: hhhh1h1h

'

Ddrc---------------------= &B00001111

'направление линий порта C: 1 - на вывод

Portc = &B11111111

'исходное состояние линий C: hhhh1111

'

Ddrd---------------------= &B00000000

'направление линий порта D: 1 - на вывод

Portd = &B11111111

'исходное состояние линий D: hhhhhhhh

'

'* h - высокий уровень, подтянутый через резистор

---------------------прерывания.

'

Timsk = &B010000001

'разрешить прерывание от переполнения таймера 0

Enable

Timer0

Enable

Timer2

'разрешить прерывание от переполнения таймера 2

Enable

Interrupts

'разрешить прерывания.

'

---------------------Index = 1 : Gosub Dis_tr

'ВЫВОД СООБЩЕНИЯ СООБЩЕНИЯ (НОМЕР ВЕРСИИ)

Wait 1

'подождать

'ГЛАВНЫЙ ЦИКЛ

Mc:

Ndat <> 0 Then

If

'очистить "обновить данные"

Ndat = 0

Gosub New_data

'обработать данные

Goto Mc

End If

If

Ddat <> 0 Then

'очистить "обновить индикатор"

Ddat = 0

Gosub New_led

'обновить индикатор

Goto Mc

End If

If

Buf_kl <> 0 Then

'следующая строка добавляется при необходимости

'

Gosub Tr_klb

'скорректировать номер кнопок

Gosub W_klb

'обработать нажатие

Buf_kl = 0

'очистить оработанное нажатие

Goto Mc

End If Idle

Goto Mc '----------------------------------------------------------------------------------

'ОБРАБОТКА ПРОГРАММ ГЛАВНОГО ЦИКЛА

'---------------------

'обработать данные времени по истечении секунды

New_data:

Incr Rsec

59 Then

'плюс секунда

If Rsec >

'при необходимости

Rsec =

0

: Goto Ndata1

'скорректировать счетчик секунд

End If

Goto Ndata3

Ndata1:

'плюс минута

Incr Rmin

59 Then

If Rmin >

'при необходимости

Rmin =

0

: Goto Ndata2

'скорректировать счетчик минут

End If

Goto Ndata3

Ndata2:

'плюс час

Incr Rhour

If Rhour > 23 Then

'при необходимости

Rhour = 0

'скорректировать счетчик часов

End If

Ndata3:

'поставить признак обновления индикации

Ddat = 255

============================================================================= 14


===================================== Справочник по программированию «Bascom-AVR» ==

Return '----------------------------------------------------------------------------------

Здесь проведена оптимизация Подпрограммы Add_vtmpb и Add_sz появились в результате оптимизации исходно текста

'обновить индикатор по завершению одной из операций в соответствии с текущим состоянием

New_led:

'очистить строку

Bufr = ""

If Mdisp = 1 Then

'выбрать вариант обработки индикатора

Goto Nled2

'на формирования отображения ММСС

Elseif Mdisp = 2 Then

'на гашение

Goto Nled3

End If

'сформировать символьное изображение времени в виде ЧЧММ

Tmpb = Rhour : Gosub Add_vtmpb

'добавить значение часов

'

Tmpb = Rmin : Gosub Add_vtmpb

'добавить значение минут

---------

Nled1:

'получить код первого знакоместа

'

Gosub Asc_seg : Buf_dis(1) = Tmpb

Gosub Asc_seg2 : Buf_dis(2) = Tmpb

'получить код второго знакоместа

'

Gosub Asc_seg2 : Buf_dis(3) = Tmpb

'получить код третьего знакоместа

'

Gosub Asc_seg2 : Buf_dis(4) = Tmpb

'получить код четвертого знакоместа

Return

'---------

'сформировать символьное изображение времени в виде ММСС

Nled2:

'добавить значение минут

Tmpb = Rmin : Gosub Add_vtmpb

Tmpb = Rsec : Gosub Add_vtmpb

'добавить значение секунд

'

Goto Nled1

'погасить индикатор

Nled3:

'погасить все сегменты

Buf _ dis(1) = 255

Buf _ dis(2) = &HFF

Buf _ dis(3) = &B11111111

Buf _ dis(4) = 255

Return

'---------

'п/п результат оптимизации

Add_vtmpb:

'если значение выражается одной цифрой

If Tmpb < 10 Then

Gosub Add_sz

'добавить символ лидирующего нуля

End If

'добавить значение

Bufr = Bufr + Str(tmpb)

Return

'---------

Add_sz:

'добавить символ лидирующего нуля

Bufr = Bufr + "0"

Return

'----------------------------------------------------------------------------------

программы клавиатуры

'

'---------------------------------------------------------

' ---------------------------------------

|

AVR-WATCH

|

'

' ---------------------------------

|

|

---

---

---

---

|

|

'

|

|

|

|

|

'

| | |

|

|

|

|

| |

'

|

|

---

---

|

|

---

---

|

|

|

'

| | |

|

|

|

|

| |

'

|

|

--- []

--- []

--- []

--- [] |

|

' ---------------------------------

|

1

2

3

4

|

'

|

|

'

|

_

_

_

_

|

'

|

|_|

|_|

|_|

|_|

|

'

|

Reset

+

+

Shift

|

'

|

|

'

|

Min

Hour

Min

|

' ---------------------------------------

'выполнение программ обработки кнопок - основной список

'0: пустой переход из-за того, что кнопки нумеруются с 1-й, а не с 0-й

'1: Сбросить минуты 2: Добавить час 3: Добавить минуту 4: Второе назначение

'

|

_

_

_

_

|

'

|

|_|

|_|

|_|

|_|

|

============================================================================= 15