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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Применение Assembler в среде Bascom(-8051) » Пишем обработчик прерывания на ассемблере


Пишем обработчик прерывания на ассемблере

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

1

Появилась задача немного ускорить обработку прерывания. Естественно переходим на ассемблер.
Прерывание PCINT0, обработка не сложная, нужно ловить и фронт и спад.
На BASCOM это выглядит так (приведу адреса куда компилятор расположил переменные):

Код:
   k = PINB.6                                               'Адрес К - 013A
   If k = 0 Then                                            'Сигнал через транзисторный ключ, поэтому инверсный
      Flag_On = 1                                           'Адрес - 0140
      Flag_Full = 1                                         'Адрес - 013F
      Flag_Off = 1                                          'Адрес - 013Е
   Else
      Flag_On = 0                                          
   End If


Компилируем и смотрим что же нам предложил BASCOM. Не стал переписывать, а приведу скриншот.
https://upforme.ru/uploads/0000/25/b8/819/t268840.jpg
Еще и куча PUSH и POP. NoSave в данном случае не канает.
Нда, разработчик явно был под мухой, когда это писал. Ладно, сделаем по своему.

Код:
   $Asm
      push R24
      in R24,sreg
      push R24
'Начало работы
      in R24,pinB                                           'Читаем пины порта B
      andi R24,&B01000000                                   'Маска на выводы PINB.6
'Проверка состояния вывода
      cpi R24,0                                             'Проверяем состояние PINB.6. На нём сигнал инверсный, значит при включении 0
      breq Yes                                              'Пин = 0, установим флаги
      jmp No                                                'Нет, идём дальше
Yes:
      LDI R24,1                                             'Установим флаги  в 1
      sts {Flag_On},R24
      sts {Flag_Full},R24
      sts {Flag_Off},R24
      jmp Exit
No:
      clr R24                                               'Установим флаг  в 0
      sts {Flag_On},R24
Exit:
'Восстановим регистры
      pop R24
      out sreg , R24
      pop R24
   $End Asm

Получилось чтение пина и проверка его состояния 5 операций вместо 13 в оригинале. 4 операции установки флагов вместо 6.
Само собой исчезли лишние PUSH и POP.
Смотрим прикуп:
BASCOM предложил решить задачу 88 операторами (включая PUSH и POP).
Я обошёлся всего 18-ю. Игра стоила свеч.
Вот как то так получилось.

Отредактировано sva-don (2024-04-17 12:58:44)

+2

2

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

NoSave в данном случае не канает.

почему? что меняется в асме при активации этого режима?

0

3

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

почему? что меняется в асме при активации этого режима?

Если включаем этот режим, то компилятор не будет генерировать код сохранения регистров, т.е. PUSH и POP будет полный бардак.
Когда пишем на чистом BASCOM, то в вначале кода будет 32 операторf PUSH с регистрами от 0 до 31 + два оператора сохранения системного регистра SREG.
В конце кода автоматически 32 оператора POP + 2 оператора восстановления системного регистра.
Всего получается 68 операторов.
При использовании ассемблера мы сами выбираем нужное количество регистров и сохраняем и восстанавливаем их.
В моём случае получилось всего 6 операторов вместо 68.

+4


Вы здесь » Программирование ATMEL в BASCOM. » Применение Assembler в среде Bascom(-8051) » Пишем обработчик прерывания на ассемблере