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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Вопрос по ассемблеру для AVR


Вопрос по ассемблеру для AVR

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

1

Пожалуйста, помогите написать нижеследующее на ASM AVR, то, что генерирует Bascom не устраивает.

             
             NOP
             1_переменная_byte = Переменная_byte(переменная_byte).0     ' Время выполнения команды ~19 тактов при частоте МК 1 МГц
             NOP
             2_переменная_byte = Переменная_byte(переменная_byte).1     
             3_переменная_byte = Переменная_byte(переменная_byte).2   
             4_переменная_byte = Переменная_byte(переменная_byte).3   
             5_переменная_byte = Переменная_byte(переменная_byte).4     
             6_переменная_byte = Переменная_byte(переменная_byte).5     
             7_переменная_byte = Переменная_byte(переменная_byte).6   
             8_переменная_byte = Переменная_byte(переменная_byte).7     
             NOP

Время выполнения всего фрагмента при частоте МК 1 МГц ~156 тактов

Исходник на Bascom

$regfile = "m88def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 1 МГц
  $framesize = 32
  $hwstack = 40
  $swstack = 16

  Dim Счетчик As Byte

  Dim 0_переменная_byte As Byte
  Dim 1_переменная_byte As Byte
  Dim 2_переменная_byte As Byte
  Dim 3_переменная_byte As Byte
  Dim 4_переменная_byte As Byte
  Dim 5_переменная_byte As Byte
  Dim 6_переменная_byte As Byte
  Dim 7_переменная_byte As Byte

  Dim Переменная_byte(8) As Byte

  Do

       Incr Счетчик : If Счетчик > 8 Then Счетчик = 1

       0_переменная_byte = Переменная_byte(счетчик).0
       1_переменная_byte = Переменная_byte(счетчик).1
       2_переменная_byte = Переменная_byte(счетчик).2
       3_переменная_byte = Переменная_byte(счетчик).3
       4_переменная_byte = Переменная_byte(счетчик).4
       5_переменная_byte = Переменная_byte(счетчик).5
       6_переменная_byte = Переменная_byte(счетчик).6
       7_переменная_byte = Переменная_byte(счетчик).7

  Loop
End

Дизассемблирование того, что сгенерировал Bascom

1:       
+00000000:   C019        RJMP      PC+0x001A      Relative jump
+00000001:   9518        RETI                     Interrupt return
1:       
+00000002:   9518        RETI                     Interrupt return
+00000003:   9518        RETI                     Interrupt return
1:       
+00000004:   9518        RETI                     Interrupt return
+00000005:   9518        RETI                     Interrupt return
1:       
+00000006:   9518        RETI                     Interrupt return
+00000007:   9518        RETI                     Interrupt return
1:       
+00000008:   9518        RETI                     Interrupt return
+00000009:   9518        RETI                     Interrupt return
1:       
+0000000A:   9518        RETI                     Interrupt return
+0000000B:   9518        RETI                     Interrupt return
1:       
+0000000C:   9518        RETI                     Interrupt return
+0000000D:   9518        RETI                     Interrupt return
1:       
+0000000E:   9518        RETI                     Interrupt return
+0000000F:   9518        RETI                     Interrupt return
1:       
+00000010:   9518        RETI                     Interrupt return
+00000011:   9518        RETI                     Interrupt return
1:       
+00000012:   9518        RETI                     Interrupt return
+00000013:   9518        RETI                     Interrupt return
1:       
+00000014:   9518        RETI                     Interrupt return
+00000015:   9518        RETI                     Interrupt return
1:       
+00000016:   9518        RETI                     Interrupt return
+00000017:   9518        RETI                     Interrupt return
1:       
+00000018:   9518        RETI                     Interrupt return
+00000019:   9518        RETI                     Interrupt return
1:       
+0000001A:   EF8F        SER       R24            Set Register
+0000001B:   BF8D        OUT       0x3D,R24       Out to I/O location
1:       
+0000001C:   EDC8        LDI       R28,0xD8       Load immediate
+0000001D:   ECE0        LDI       R30,0xC0       Load immediate
1:       
+0000001E:   2E4E        MOV       R4,R30         Copy register
+0000001F:   E084        LDI       R24,0x04       Load immediate
1:       
+00000020:   BF8E        OUT       0x3E,R24       Out to I/O location
+00000021:   E0D4        LDI       R29,0x04       Load immediate
1:       
+00000022:   E0F4        LDI       R31,0x04       Load immediate
+00000023:   2E5F        MOV       R5,R31         Copy register
1:       
+00000024:   95A8        WDR                      Watchdog reset
+00000025:   B784        IN        R24,0x34       In from I/O location
1:       
+00000026:   2E08        MOV       R0,R24         Copy register
+00000027:   7F87        ANDI      R24,0xF7       Logical AND with immediate
1:       
+00000028:   BF84        OUT       0x34,R24       Out to I/O location
+00000029:   E188        LDI       R24,0x18       Load immediate
1:       
+0000002A:   2799        CLR       R25            Clear Register
+0000002B:   93800060    STS       0x0060,R24     Store direct to data space
+0000002D:   93900060    STS       0x0060,R25     Store direct to data space
+0000002F:   EFEE        LDI       R30,0xFE       Load immediate
1:       
+00000030:   E0F3        LDI       R31,0x03       Load immediate
+00000031:   E0A0        LDI       R26,0x00       Load immediate
1:       
+00000032:   E0B1        LDI       R27,0x01       Load immediate
+00000033:   2788        CLR       R24            Clear Register
1:       
+00000034:   938D        ST        X+,R24         Store indirect and postincrement
+00000035:   9731        SBIW      R30,0x01       Subtract immediate from word
1:       
+00000036:   F7E9        BRNE      PC-0x02        Branch if not equal
+00000037:   2466        CLR       R6             Clear Register
26:              Incr Счетчик : If Счетчик > 8 Then Счетчик = 1
+00000038:   E0A0        LDI       R26,0x00       Load immediate
+00000039:   E0B1        LDI       R27,0x01       Load immediate
26:              Incr Счетчик : If Счетчик > 8 Then Счетчик = 1
+0000003A:   918C        LD        R24,X          Load indirect
+0000003B:   5F8F        SUBI      R24,0xFF       Subtract immediate
26:              Incr Счетчик : If Счетчик > 8 Then Счетчик = 1
+0000003C:   938C        ST        X,R24          Store indirect
+0000003D:   91000100    LDS       R16,0x0100     Load direct from data space
+0000003F:   3008        CPI       R16,0x08       Compare with immediate
26:              Incr Счетчик : If Счетчик > 8 Then Счетчик = 1
+00000040:   F010        BRCS      PC+0x03        Branch if carry set
+00000041:   F009        BREQ      PC+0x02        Branch if equal
26:              Incr Счетчик : If Счетчик > 8 Then Счетчик = 1
+00000042:   C001        RJMP      PC+0x0002      Relative jump
+00000043:   C003        RJMP      PC+0x0004      Relative jump
26:              Incr Счетчик : If Счетчик > 8 Then Счетчик = 1
+00000044:   E081        LDI       R24,0x01       Load immediate
+00000045:   93800100    STS       0x0100,R24     Store direct to data space
28:              0_переменная_byte = Переменная_byte(счетчик).0
+00000047:   E0A0        LDI       R26,0x00       Load immediate
+00000048:   E0B1        LDI       R27,0x01       Load immediate
28:              0_переменная_byte = Переменная_byte(счетчик).0
+00000049:   90AD        LD        R10,X+         Load indirect and postincrement
+0000004A:   24BB        CLR       R11            Clear Register
28:              0_переменная_byte = Переменная_byte(счетчик).0
+0000004B:   E0A8        LDI       R26,0x08       Load immediate
+0000004C:   E0B1        LDI       R27,0x01       Load immediate
28:              0_переменная_byte = Переменная_byte(счетчик).0
+0000004D:   0DAA        ADD       R26,R10        Add without carry
+0000004E:   1DBB        ADC       R27,R11        Add with carry
28:              0_переменная_byte = Переменная_byte(счетчик).0
+0000004F:   918C        LD        R24,X          Load indirect
+00000050:   FB80        BST       R24,0          Bit store from register to T
28:              0_переменная_byte = Переменная_byte(счетчик).0
+00000051:   E0A1        LDI       R26,0x01       Load immediate
+00000052:   E0B1        LDI       R27,0x01       Load immediate
28:              0_переменная_byte = Переменная_byte(счетчик).0
+00000053:   2788        CLR       R24            Clear Register
+00000054:   F980        BLD       R24,0          Bit load from T to register
28:              0_переменная_byte = Переменная_byte(счетчик).0
+00000055:   938C        ST        X,R24          Store indirect
29:              1_переменная_byte = Переменная_byte(счетчик).1
+00000056:   E0A0        LDI       R26,0x00       Load immediate
+00000057:   E0B1        LDI       R27,0x01       Load immediate
29:              1_переменная_byte = Переменная_byte(счетчик).1
+00000058:   90AD        LD        R10,X+         Load indirect and postincrement
+00000059:   24BB        CLR       R11            Clear Register
29:              1_переменная_byte = Переменная_byte(счетчик).1
+0000005A:   E0A8        LDI       R26,0x08       Load immediate
+0000005B:   E0B1        LDI       R27,0x01       Load immediate
29:              1_переменная_byte = Переменная_byte(счетчик).1
+0000005C:   0DAA        ADD       R26,R10        Add without carry
+0000005D:   1DBB        ADC       R27,R11        Add with carry
29:              1_переменная_byte = Переменная_byte(счетчик).1
+0000005E:   918C        LD        R24,X          Load indirect
+0000005F:   FB81        BST       R24,1          Bit store from register to T
29:              1_переменная_byte = Переменная_byte(счетчик).1
+00000060:   E0A2        LDI       R26,0x02       Load immediate
+00000061:   E0B1        LDI       R27,0x01       Load immediate
29:              1_переменная_byte = Переменная_byte(счетчик).1
+00000062:   2788        CLR       R24            Clear Register
+00000063:   F980        BLD       R24,0          Bit load from T to register
29:              1_переменная_byte = Переменная_byte(счетчик).1
+00000064:   938C        ST        X,R24          Store indirect
30:              2_переменная_byte = Переменная_byte(счетчик).2
+00000065:   E0A0        LDI       R26,0x00       Load immediate
+00000066:   E0B1        LDI       R27,0x01       Load immediate
30:              2_переменная_byte = Переменная_byte(счетчик).2
+00000067:   90AD        LD        R10,X+         Load indirect and postincrement
+00000068:   24BB        CLR       R11            Clear Register
30:              2_переменная_byte = Переменная_byte(счетчик).2
+00000069:   E0A8        LDI       R26,0x08       Load immediate
+0000006A:   E0B1        LDI       R27,0x01       Load immediate
30:              2_переменная_byte = Переменная_byte(счетчик).2
+0000006B:   0DAA        ADD       R26,R10        Add without carry
+0000006C:   1DBB        ADC       R27,R11        Add with carry
30:              2_переменная_byte = Переменная_byte(счетчик).2
+0000006D:   918C        LD        R24,X          Load indirect
+0000006E:   FB82        BST       R24,2          Bit store from register to T
30:              2_переменная_byte = Переменная_byte(счетчик).2
+0000006F:   E0A3        LDI       R26,0x03       Load immediate
+00000070:   E0B1        LDI       R27,0x01       Load immediate
30:              2_переменная_byte = Переменная_byte(счетчик).2
+00000071:   2788        CLR       R24            Clear Register
+00000072:   F980        BLD       R24,0          Bit load from T to register
30:              2_переменная_byte = Переменная_byte(счетчик).2
+00000073:   938C        ST        X,R24          Store indirect
31:              3_переменная_byte = Переменная_byte(счетчик).3
+00000074:   E0A0        LDI       R26,0x00       Load immediate
+00000075:   E0B1        LDI       R27,0x01       Load immediate
31:              3_переменная_byte = Переменная_byte(счетчик).3
+00000076:   90AD        LD        R10,X+         Load indirect and postincrement
+00000077:   24BB        CLR       R11            Clear Register
31:              3_переменная_byte = Переменная_byte(счетчик).3
+00000078:   E0A8        LDI       R26,0x08       Load immediate
+00000079:   E0B1        LDI       R27,0x01       Load immediate
31:              3_переменная_byte = Переменная_byte(счетчик).3
+0000007A:   0DAA        ADD       R26,R10        Add without carry
+0000007B:   1DBB        ADC       R27,R11        Add with carry
31:              3_переменная_byte = Переменная_byte(счетчик).3
+0000007C:   918C        LD        R24,X          Load indirect
+0000007D:   FB83        BST       R24,3          Bit store from register to T
31:              3_переменная_byte = Переменная_byte(счетчик).3
+0000007E:   E0A4        LDI       R26,0x04       Load immediate
+0000007F:   E0B1        LDI       R27,0x01       Load immediate
31:              3_переменная_byte = Переменная_byte(счетчик).3
+00000080:   2788        CLR       R24            Clear Register
+00000081:   F980        BLD       R24,0          Bit load from T to register
31:              3_переменная_byte = Переменная_byte(счетчик).3
+00000082:   938C        ST        X,R24          Store indirect
32:              4_переменная_byte = Переменная_byte(счетчик).4
+00000083:   E0A0        LDI       R26,0x00       Load immediate
+00000084:   E0B1        LDI       R27,0x01       Load immediate
32:              4_переменная_byte = Переменная_byte(счетчик).4
+00000085:   90AD        LD        R10,X+         Load indirect and postincrement
+00000086:   24BB        CLR       R11            Clear Register
32:              4_переменная_byte = Переменная_byte(счетчик).4
+00000087:   E0A8        LDI       R26,0x08       Load immediate
+00000088:   E0B1        LDI       R27,0x01       Load immediate
32:              4_переменная_byte = Переменная_byte(счетчик).4
+00000089:   0DAA        ADD       R26,R10        Add without carry
+0000008A:   1DBB        ADC       R27,R11        Add with carry
32:              4_переменная_byte = Переменная_byte(счетчик).4
+0000008B:   918C        LD        R24,X          Load indirect
+0000008C:   FB84        BST       R24,4          Bit store from register to T
32:              4_переменная_byte = Переменная_byte(счетчик).4
+0000008D:   E0A5        LDI       R26,0x05       Load immediate
+0000008E:   E0B1        LDI       R27,0x01       Load immediate
32:              4_переменная_byte = Переменная_byte(счетчик).4
+0000008F:   2788        CLR       R24            Clear Register
+00000090:   F980        BLD       R24,0          Bit load from T to register
32:              4_переменная_byte = Переменная_byte(счетчик).4
+00000091:   938C        ST        X,R24          Store indirect
33:              5_переменная_byte = Переменная_byte(счетчик).5
+00000092:   E0A0        LDI       R26,0x00       Load immediate
+00000093:   E0B1        LDI       R27,0x01       Load immediate
33:              5_переменная_byte = Переменная_byte(счетчик).5
+00000094:   90AD        LD        R10,X+         Load indirect and postincrement
+00000095:   24BB        CLR       R11            Clear Register
33:              5_переменная_byte = Переменная_byte(счетчик).5
+00000096:   E0A8        LDI       R26,0x08       Load immediate
+00000097:   E0B1        LDI       R27,0x01       Load immediate
33:              5_переменная_byte = Переменная_byte(счетчик).5
+00000098:   0DAA        ADD       R26,R10        Add without carry
+00000099:   1DBB        ADC       R27,R11        Add with carry
33:              5_переменная_byte = Переменная_byte(счетчик).5
+0000009A:   918C        LD        R24,X          Load indirect
+0000009B:   FB85        BST       R24,5          Bit store from register to T
33:              5_переменная_byte = Переменная_byte(счетчик).5
+0000009C:   E0A6        LDI       R26,0x06       Load immediate
+0000009D:   E0B1        LDI       R27,0x01       Load immediate
33:              5_переменная_byte = Переменная_byte(счетчик).5
+0000009E:   2788        CLR       R24            Clear Register
+0000009F:   F980        BLD       R24,0          Bit load from T to register
33:              5_переменная_byte = Переменная_byte(счетчик).5
+000000A0:   938C        ST        X,R24          Store indirect
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000A1:   E0A0        LDI       R26,0x00       Load immediate
+000000A2:   E0B1        LDI       R27,0x01       Load immediate
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000A3:   90AD        LD        R10,X+         Load indirect and postincrement
+000000A4:   24BB        CLR       R11            Clear Register
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000A5:   E0A8        LDI       R26,0x08       Load immediate
+000000A6:   E0B1        LDI       R27,0x01       Load immediate
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000A7:   0DAA        ADD       R26,R10        Add without carry
+000000A8:   1DBB        ADC       R27,R11        Add with carry
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000A9:   918C        LD        R24,X          Load indirect
+000000AA:   FB86        BST       R24,6          Bit store from register to T
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000AB:   E0A7        LDI       R26,0x07       Load immediate
+000000AC:   E0B1        LDI       R27,0x01       Load immediate
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000AD:   2788        CLR       R24            Clear Register
+000000AE:   F980        BLD       R24,0          Bit load from T to register
34:              6_переменная_byte = Переменная_byte(счетчик).6
+000000AF:   938C        ST        X,R24          Store indirect
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000B0:   E0A0        LDI       R26,0x00       Load immediate
+000000B1:   E0B1        LDI       R27,0x01       Load immediate
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000B2:   90AD        LD        R10,X+         Load indirect and postincrement
+000000B3:   24BB        CLR       R11            Clear Register
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000B4:   E0A8        LDI       R26,0x08       Load immediate
+000000B5:   E0B1        LDI       R27,0x01       Load immediate
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000B6:   0DAA        ADD       R26,R10        Add without carry
+000000B7:   1DBB        ADC       R27,R11        Add with carry
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000B8:   918C        LD        R24,X          Load indirect
+000000B9:   FB87        BST       R24,7          Bit store from register to T
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000BA:   E0A8        LDI       R26,0x08       Load immediate
+000000BB:   E0B1        LDI       R27,0x01       Load immediate
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000BC:   2788        CLR       R24            Clear Register
+000000BD:   F980        BLD       R24,0          Bit load from T to register
35:              7_переменная_byte = Переменная_byte(счетчик).7
+000000BE:   938C        ST        X,R24          Store indirect
38:         Loop
+000000BF:   CF78        RJMP      PC-0x0087      Relative jump
39:        End
+000000C0:   94F8        CLI                      Global Interrupt Disable
+000000C1:   CFFF        RJMP      PC-0x0000      Relative jump
42:       
+000000C2:   9731        SBIW      R30,0x01       Subtract immediate from word
+000000C3:   F7F1        BRNE      PC-0x01        Branch if not equal
42:       
+000000C4:   9508        RET                      Subroutine return
+000000C5:   9468        SET                      Set T in SREG
42:       
+000000C6:   F862        BLD       R6,2           Bit load from T to register
+000000C7:   9508        RET                      Subroutine return
42:       
+000000C8:   94E8        CLT                      Clear T in SREG
+000000C9:   F862        BLD       R6,2           Bit load from T to register
42:       
+000000CA:   9508        RET                      Subroutine return
---- No Source ------------------------------------------------------------------------------------

Настоятельная просьба, писать по существу вопроса!

Отредактировано sasha_1973 (2013-10-21 10:14:34)

0

2

У АВР очень мало побитовых команд, придется всё делать через AND (маска) + OR...
Можно написать код не используя побитовость или это принципиально?

0

3

Принципиально, 1 бит = 1 ножка МК!

Перепробовал кучу вариантов, включая виртуальные пины, порты.

Все отлично, когда весь байт на 1 порту, получается 12 тактов на все.

Отредактировано sasha_1973 (2013-10-21 11:35:41)

0

4

Ничего не понял, судя из Баскомовского кода идет работа с массивом SRAM на бинарном уровне и распихивание его потом по байтам. Грубо говоря, 8 байт = 8 бит. Портов не вижу.

0

5

A Alias Porta.0       ' Порт МК, к которому подключен сегмент "А" LED индикатора
  B Alias Portb.1       ' Порт МК, к которому подключен сегмент "B" LED индикатора
  C Alias Portc.2       ' Порт МК, к которому подключен сегмент "C" LED индикатора
  D Alias Portd.3       ' Порт МК, к которому подключен сегмент "D" LED индикатора
  E Alias Porte.4       ' Порт МК, к которому подключен сегмент "E" LED индикатора
  F Alias Portg.5       ' Порт МК, к которому подключен сегмент "F" LED индикатора
  G Alias Porta.6       ' Порт МК, к которому подключен сегмент "G" LED индикатора
  H Alias Portb.7       ' Порт МК, к которому подключен сегмент "H" LED индикатора

Так понятнее?

Отредактировано sasha_1973 (2013-10-21 12:55:05)

0

6

Ну помогите, кто-нибудь!!!!!!!!!!!?????????????

0

7

В общем если идти по твоему коду (можно на "ты"?) и по грубому, то так попробуй:

Код:
$regfile = "m88def.dat"       ' Èñïîëüçóåìûé êîíòðîëëåð
$crystal = 1000000       ' 1 ÌÃö
$framesize = 32
$hwstack = 40
$swstack = 16

Dim Count As Byte

Dim 0_var_byte As Byte
Dim 1_var_byte As Byte
Dim 2_var_byte As Byte
Dim 3_var_byte As Byte
Dim 4_var_byte As Byte
Dim 5_var_byte As Byte
Dim 6_var_byte As Byte
Dim 7_var_byte As Byte

Dim Var_byte(8) As Byte
Dim Tmp_byte As Byte

Do

   Incr Count : If Count > 8 Then Count = 1

   '       0_var_byte = Var_byte(count).0
   Tmp_byte = Var_byte(count)

   $asm
   Push R27
   Push R26
   IN R26 , Sreg
   Push R26

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 0
      LDI R27, &B00000001
      sts {0_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 1
      LDI R27, &B00000010
      sts {1_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 2
      LDI R27, &B00000100
      sts {2_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 3
      LDI R27, &B00001000
      sts {3_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 4
      LDI R27, &B00010000
      sts {4_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 5
      LDI R27, &B00100000
      sts {5_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 6
      LDI R27, &B01000000
      sts {6_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 7
      LDI R27, &B10000000
      sts {7_var_byte}, R27

   Pop R26
   Out Sreg , R26
   Pop R26
   Pop R27
   $end Asm

Loop
End

Если всё "ок" будет, то возможно ещё в асм запихать попробую "Tmp_byte = Var_byte(count)".

+1

8

Минутку, пробую!

А этот код, быстрее чем 8 тактов, можно?

           lds R31 , {Счетчик}       ' Прямая загрузка  из переменной в регистр                                                    время выполнения 2 такта
           cpi R31 , Количество_переменных       ' Сравнить регистр и константу "Количество_переменных"                                         1 такт
           BRCS Счетчик_плюс       ' Перейти если меньше чем "Количество_переменных + 1 "                         если переход на метку тогда 2 такта иначе 1 такт
           clr R31       ' Очистить регистр                                                                                                                                      1 такт
         Счетчик_плюс:
           inc R31       ' Инкременировать содержимое регистра                                                                                                      1 такт
           sts {Счетчик} , R31       ' Прямая загрузка  из регистра в переменную

Отредактировано sasha_1973 (2013-10-21 13:28:16)

0

9

Заработало так, как надо, код ниже, теперь будем ускоряться

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

clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 0
      LDI R27, 1
      sts {A_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 1
      LDI R27, 1
      sts {B_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 2
      LDI R27, 1
      sts {C_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 3
      LDI R27, 1
      sts {D_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 4
      LDI R27, 1
      sts {E_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 5
      LDI R27, 1
      sts {F_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 6
      LDI R27, 1
      sts {G_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 7
      LDI R27, 1
      sts {H_сегмент} , R27

Время обработки фрагмента 56 тактов

Отредактировано sasha_1973 (2013-10-21 15:09:00)

0

10

У тебя есть переменная "Var_byte(count).х" - я оптимизировал и превратил её в "Tmp_byte = Var_byte(count)", далее это значение загружается в регистр и в дальнейшем идет сравнение по битное с этим регистром (так же быстрее, чем нежели каждый раз его извлекать (как делает это баском)).
Я сделал жестко, что у тебя идет кодом вначале темы. Если не подходит, то нужно более реальный код выкладывать. ;)
А что "Var_byte(count).х" на выходе имеет всего два состояния? Тогда код будет выглядеть проще:

Код:
$regfile = "m88def.dat"                                     ' Используемый контроллер
$crystal = 1000000                                          ' 1 МГц
$framesize = 32
$hwstack = 40
$swstack = 16

Dim Count As Byte

Dim 0_var_byte As Byte
Dim 1_var_byte As Byte
Dim 2_var_byte As Byte
Dim 3_var_byte As Byte
Dim 4_var_byte As Byte
Dim 5_var_byte As Byte
Dim 6_var_byte As Byte
Dim 7_var_byte As Byte

Dim Var_byte(8) As Byte
Dim Tmp_byte As Byte

Do

   Incr Count : If Count > 8 Then Count = 1

   '       0_var_byte = Var_byte(count).0
   Tmp_byte = Var_byte(count)

   $asm
   Push R27
   Push R26
   IN R26 , Sreg
   Push R26

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 0
      LDI R27, &B00000001
      sts {0_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 1
      LDI R27, &B00000001
      sts {1_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 2
      LDI R27, &B00000001
      sts {2_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 3
      LDI R27, &B00000001
      sts {3_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 4
      LDI R27, &B00000001
      sts {4_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 5
      LDI R27, &B00000001
      sts {5_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 6
      LDI R27, &B00000001
      sts {6_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 7
      LDI R27, &B00000001
      sts {7_var_byte}, R27

   Pop R26
   Out Sreg , R26
   Pop R26
   Pop R27
   $end Asm

Loop
End

Можно даже ещё чуть оптимизировать, если правильно работает.

+1

11

Как вместо "A_сегмент", и т.д., подставить переназначенное обозначение ножки порта ( A alias portd.0 )

Отредактировано sasha_1973 (2013-10-21 15:03:37)

0

12

И да, зачем закомментил запоминание: Sreg, R26, R27; это может привести к непонятным последствиям (если где в коде это используется).

0

13

Все сохраняется на много раньше, и соответсвенно потом восстанавливается.

Задача этого фрагмента, максимально быстро закинуть переменную по нужным ножкам контроллера!

Вопрос в 11 посту, остаётся в силе!

Отредактировано sasha_1973 (2013-10-21 15:07:11)

0

14

На сколько я помню (экспериментируя), в баскоме и ассемблере вроде не сочетаются алиасы.

Если надо быстрее, то можно так:

Код:
      LDI R28, &B00000001

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 0
      mov R27,R28
      sts {0_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 1
      mov R27,R28
      sts {1_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 2
      mov R27,R28
      sts {2_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 3
      mov R27,R28
      sts {3_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 4
      mov R27,R28
      sts {4_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 5
      mov R27,R28
      sts {5_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 6
      mov R27,R28
      sts {6_var_byte}, R27

      clr R27
      LDs R26,{Tmp_byte}
      SBRC R26, 7
      mov R27,R28
      sts {7_var_byte}, R27

0

15

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

Вопрос в 11 посту, остаётся в силе!

Давай проще, кусок кода, так ничего не понятно или словами. Что и куда (с объявлениями переменных).

зы: меня ломает ковыряться во всей программе, лучше кусками.

Отредактировано RDW (2013-10-21 15:24:47)

0

16

A Alias Portd.0       ' Порт МК, к которому подключен сегмент "А" LED индикатора
  B Alias Portd.1       ' Порт МК, к которому подключен сегмент "B" LED индикатора
  C Alias Portd.2       ' Порт МК, к которому подключен сегмент "C" LED индикатора

  Dim A_сегмент As Byte
  Dim B_сегмент As Byte
  Dim C_сегмент As Byte

Вопрос:

Как вместо "A_сегмент", "B_сегмент" и т.д., подставить переназначенные названия ножек контроллера т.е., сделать:

     A = A_сегмент       ' Сегмент "А"
     B = B_сегмент       ' Сегмент "B"
     C = C_сегмент       ' Сегмент "C"

Фрагмент кода

clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 0
      LDI R27, 1
      sts {A_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 1
      LDI R27, 1
      sts {B_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 2
      LDI R27, 1
      sts {C_сегмент} , R27

0

17

mov R27 , R28      и     LDI R27, 1  -  по времени идентично = 1 такт

0

18

Можно писать в порт как целиком, так и побитово, но компилятор баскома алиасы не понимает и непонятно зачем так извращаться (по битого), если проще сразу писать в порт напрямую из "Var_byte(count)" в порт.
Если ты хочешь не привязываться к ножкам МК и вешать семисегментник на любые ножки, тогда да, можно сделать преобразовалку из байта в биты порта (но никаких алиасов, если что, то ручками переконфигурировать).

0

19

А если биты раскиданы по всему МК, тогда, как?

Весь фрагмент, все работает, как надо, теперь надо ускоряться

Индикация_7seg_led:

nop       ' время выполнения 8 тактов

           lds R31 , {Счетчик_разрядов}       ' Прямая загрузка  из переменной в регистр                                                    время выполнения 2 такта
           cpi R31 , Количество_разрядов       ' Сравнить регистр и константу "Количество_переменных"                                         1 такт
           BRCS Счетчик_плюс       ' Перейти если меньше чем "Количество_переменных + 1 "                         если переход на метку тогда 2 такта иначе 1 такт
           clr R31       ' Очистить регистр                                                                                                                                      1 такт
         Счетчик_плюс:
           inc R31       ' Инкременировать содержимое регистра                                                                                                      1 такт
           sts {Счетчик_разрядов} , R31       ' Прямая загрузка  из регистра в переменную                                                                              2 такта

nop     ' время выполнения 14 тактов

       Буфер_разряд_byte = Буфер_знакоместа_byte(счетчик_разрядов)

nop       ' время выполнения 8 тактов

      Reset Разряд_1 : Reset Разряд_2 : Reset Разряд_3 : Reset Разряд_4       ' Гасим разряды индикаторы ОА

nop       ' время выполнения 56 тактов

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 0
      LDI R27, 1
      sts {A_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 1
      LDI R27, 1
      sts {B_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 2
      LDI R27, 1
      sts {C_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 3
      LDI R27, 1
      sts {D_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 4
      LDI R27, 1
      sts {E_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 5
      LDI R27, 1
      sts {F_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 6
      LDI R27, 1
      sts {G_сегмент} , R27

      clr R27
      LDs R26,{Буфер_разряд_byte}
      SBRC R26, 7
      LDI R27, 1
      sts {H_сегмент} , R27

nop       ' время выполнения 96 тактов

             A = A_сегмент       ' Сегмент "А"
             B = B_сегмент       ' Сегмент "B"
             C = C_сегмент       ' Сегмент "C"
             D = D_сегмент       ' Сегмент "D"
             E = E_сегмент       ' Сегмент "E"
             F = F_сегмент       ' Сегмент "F"
             G = G_сегмент       ' Сегмент "G"
             H = H_сегмент       ' Сегмент "Точка"

nop

'         Portd = Буфер_знакоместа_byte(счетчик_разрядов)

'-------------  включаем соответствующий разряд индикатора  -----------------

'    Select Case Счетчик_разрядов
'        Case 1 : Set Разряд_1
'        Case 2 : Set Разряд_2
'        Case 3 : Set Разряд_3
'        Case 4 : Set Разряд_4
'    End Select

        Cpi R31 , 1       ' (CPI) Сравнить с константой
        BREQ Led_1_знакоместо       ' (BREQ) Если равно перейти на метку

        Cpi R31 , 2       ' (CPI) Сравнить с константой
        BREQ Led_2_знакоместо       ' (BREQ) Если равно перейти на метку

        Cpi R31 , 3       ' (CPI) Сравнить с константой
        BREQ Led_3_знакоместо       ' (BREQ) Если равно перейти на метку

        Cpi R31 , 4       ' (CPI) Сравнить с константой
        BREQ Led_4_знакоместо       ' (BREQ) Если равно перейти на метку

      Led_1_знакоместо:
        Set Разряд_1
        ret

      Led_2_знакоместо:
        Set Разряд_2
        ret

      Led_3_знакоместо:
        Set Разряд_3
        ret

      Led_4_знакоместо:
        Set Разряд_4
        ret

'-------------------------------------------------------------------------------------------
  Return
'=================================================

Отредактировано sasha_1973 (2013-10-21 15:55:51)

0

20

Т.е., с переназначением никак?

Только прописывать  SBI port , pin   |  CBI port , pin

0

21

Глянь, что будет, если сделать так:

Код:
Port1 Alias Portd
Seg_a Alias 3
...
...
SBI port1 , Seg_a

Если сгенерит нормально, то можно попробовать так сделать.

+1

22

Виртуальные порты и пины пробовал, работало

У меня загвоздка была в "SBRC R26, 1 ", я не знал как посмотреть бит в регистре, а с твоей помощью все стало на свои места!

Seg_a Alias 3 а так не лучше,  const сегмент_А = 3

Отредактировано sasha_1973 (2013-10-21 16:34:03)

0

23

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

mov R27 , R28      и     LDI R27, 1  -  по времени идентично = 1 такт

Да, но вроде меньше байт кушает.

Отредактировано RDW (2013-10-21 16:34:09)

0

24

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

Да, но меньше байт кушает

Да байты не проблема, главное скорость, чем быстрее, тем лучше!

0

25

Так чего делаем, из байта раскидывалку битов по портам (как оказалось)?
Или уже сам осилишь?

0

26

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

Так чего делаем, из байта раскидывалку битов по портам (как оказалось)?
Или уже сам осилишь?

Ну да, я думал все поняли, что это 7-seg индикация!

Да осилю конечно, но ты не тикай.!!!!!!!!

0

27

Я смотрю у тебя уже один ассемблер идет, либу пишешь?

0

28

Да типа того,  и чего никто раньше не написал, а если написал, то чего не выкладывают.

0

29

Дай пожалуйста mail которым часто пользуешься, если не жалко в ЛС?

0

30

См. ЛС.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Вопрос по ассемблеру для AVR