$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 ByteDo
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
'===============================================================================
Расчёт байтовой переменной из процентов в формате 0...255 = 0...100%
Сообщений 1 страница 2 из 2
Поделиться12022-01-17 18:07:06
Поделиться22022-01-18 03:44:01
Обнаружилась возможная проблема с переполнением переменных.
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 BytePercent = 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
'===============================================================================