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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Применение Assembler в среде Bascom(-8051) » Расчёт байтовой переменной из процентов в формате 0...255 = 0...100%


Расчёт байтовой переменной из процентов в формате 0...255 = 0...100%

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

1

Расчёт байтовой переменной из байтового значения процентов

$regfile = "m328pdef.dat"
  $crystal = 1000000
  $framesize = 32
  $hwstack = 40
  $swstack = 16

  $baud = 4800

  Dim Val_byte As Byte
  Dim Percent As Byte

'Функция расчёта байтового значения из байтового значения процентов (имеем 0...100% получаем 0...255)
  Declare Function Calculate_value_byte_perzent(byval Val_byte As Byte) As Byte

Do

  Incr Percent

'Время исполнения: 102 такта
'Переход = 31 такт + 53 такта выполнение функции + 18 тактов возврат
  Val_byte = Calculate_value_byte_perzent(percent)

Loop
End

'===============================================================================
'Время исполнения 53 такта
  Function Calculate_value_byte_perzent(byval Val_byte As Byte) As Byte
'-------------------------------------------------------------------------------
   'Забираем данные из "Val_byte"
    !ld   R26 , Y
    !ld   R27 , Y+1
    !ld   R16 , X
    !cpi  R16 , 100       'Проверка на не более 100%
    !BRLO Load_percent
    !ldi  R16 , 100       '100%
   Load_percent:
    !ldi  R17 , 255
    !Mul  R16 , R17
    !movw R20 , R0
    !ldi  R22 , 154
    !ldi  R23 , 25
    !clr   R2
    !mul  R23 , R21
    !movw R18 , R0
    !mul  R22 , R20
    !movw R16 , R0
    !mul  R23 , R20
    !add  R17 , R0
    !adc  R18 , R1
    !adc  R19 , R2
    !mul  R21 , R22
    !add  R17 , R0
    !adc  R18 , R1
    !adc  R19 , R2
    !movw R20 , R18
    !mul  R23 , R21
    !mov  R18 , R0
    !mul  R22 , R20
    !movw R16 , R0
    !mul  R23 , R20
    !add  R17 , R0
    !adc  R18 , R1
    !mul  R21 , R22
    !add  R17 , R0
    !adc  R18 , R1
   'Забираем адрес "Calculate_value_byte_perzent"
    !ld   R26 , Y+2
    !ld   R27 , Y+3
   'Забираем готовые данные
    !st     X , R18
'-------------------------------------------------------------------------------
  End Function
'===============================================================================

+3

2

Обнаружилась возможная проблема с переполнением переменных.

Fix или решение:

Исходник

$regfile = "m328pdef.dat"
  $crystal = 1000000
  $framesize = 32
  $hwstack = 40
  $swstack = 16

  $baud = 4800

  Dim Val_byte As Byte
  Dim Percent As Byte

'Функция расчёта процентов из байтового значения (имеем0...100% получаем 0...255)
  Declare Function Calculate_value_byte_percent(byval Val_byte As Byte) As Byte

  Percent = 98

Do

  Incr Percent

  If Percent > 100 Then
      Percent = 100
  End If

'Время исполнения: 102 такта
'Переход = 31 такт + (min 49);(max) 53 такта выполнение функции + 18 тактов возврат
  Val_byte = Calculate_value_byte_percent(percent)

Loop
End

'===============================================================================
'Время исполнения 53 такта
  Function Calculate_value_byte_percent(byval Val_byte As Byte) As Byte
'-------------------------------------------------------------------------------
   'Забираем данные из "Val_byte"
    !ld   R26 , Y
    !ld   R27 , Y+1
    !ld   R16 , X
    !cpi  R16 , 100       'Проверка на не более 100%
    !BRLO Load_percent
    !ldi  R16 , 100       '100%
    !ldi  R18 , 255
    !rjmp Save_data_percent
   Load_percent:
    !ldi  R17 , 255
    !Mul  R16 , R17
    !movw R20 , R0
    !ldi  R22 , 154
    !ldi  R23 , 25
    !clr   R2
    !mul  R23 , R21
    !movw R18 , R0
    !mul  R22 , R20
    !movw R16 , R0
    !mul  R23 , R20
    !add  R17 , R0
    !adc  R18 , R1
    !adc  R19 , R2
    !mul  R21 , R22
    !add  R17 , R0
    !adc  R18 , R1
    !adc  R19 , R2
    !movw R20 , R18
    !mul  R23 , R21
    !mov  R18 , R0
    !mul  R22 , R20
    !movw R16 , R0
    !mul  R23 , R20
    !add  R17 , R0
    !adc  R18 , R1
    !mul  R21 , R22
    !add  R17 , R0
    !adc  R18 , R1
   Save_data_percent:
   'Забираем адрес "Calculate_value_byte_percent"
    !ld   R26 , Y+2
    !ld   R27 , Y+3
   'Забираем готовые данные
    !st     X , R18
'-------------------------------------------------------------------------------
  End Function
'===============================================================================

+4


Вы здесь » Программирование ATMEL в BASCOM. » Применение Assembler в среде Bascom(-8051) » Расчёт байтовой переменной из процентов в формате 0...255 = 0...100%