Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Прямая работа с регистрами в BASCOM-AVR


Прямая работа с регистрами в BASCOM-AVR

Сообщений 1 страница 11 из 11

1

http://radiokot.ru/forum/viewtopic.php?f=20&t=64869

Марк Альбертс создавал BASCOM-AVR как C-BASIC.Это означает, что в синтаксисе языка заложена возможность прямой работы с регистрами МК.
Например, для организации низкочастотной ШИМ при управлении мощностью в нагрузке с помощью тиристора или транзистора удобнее всего управлять ШИМ по прерыванию от таймера TIMER0, получая виртуальную «пилу» увеличением переменной 1 на 1 при каждом прерывании и сбрасывая ее в 0 при достижении максимального значения, и сравнивать значение «пилы» с переменной 2, выключая энергию при равенстве значений.
Все это работает прекрасно, но если в системе используются датчики DS18S20, требуется регулярно запрещать прерывания на время работы с датчиком, что нарушает работу ШИМ и других устройств,работающих по временному прерыванию.
Для того, чтобы убрать этот дефект, можно использовать возможность прямого управления регистрами МК.Например, для использования TIMER2 в качестве аппаратного ШИМ, Марк Альбертс предлагает следующее.Чип ATmega8535.
1)Задаем режимы регистра управления TCCR2 для режима FAST PWM, например:
FOC2=0 ‘8 разряд
WGM20=1 ‘fast PWM
COM21=1 ‘выход уст. в ноль
COM20=0 ‘выход уст. в ноль
WGM21=1 ‘fast PWM
CS22=1 ‘делитель (на 256)
CS21=0 ‘то же
CS20=0 ‘то же
2)В регистр управления OCR2 периодически записываем переменную для регулирования скважности A , величину которой регулируем от 0 до 255(например, нажатием кнопок).

&clock = 16000000
Dim A As Byte
Config Timer 2 = Timer
Preskale = 256
TCCR2 = 124 ‘(0+64+32+0+8+4+0+0)

Begin:
………………………………………………………………….
(меняем А в цикле)
OCR2=A ‘ШИМ с частотой 1 кГц
………………………………………………………………….
Disable interrupts ‘ШИМ непрерывен на выходе Timer 2!
(работа с 18S20)
Enable interrupts
………………………………………………………………….
Goto Begin
Возможно, эта информация от Марка Альбертса кому-то будет полезной.

Учитывая, что режимов PWM 8-разрядный счетчик AVR имеет 6 видов, я поинтересовался у автора языка, какой именно PWM он имел в виду. На это и последовала рекомендация по прямой работе с регистрами(это было лет 5 назад), которая позволяет работать в этих 6 режимах. Главное, что компилятор ПОНИМАЕТ прямое обращение к регистрам, как в С.Другое дело, что аппаратные возможности AVR некорректны и требуют дополнительных усилий:в частности, при А=0 в вышеприведенном примере на выходе будет короткий всплеск из-за асинхронного обнуления счетчика, то есть не 0!Также прямая работа с регистрами возможна и для других устройств МК.

0

2

Тема весьма актуальная, только как я понимаю, проблема кроется в простых АВРах, там же приоритет прерываний нельзя настраивать, а таймера в этой таблице находятся где-то внизу...приходится программно этот момент отслеживать. (

0

3

Что за ерунда? Что за C-BASIC? Во всех языках программирование есть доступ к регистрам.
Вопрос в другом - знаешь или хочешь ли ты знать, что они существуют

0

4

А возможно ли в баскоме непосредственное обращение к битам регистра? Например как в С :
ldi  r16, (1<<twint) | (1<<twsto) | (1<<twen)
По Руски это будет так: выставить в одиницу биты twint, twsto и twen
В файле описания процессора эти быты есть, компилятор должен понимать их. А вот как сделать OR или AND я не разобрался. Можно???

0

5

-NMi- написал(а):

По Руски это будет так: выставить в одиницу биты twint, twsto и twen

TWCR.twint = 1
TWCR.twsto = 1
TWCR.twen = 1

0

6

OK!!!
Саш, а вот эти ТРИ команды они скомпилируются как в С ??? Т.е. одним байтом? Типа STS TWСR, данные??? Или три разных команды???

0

7

TWCR.twint = 1
TWCR.twsto = 1
TWCR.twen = 1

Компильнул и раздезил.
LDS....
OR...
STS...
И так три раза. Непойдёт. Есть инструмент более быстрый???

0

8

Странно, а в протеусе у меня всё быстрей.
http://s7.uploads.ru/t/w53hb.jpg
Может у нас религиии разные?

0

9

-NMi- написал(а):

OK!!!
Саш, а вот эти ТРИ команды они скомпилируются как в С ??? Т.е. одним байтом? Типа STS TWСR, данные??? Или три разных команды???


Подчёркивания не обязательны, просто для удобства.

3 разные команды, если надо одну, тогда так:  TWCR = &B_xxxx_xxxx

Вы определитесь, --"шашечки, или ехать"

Если играться с битами в байте по отдельности - это долго, если изменять несколько бит за раз, то быстро.

Изменение всего байта:
!ldi Rxx , значение (&B_xxxx_xxxx)   ' 1 такт
!sts {переменная} , Rxx   ' 2 такта

' Toggle нужные биты
   lds R16 , {Переменная_byte}       ' 2 такта
   ldi R17 , &B_1000_1010       ' 1 такт   ' Toggle биты с единицами
   eor R16 , R17
   sts {Переменная_byte} , R16       ' 2 такта

' Пишем 1 в нужные биты
'    !lds R16 , {Переменная_byte}       ' 2 такта
'    !ori R16 , &B_0101_0101       ' Биты с нулями не изменяются
'    !sts {Переменная_byte} , R16       ' 2 такта

' Пишем 0 в нужные биты
'    !lds R16 , {Переменная_byte}       ' 2 такта
'    !andi R16 , &B_1010_1010       ' Биты с единицами не изменяются
'    !sts {Переменная_byte} , R16       ' 2 такта

0

10

Это давным давно понятно.
Просто работая "напрямую" с регистрами контроллера хочется НАГЛЯДНОСТИ кода как в С. Иначе волосы подымаются, если помотреть листинг недельной давности. )))
Ну чтож... нет так нет, раньше же как-то разбирался. )))

0

11

Вот кусок раздэза этих трёх команд:http://sa.uploads.ru/t/T3yMO.jpg

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Прямая работа с регистрами в BASCOM-AVR