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

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

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

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



overlay

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

1

Добрый день.
Подскажите, кто такой overlay и с чем его едят. На вики просьба не отправлять, там есть пример, но возможность применения overlay не расписана.

0

2

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

Подскажите, кто такой overlay и с чем его едят

Если своими словами, тогда так:

У Вас есть переменная, допустим "Dim Переменная_long As Long", это переменная состоящая из 4 byte. Вам надо получить из переменной Long каждый byte отдельно.

Пишите:

Dim Переменная_long As Long
Dim Переменная_byte_1 As byte At Переменная_long Overlay
Dim Переменная_byte_2 As byte At Переменная_long + 1 Overlay
Dim Переменная_byte_3 As byte At Переменная_long + 2 Overlay
Dim Переменная_byte_4 As byte At Переменная_long + 3 Overlay

или так, если нужно где-то перебирать в цикле

Dim Переменная_long As Long
Dim Переменная_byte(4) As byte At Переменная_long Overlay

Проще говоря, Overlay - это разные имена переменных с одинаковыми адресами учитывая размерность переменных

Dim Переменная_long As Long At $100 Overlay     -  переменная занимает 4 байта  100; 101; 102; 103
Dim Переменная_byte_1 As byte At $100 Overlay  -  переменная занимает 1 байт    100
Dim Переменная_byte_2 As byte At $101 Overlay  -  переменная занимает 1 байт    101
Dim Переменная_byte_3 As byte At $102 Overlay  -  переменная занимает 1 байт    102
Dim Переменная_byte_4 As byte At $103 Overlay  -  переменная занимает 1 байт    103

Пример того, как получить коды сироковых символов

Dim Переменная_str As String * 10                   
Dim Переменная_byte(10) At Переменная_str Overlay

 
Переменная_str = "0123456789"

в переменных "Переменная_byte(n)"  получаете готовые коды без лишних телодвижений

Переменная_byte(1) = 48
Переменная_byte(2) = 49
Переменная_byte(3) = 50
Переменная_byte(4) = 51
Переменная_byte(5) = 52
Переменная_byte(6) = 53
Переменная_byte(7) = 54
Переменная_byte(8) = 55
Переменная_byte(9) = 56
Переменная_byte(10) = 57

Наберите в поиске по форуму "Overlay"  -  много интересной информации по этому вопросу.

Главное  -  не ошибитесь с размерностями переменных, иначе получите обратный эффект!

Удачи!

Отредактировано sasha_1973 (2015-09-06 12:39:13)

+4

3

sasha_1973
Спасибо.
Своими словами, лично для меня, намного понятнее.

0

4

Как в том мультике, всё время забываю, как называется (про волка и собаку)   --"Ну ты это, если что, заходи!"

Мультик "Жил-был пёс"

Отредактировано sasha_1973 (2015-09-07 05:32:34)

0

5

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

sasha_1973
Спасибо.
Своими словами, лично для меня, намного понятнее.

Да, всё по простому и понятно. Благодарю.

0

6

Я бы вообще оверлеями опасался бы пользоваться, слишком много мути в коде получается.
Увеличивается вероятность ошибки, потом фиг найдешь. Мне кажется, что корректнее использовать команду VARPTR.
Она укажет адрес переменной, ну а там уж сами распорядитесь что с ней делать. Например:

Код:
'Получение 4-х байт из Single (для примера)

Dim S as Single
Dim j as Word
Dim B(4) as Byte 

   j = Varptr(S)     'В переменную j получим АДРЕС переменной S.
  B(1) = Inp(j)      'В массив В положим побайтно переменную S
  B(2) = Inp(j+1)
  B(3) = Inp(j+2)
  B(4) = Inp(j+3)

Все тоже самое можно делать с любой переменной. Командой OUT можно записывать значения в любую переменную по ее адресу.

0

7

sva-don написал(а):

Я бы вообще оверлеями опасался бы пользоваться, слишком много мути в коде получается.

Покажите пример.

0

8

Тогда вообще, лучше так:

  Loadadr S , X
  !ld R16 , X+
  !ld R17 , X+
  !ld R18 , X+
  !ld R19 , X

  !sts {B(1)} , R16
  !sts {B(2)} , R17
  !sts {B(3)} , R18
  !sts {B(4)} , R19

0

9

sva-don написал(а):

'Получение 4-х байт из Single (для примера)

Dim S as Single
Dim j as Word
Dim B(4) as Byte

   j = Varptr(S)     'В переменную j получим АДРЕС переменной S.
  B(1) = Inp(j)      'В массив В положим побайтно переменную S
  B(2) = Inp(j+1)
  B(3) = Inp(j+2)
  B(4) = Inp(j+3)


Ошибка компиляции!  Bascom 2.0.7.1



Рабочий вариант:

  J = Varptr(s)       'В переменную j получим АДРЕС переменной S.
  B(1) = Inp(j)       'В массив В положим побайтно переменную S
  Incr J
  B(2) = Inp(j)
  Incr J
  B(3) = Inp(j)
  Incr J
  B(4) = Inp(j)

Отредактировано sasha_1973 (2015-09-07 19:52:05)

0

10

Ещё Overlay очень удобно использовать для работы с EEPROM МК.

Пример:

'                                                               '         +------  адрес хранения переменной в EEPROM МК
  Dim Переменная_word As Word                 '         |
  Dim Переменная_word_eeprom As Eram Word At $05

  Переменная_word = 12345   ' Запись в переменную
  Переменная_word_eeprom = Переменная_word    '  Запись переменной в EEPROM

Ждем_окончания_записи_eeprom:
  If Eecr.eepe <> 0 Then
      Goto Ждем_окончания_записи_eeprom
  End If

  Переменная_word = Переменная_word_eeprom    '  Чтение  переменной из EEPROM

Отредактировано sasha_1973 (2015-09-07 21:00:19)

-1

11

Копировал из исходника.

0

12

В наличии слова "Overlay"

0

13

Шоб було!

Может кому и сгодится.

0

14

Точно, наверно магнитные бури, или ещё что.

0

15

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

Сообщения 6 и 11 - бред. Удалять, исправлять или обосновывать никто не собирается. Поэтому минусы.

--"Ээх, жизсть моя - жестянка, ну её в болото!"

От Сергея Шилова, даже минус, за счастье!

Отредактировано sasha_1973 (2015-09-08 12:44:58)

0

16

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

sva-don написал(а):

    Я бы вообще оверлеями опасался бы пользоваться, слишком много мути в коде получается.

Сколько лет пользуюсь, никогда проблем не было.
Вы либо обоснуйте, либо отзовите заявление.


Извиняюсь за молчание, был в отпуске.
Может я не совсем правильно сформулировал фразу на счет мути. Я имел ввиду необходимость для программиста держать в голове адреса переменных и не перепутать их в своем коде.
Естественно при этом возрастает вероятность возникновения трудноуловимых ошибок.

0

17

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

sva-don написал(а):

    'Получение 4-х байт из Single (для примера)

    Dim S as Single
    Dim j as Word
    Dim B(4) as Byte

       j = Varptr(S)     'В переменную j получим АДРЕС переменной S.
      B(1) = Inp(j)      'В массив В положим побайтно переменную S
      B(2) = Inp(j+1)
      B(3) = Inp(j+2)
      B(4) = Inp(j+3)

Ошибка компиляции!  Bascom 2.0.7.1

Рабочий вариант:

  J = Varptr(s)       'В переменную j получим АДРЕС переменной S.
  B(1) = Inp(j)       'В массив В положим побайтно переменную S
  Incr J
  B(2) = Inp(j)
  Incr J
  B(3) = Inp(j)
  Incr J
  B(4) = Inp(j)

Отредактировано sasha_1973 (2015-09-07 19:52:05)

Подпись автора

    "Чем больше узнаешь, тем больше понимаешь, как мало знаешь!" - Сократ


Не знаю, у меня все четко работает.

0