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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » Работа с переменными ч.1


Работа с переменными ч.1

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

1

Сборка из сообщений сайта и Справки Bascom.

' =======================================
' Работа с битами в переменной любого типа
' ---------------------------------------------------------------
' Работа с битами в переменной типа BIT
Объявленные переменные 1 бит занимают в памяти одного байта позиции, согласно очередности их объявления, начиная со старшего бита.
Например:
Dim A As Bit  ' займет бит 7 байтовой ячейки в памяти
Dim B As Bit  ' ...... бит 6
...и т.д.

Тогда как объявление
Dim Z As Byte
Z.0 = 1
Z.1 = 0...
... будет храниться в соответствующих ячейках.

' Работа с битами в переменной типа BYTE
Dim a As Byte
a = &B1111_0000
'                                 десятичное число 240
a.0 = 1   ' Установка бита "0" переменной А в "1"
'В переменной a = &B1111_0001
'                                 десятичное число 241
a.6 = 0   ' Установка бита "6" переменной А в "0"
'В переменной a = &B1011_0001
'                                 десятичное число 177
‘ PS.
Данный способ можно эффективно использовать для установки различных "флагов".
Обычно в качестве "флага" используется сигнализатор на уровне одного бита.

' PPS.
Аналогичные операции можно выполнять для регистров портов
PORTA.0 = 1   ' Установка пина "0" порта А в "1"
a = PINB.0       ' Чтение состояния пина "0" порта В

' ---------------------------------------------------------------
‘ Например, для переменной типа WORD
Dim a As Word
a = &B0000_1111_0000_0000
'                                 десятичное число 3840
a.0 = 1   ' Установка бита "0" переменной А в "1"
' В переменной b = &B1000_1111_0000_0001
'                                 десятичное число 3841
a.10 = 0   ' Установка бита "10" переменной А в "0"
' В переменной a = &B1000_1101_0000_0001
'                                 десятичное число 2817

' ---------------------------------------------------------------
' Переменные, имеющие +/- значения
' ---------------------------------------------------------------
Dim a As Integer       ‘ Для переменной типа INTEGER
a = &B0000_0000_B0000_0000
a.14 = 1
'В переменной a - &B0100_0000_B0000_0000
‘                                 положительное десятичное число 16384
a.15 = 1
'В переменной a - &B1100_0000_B0000_0000
‘                                 отрицательное десятичное число -16384

Dim a As Long       ‘ Для переменной типа LONG
a = &B0000_0000_0000_0000_0000_0000_0000_0000
a.30 = 1
'В переменной a – &B0100_0000_0000_0000_0000_0000_0000_0000
‘                                  положительное десятичное число 1073741824
a.31 = 1
'В переменной a – &B1100_0000_0000_0000_0000_0000_0000_0000
‘                                  отрицательное десятичное число -1073741824

' =======================================
' Групповая работа с битами
' ---------------------------------------------------------------
Var = BITS( b1 [,bn])
‘ Установить для всех указанных битов значение 1.
Dim a As Byte
a = &B0000_0000
a = Bits(1, 7)
'В переменной a - &B1000_0010

Var = NBITS( b1 [,bn])
‘ Установить для всех битов, кроме указанных, значение 1.
Dim a As Byte
a = &B0000_1111
a = NBits(1, 7)
'В переменной a - &B0111_1101

BITS и NBITS могут быть использоваться только для байтов и регистров портов.
Допустимое количество бит в диапазоне от 0 до 7.

Отредактировано Nord (2019-07-21 20:07:42)

+3

2

1-"Не секрет, что объявленная переменная 1 бит занимает в памяти 1 байт."
это не так. Баском резервирует бит в байте.
2-Другое дело, что работать с битом - энергозатратно как по времени, так и по памяти. Дешевле, на флаг назначать байт, а не бит.

+1

3

kip написал(а):

1-"Не секрет, что объявленная переменная 1 бит занимает в памяти 1 байт."
это не так. Баском резервирует бит в байте.
2-Другое дело, что работать с битом - энергозатратно как по времени, так и по памяти. Дешевле, на флаг назначать байт, а не бит.

верно
Я когда-то пытался так экономить память в мелких МК AVR (до этого я так делал в pic с малой памятью и помогало) -- тут этот метод не прокатил

так же автору рекомендую проверить объём памяти при использовании If Then и CASE -- первы обходится дешевле, потому от красивого Case был вынужден отказаться.

+1

4

kip написал(а):

Баском резервирует бит в байте.

Все так, только оставшиеся 7 бит уже не будут использоваться.
Выполнив:
Dim a As Bit
Dim b As Bit
мы получим в памяти два занятых байта...

В плане "затратности" - тут каждый выбирает нужный инструмент... ;)

0

5

Александр Д. написал(а):

так же автору рекомендую проверить объём памяти при использовании If Then и CASE

Здесь не ставилась цель освещения этих вопросов... ;)

0

6

Nord написал(а):

Выполнив:
Dim a As Bit
Dim b As Bit
мы получим в памяти два занятых байта...

Судя по файлу *.rpt это не так.

Код:
--------------------------------------------------------------------------------
Variable                         Type            Address(hex)   Address(dec)
--------------------------------------------------------------------------------
X                                Bit [7]           0100          256 
Y                                Bit [6]           0100          256 
A                                Bit [5]           0100          256 
B                                Bit [4]           0100          256 

+1

7

Пётр написал(а):

Судя по файлу *.rpt это не так.

Хм...  :confused:
Завтра проверим... ;)

Может, от версии зависит ?
У меня 2.0.7.8

0

8

Bascom 2.0.8.1

Dim A As Bit
Dim B As Bit
Dim C As Bit
Dim D As Bit
Dim E As Bit
Dim F As Bit
Dim G As Bit
Dim H As Bit

8 бит в одном байте, адрес один

http://sg.uploads.ru/t/TyoKX.jpg

+1

9

Сообщение #1 исправлено.

0


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » Работа с переменными ч.1