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

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

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

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



Вставки на ASM

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

1

может кто разжевать?
есть такой код в обработчике прерывания INT0

Incr Переменная_word
If Переменная_word = Count Then
Stop Timer1
Переменная_word = 0
Set Led
End If

пробую заменить это на ассемблерный код, (заменить громко сказано) тиснул пример у Александра

Loadadr Переменная_word , X
!ld R30 , X+
!ld R31 , X
!subi R30 , &HFF
!sbci R31 , &HFF
!st X , R31
!St -x , R30

но как сюда вставить сравнение переменной с константой, не могу сообразить
перепробовал все, что есть в этой ветке связанное с CPI, подскажите кто соображает

0

2

Имя переменной заключается в фигурные скобки.
Например: ldi r30, {имя}

Кстати, у Александра это можно отследить прекрасно (в первых строках):
Вставки на ASM AVR (ассемблер)

Полистайте, тут много интересного: http://www.gaw.ru/html.cgi/txt/doc/micr … /start.htm

0

3

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

может кто разжевать?
есть такой код в обработчике прерывания INT0

2 варианта, не забываем про "Nosave"

'===============================================================================
  Interrupt_handling:       '34 такта (счёт); 40 тактов (счёт + реакция на сравнение)
'-------------------------------------------------------------------------------
  'If Val_word = 0 Then
      'Stop Timer1
      'Led = On_led
    'Else
      'Decr Val_word
  'End If

    !push R16
    !in R16 , sreg
    !push R16
    !push R30
    !push R31

    !lds R30 , {Val_word}
    !lds R31 , {Val_word + 1}

    'If Val_word = 0 Then
    !clr R16
    !cpi R30 , 0
    !cpc R31 , R16
    !breq Reaction_compare_variables
    !rjmp Decrement_variable

   Reaction_compare_variables:
    'Stop Timer1
    !lds R16 , tccr1b
    !andi R16 , &B_1111_1000
    !sts tccr1b , R16

    'Set Led
    Led = On_led

    !rjmp Exit_isr_compare1a

    'Else
   Decrement_variable:
    'Decr Val_word
    !sbiw R30 , 1       ' Вычесть константу из слова

   Exit_interrupt_handling:
    !sts {Val_word} , R30
    !sts {Val_word + 1} , R31
    'End If

    !pop R31
    !pop R30
    !pop R16
    !out sreg , R16
    !pop R16

    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Interrupt_handling:       '41 такт (счёт); 49 тактов (счёт + реакция на сравнение)
'-------------------------------------------------------------------------------
  'Incr Переменная_word

  'If Переменная_word = Count Then
      'Stop Timer1
      'Переменная_word = 0
      'Set Led
  'End If

    !push R26
    !in R26 , sreg
    !push R26
    !push R27
    !push R30
    !push R31

    'Incr Val_word
    !lds R30 , {Val_word}
    !lds R31 , {Val_word + 1}
    !adiw R30 , 1       'Сложить константу и слово

    !lds R26 , {Count_word}
    !lds R27 , {Count_word + 1}

    'If Val_word = Count Then
    !cp R30 , R26
    !cpc R31 , R27
    !breq Reaction_compare_variables
    !rjmp Exit_isr_compare1a

   Reaction_compare_variables:
    'Stop Timer1
    !lds R30 , tccr1b
    !andi R30 , &B_1111_1000
    !sts tccr1b , R30

    'Val_word = 0
    !clr R30
    !clr R31

    'Set Led
    Led = On_led

    'End If

   Exit_interrupt_handling:
    !sts {Val_word} , R30
    !sts {Val_word + 1} , R31

    !pop R31
    !pop R30
    !pop R27
    !pop R26
    !out sreg , R26
    !pop R26

    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Если возможно, целесообразнее использовать байтовые переменные, будет быстрее ~ в 2 раза

Вариант для байтовых переменных

'===============================================================================
  Interrupt_handling:       '19 тактов (счёт); 27 тактов (счёт + реакция на сравнение)
'-------------------------------------------------------------------------------
  'If Val_byte = 0 Then
      'Stop Timer1
      'Led = On_led
    'Else
      'Decr Val_byte
  'End If

    !push R16
    !in R16 , sreg
    !push R16

    !lds R16 , {Val_byte}

    'If Val_byte = 0 Then
    !cpi R16 , 0
    !breq Reaction_compare_variables
    !rjmp Decrement_variable

   Reaction_compare_variables:
    'Stop Timer1
    !lds R16 , tccr1b
    !andi R16 , &B_1111_1000
    !sts tccr1b , R16

    !clr R16

    'Set Led
    Led = On_led

    !rjmp Exit_interrupt_handling

    'Else
   Decrement_variable:
    'Decr Val_byte
    !subi R16 , 1       'Вычитание константы

   Exit_interrupt_handling:
    !sts {Val_byte} , R16
    'End If

    !pop R16
    !out sreg , R16
    !pop R16

    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

0

4

Спасибо Александр!
буду разбираться, после Ваших примеров
стал даташиты читать, раньше дальше Pinmap не опускался, сейчас вот
на одной вкладке система команд avr, на другой код из Вашего ответа:)

0

5

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

стал даташиты читать

ASM на русском

+1

6

добавил в закладки, в коде вроде разобрался, немного подправил, в Proteus`e
код работает, опирался на это:
http://www.gaw.ru/html.cgi/txt/doc/micr … /start.htm
спасибо.

0

7

такой вопрос.
проект на АтМеге128. Смотрю что в прерывании делает бэйсик, как сохраняет регистры перед выполнением программы по прерыванию

Код:
******
push r30
push r31
in r24,$3F (это видимо SREG)
push r24
in r24,$3b (?)
push r24
clr r24
Out  $3b,r24

может кто разъяснить, что он делает? строчки, после сохранения SREG?

0

8

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

может кто разъяснить, что он делает? строчки, после сохранения SREG?

Если памяти больше 65535, надо обязательно сохранять RAMPZ, что Bascom собственно и делает.

Для универсальности можно так:

     !Push R16
    !In R16 , Sreg
    !Push R16

    #if _romsize > 65535
        !in R16 , RAMPZ
        !Push R16
        !clr R16
        !out RAMPZ , R16
    #endif

.....
.....
.....

    #if _romsize > 65535
        !pop R16
        !out RAMPZ  , R16
    #endif

    !pop R16
    !Out Sreg , R16
    !Pop R16

    !reti

+2

9

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

in r24,$3F (это видимо SREG)
push r24
in r24,$3b (?)

В документации на МК есть такой раздел "Register Summary", который расписывает регистры согласно цифровой маркировки.

https://upforme.ru/uploads/0000/25/b8/1217/t726542.jpg

+1

10

+
спасибо, блин ни как не мог найти его

0