Пн сен 24, 2012 11:21:17
Пн сен 24, 2012 19:15:51
mov a,r0
push a
;бла-бла-бла
pop a
mov r0,a
BR0 equ 000h
BR1 equ 001h
BR2 equ 002h
BR3 equ 003h
BR4 equ 004h
BR5 equ 005h
BR6 equ 006h
BR7 equ 007h
push BR0
;бла-бла-бла
pop BR0
Пн сен 24, 2012 21:19:06
Так может , можно что-то и открепитьGudd-Head писал(а):Хм... Тут и так дофига прилепленых тем.
Пн сен 24, 2012 21:37:40
А Вы гляньте внимательнее на свой инструмент. Я довольно много пользовался ассемблерами для mcs51 от AVOCET (это где-то в середине 90-ых) и Keil. У обоих уже были предопределены AR0..AR7 (Absolute Register), причём они зависели от директивы USING, которая указывала, какой сейчас банк регистров используется. Асмом 2500A.D. я пользовался некоторое время до AVOCET ASM51/C51 и сейчас не уверен, но, кажется, у него тоже такая возможность была.kolobok0 писал(а):51 asm
...
- Код:
push BR0
;бла-бла-бла
pop BR0
USING 1
TF1_isr:
_push <PSW,ACC,AR0> ; Тут AR0 равно 8, так как объявлен банк 1.
...
_pop <AR0,ACC,PSW>
reti
Пт сен 28, 2012 07:26:01
Здравствуйте. В качестве пятничной развлекухи прогнал в студии Ваш код. Преобразование занимает 2254 такта. Затем сделал тоже самое по алгоритму, предложенному здесь уважаемым umup. Преобразование занимает 798 тактов.Леонид Иванович писал(а):...Для преобразования в BCD на asm применял такой код...
; Преобразователь BIN24-BCD8
.INCLUDE "2313def.inc"
.CSEG
START:
LDS R16,$70
LDS R17,$71
LDS R18,$72
CLR R28 ; BCD OUT 10'000'000,1'000'000
CLR R29 ; BCD OUT 100'000,10'000
CLR R30 ; BCD OUT 1'000,100
CLR R31 ; BCD OUT 10,1
LDI R24,24
bin24bcd8:
subi r31,-0x33 ;add 0x33
sbrs r31, 3 ;if carry to bit 3
subi r31, 3 ;subtract 3
sbrs r31, 7 ;if carry to bit 7
subi r31, 0x30 ;subtract 0x30
subi r30,-0x33 ; \n" /*add 0x33*/
sbrs r30, 3 ; \n" /*if carry to bit 3,*/
subi r30, 3 ; \n" /*subtract 3*/
sbrs r30, 7 ; \n" /*if carry to bit 7,*/
subi r30, 0x30 ; \n" /*subtract 0x30*/
subi r29,-0x33 ;\n" /*add 0x33*/
sbrs r29, 3 ;\n" /*if carry to bit 3,*/
subi r29, 3 ;\n" /*subtract 3*/
sbrs r29, 7 ;\n" /*if carry to bit 7,*/
subi r29, 0x30 ;\n" /*subtract 0x30*/
subi r28,-0x33 ;\n" /*add 0x33*/
sbrs r28, 3 ;\n" /*if carry to bit 3,*/
subi r28, 3 ;\n" /*subtract 3*/
sbrs r28, 7 ;\n" /*if carry to bit 7,*/
subi r28, 0x30 ;\n" /*subtract 0x30*/
; по совету avreal!!!!!
lsl R18
rol R17 ;shift input*/
rol R16
rol r31
rol r30
rol r29
rol r28
dec R24 ;\n"
brne bin24bcd8 ;repeat for all bits*/
; опционально. Распаковка упакованного BCD по регистрам
MOV R20,R28
SWAP R20
ANDI R20,$0F
ANDI R28,$0F
MOV R21,R28
MOV R22,R29
SWAP R22
ANDI R22,$0F
ANDI R29,$0F
MOV R23,R29
MOV R24,R30
SWAP R24
ANDI R24,$0F
ANDI R30,$0F
MOV R25,R30
MOV R26,R31
SWAP R26
ANDI R26,$0F
ANDI R31,$0F
MOV R27,R31
RJMP START
; Преобразователь BIN40-BCD13
;
; 02.01.2008
; 02.01.2008
.INCLUDE "8515def.inc"
.CSEG
;************************************************
START:
LDS R16,$70
LDS R17,$71
LDS R18,$72
LDS R19,$73 ; HEX IN
LDS R20,$74
CLR R25 ; BCD OUT 10'000'000'000'000,1'000'000'000'000
CLR R26 ; BCD OUT 100'000'000'000,10'000'000'000
CLR R27 ; BCD OUT 1'000'000'000,100'000'000
CLR R28 ; BCD OUT 10'000'000,1'000'000
CLR R29 ; BCD OUT 100'000,10'000
CLR R30 ; BCD OUT 1'000,100
CLR R31 ; BCD OUT 10,1
LDI R24,40
bin40bcd13:
subi r31,-0x33 ;add 0x33
sbrs r31, 3 ;if carry to bit 3
subi r31, 3 ;subtract 3
sbrs r31, 7 ;if carry to bit 7
subi r31, 0x30 ;subtract 0x30
subi r30,-0x33 ; \n" /*add 0x33*/
sbrs r30, 3 ; \n" /*if carry to bit 3,*/
subi r30, 3 ; \n" /*subtract 3*/
sbrs r30, 7 ; \n" /*if carry to bit 7,*/
subi r30, 0x30 ; \n" /*subtract 0x30*/
subi r29,-0x33 ;\n" /*add 0x33*/
sbrs r29, 3 ;\n" /*if carry to bit 3,*/
subi r29, 3 ;\n" /*subtract 3*/
sbrs r29, 7 ;\n" /*if carry to bit 7,*/
subi r29, 0x30 ;\n" /*subtract 0x30*/
subi r28,-0x33 ;\n" /*add 0x33*/
sbrs r28, 3 ;\n" /*if carry to bit 3,*/
subi r28, 3 ;\n" /*subtract 3*/
sbrs r28, 7 ;\n" /*if carry to bit 7,*/
subi r28, 0x30 ;\n" /*subtract 0x30*/
subi r27,-0x33 ;\n" /*add 0x33*/
sbrs r27, 3 ;\n" /*if carry to bit 3,*/
subi r27, 3 ;\n" /*subtract 3*/
sbrs r27, 7 ;\n" /*if carry to bit 7,*/
subi r27, 0x30 ;\n" /*subtract 0x30*/
subi r26,-0x33 ;\n" /*add 0x33*/
sbrs r26, 3 ;\n" /*if carry to bit 3,*/
subi r26, 3 ;\n" /*subtract 3*/
sbrs r26, 7 ;\n" /*if carry to bit 7,*/
subi r26, 0x30 ;\n" /*subtract 0x30*/
subi r25,-0x33 ;\n" /*add 0x33*/
sbrs r25, 3 ;\n" /*if carry to bit 3,*/
subi r25, 3 ;\n" /*subtract 3*/
sbrs r25, 7 ;\n" /*if carry to bit 7,*/
subi r25, 0x30 ;\n" /*subtract 0x30*/
; по совету avreal!!!!!
lsl R20
rol R19
rol R18
rol R17 ;shift input*/
rol R16
rol r31
rol r30
rol r29
rol r28 ; \n" /*shift out buffer*/
rol r27
rol r26
rol r25
dec R24 ;\n"
brne bin40bcd13 ;repeat for all bits*/
RJMP START
BOB51 писал(а):почему процесс ждет прерывание , а не прерывание процесс?
Пт сен 28, 2012 10:18:22
lsl R18
rol R17
rol R16 ; r16 bit 7 in C
rol r31 ; shift into LSB of output
rol r30
rol r29
rol r28
lsl r31
rol r30
rol r29
rol r28
sbrc R16, 7 ;skip if msbit of input =0*/
ori R31, 1 ;set lsb of output*/
lsl R18
rol R17 ;shift input*/
rol R16
Пт сен 28, 2012 10:26:14
Сб сен 29, 2012 22:32:28
call #PrintString ; output procedure call
DB "Hello World!" ; trailing zero is added
EVEN
clr.w R5 ; next instruction in code
PrintString:
mov.w @SP, R4 ; pointer to string character
ps1: mov.b @R4+, R5 ; character to output
inc.w 0(SP) ; update the return address
tst.b R5 ; end of string?
jz ps2 ; YES - break the loop
; put here instructions for character processing
jmp ps1 ; loop back
ps2: bit.w #1, 0(SP) ; move to the next even address
jz ps3 ; if needed
inc.w 0(SP) ; even alignment of the return address
ps3: ret
; первый вариант вызова с передачей параметра через стек
push.w #hi ; passing parameter string
call #PrintString2 ; using another entry point
; второй вариант вызова с размещением строки сразу под вызовом функции
call #PrintString3 ; output procedure call
DB "Hello World!" ; trailing zero is added
EVEN
clr.w R5 ; next instruction in code
PrintString2:
pop.w R6 ; load return address in R6
mov.w @SP, R4 ; load string address in R4
mov.w R6, 0(SP) ; put return address in stack
clr.w R6 ; do not update the return address
jmp ps4
PrintString3:
mov.w #1, R6 ; add 1 to the return address
mov.w @SP, R4 ; pointer to string character
ps4: mov.b @R4+, R5 ; character to output
add.w R6, 0(SP) ; update the return address
tst.b R5 ; end of string?
jz ps5 ; YES - break the loop
; put here instructions for character processing
jmp ps4 ; loop back
ps5: bit.w #1, 0(SP) ; move to the next even address
jz ps6 ; if needed
add.w R6, 0(SP) ; even alignment of the return address
ps6: ret
Сб сен 29, 2012 22:54:06
Ser60 писал(а):При выводе текстовых строк на дисплей очень часто многие строки используются лишь один раз в программе (например при выводе строк меню). Было-бы очень удобно написать как в языках высокого уровня что-то типа PrintString(“Hello World!”), где выводимая строка и место в программе где она выводятся (вызов функции вывода) расположены рядом в программе. Этого можно добиться на ассемблере, поместив выводимую строку сразу после вызова функции PrintString. Идея эта не новая, но я не видел ее имплементации в микроконтроллерах, поэтому привожу свою имплементацию на примере архитектуры MSP430.
Итак, мы будем выводить строку следующим образом:
- Код:
call #PrintString ; output procedure call
DB "Hello World!" ; trailing zero is added
EVEN
clr.w R5 ; next instruction in code
Вс сен 30, 2012 09:03:54
mov.w #6554,&MPY ; load the "magic" constant
mov.w R4, &OP2 ; compute R4 *= 6554
nop
mov.w &RES1, R4 ; R4 = R4 / 10
mov.b #4, R7 ; digit counter
clr.b R8 ; pointer correction for
cmp.w #8192, R4 ; the 2nd part of table
jl d2b ; it is needed for numbers
mov.b #16, R8 ; exceeding 8192
mov.w #6554,&MPY ; load the "magic" constant
d2b: mov.w R4, &OP2 ; compute R4 *= 6554
nop
mov.w &RES1, R4 ; R4 = R4 / 10
mov.w &RES0, R5 ; computing R4 % 10
swpb R5
rram.w #4, R5
and.b #0x0F, R5
add.b R8, R5
mov.b table(R5), R5 ; R5 = remainder
clr.b R8
dec.b R7
jnz d2b
table:
DB 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9
DB 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9
clr.w R4 ; storage for 4-digit BCD
mov.b #16, R5 ; loop cnt = # of bits
dp0: rla.w R10 ; use decimal addition
dadd.w R4, R4 ; operation to convert R4
dec.b R5 ; into BCD
jnz dp0
Пн окт 01, 2012 10:45:08
;результат умножения в R16...R19 в формате старший-младший
CLR ZH
LSL R18 ; старший бит, имеющий вес 0.5 в С-флаг
ADC R17,ZH
ADC R16,ZH
Пн окт 01, 2012 15:10:56
SBRC R23, 7
ADIW R24, 1
Чт окт 11, 2012 09:29:44
rjmp PC+1;
nop;
nop;
Чт окт 11, 2012 09:37:16
Именно этот вариант показан в регулируемой задержке в этой же теме. Там же для однословной 3-тактовой задержки в случае наличия регистра, который можно испортить, использован LPM. Ещё когда-то обсуждалось, что в прерывани Z при этом можно не сохранятьGudd-Head писал(а):AVR. Задержка на 2 такта одним машинным словом:
adiw R24, 0 ; или другая пара
Пт окт 12, 2012 04:15:31
mov.w R4, &BIN2BCD
mov.w &BIN2BCD, R5
rrcm.a #3, R4
mov.w R4, &BIN2BCD
mov.w &BIN2BCD, R5
daddx.a R5, R5
rlax.a R4
daddx.a R5, R5
rlax.a R4
daddx.a R5, R5
Пт окт 12, 2012 20:55:56
В ней имеется таймер реального времени RTC_B, в состав которого входит регистр BIN2BCD.
Странно, что в документации slau272a и slau208k на семействa F5xx/F6xx и FR57xx, соответственно, об этом регистре нет ни слова в тексте.
Пн окт 15, 2012 05:45:34
#include "ior5f1006a.h"
#include "ior5f1006a_ext.h"
#define SCL 0
#define SDA 1
RSEG CSTACK ; stack segment definition
RSEG SADDR_N ; data segment
dev: DS 4 ; devidend
der: DS 4 ; divisor
res: DS 4 ; result
tmp: DS 2
ASEGN RCODE:CODE, 0 ; vector table
ORG RST_vect
DW RESET ; Reset vector
ORG 0xC0 ; option byte
DB 0x6E ; disable watchdog
DB 0x1F ; LVD off
DB 0xAA ; 8 MHz LS mode
DB 0x85 ; enable on-chip debugging
RSEG CODE ; code segment
RESET: movw SP, #SFE(CSTACK)
mov CMC, #0x04 ; input mode on X1 pins
mov HOCODIV, #0x02 ; set 8 MHz system clock
set1 PER0.7 ; enable RTC operation
mov OSMC, #0x90 ; select LFO as s/system clock
; setup data
movw AX, #0x70A4 ; setup dividend 0x414570A4 = 12.34
movw dev, AX
movw AX, #0x4145
movw dev+2, AX
movw AX, #0x3333 ; setup divisor 0x40233333 = 2.55
movw der, AX
movw AX, #0x4023
movw der+2, AX
mov MDUC, #0xC0 ; division setup, no interrupt
mov A, der+2
set1 A.7 ; add hidden 1
mov B, A
xch A, X
clrb A
movw MDBH, AX ; load divisor MSW
movw AX, der
movw MDBL, AX ; load divisor LSW
mov H, #127 ; bias
mov A, dev+2
set1 A.7 ; add hidden 1
mov X, dev+1
cmp A, B
bh sh7 ; dividend > divisor
bnz sh8 ; dividend < divisor
movw BC, AX ; preserve AX
movw AX, dev ; MSB(dividend) = MSB(divider)
cmpw AX, der
movw AX, BC ; restore AX
bh sh8 ; dividend > divisor
bnz sh7 ; dividend < divisor
sh8: movw MDAH, AX ; shift dividend 8 bits left
mov A, dev ; compose LSW(dividend)
clrb X
dec H ; adjust the bias
br ft0
sh7: shrw AX, 1 ; shift dividend 7 bits left
movw MDAH, AX ; load dividend MSW
mov A, dev
clrb X
rorc A, 1
xch A, X
mov1 A.7, CY
xch A, X
ft0: movw MDAL, AX ; load dividend MSW
;----------
set1 MDUC.0 ; first division
movw BC, der+2 ; compute the order
shlw BC, 1 ; B = divisor order (biased)
movw AX, dev+2
shlw AX, 1 ; A = dividend order (biased)
sub A, B ; subtract the orders
add A, H ; add the bias
clrb X
shrw AX, 1
movw res+2, AX ; order
ft1: mov A, MDUC
bt A.0, ft1 ; wait for completion
movw AX, MDAL ; get 8 bits of result
movw BC, AX ; save it temporarily
movw AX, MDCL ; dividend = remainder shifted
movw tmp, AX
movw AX, MDCH
xch A, X
mov X, tmp+1
movw MDAH, AX ; new devidend MSW
mov A, tmp
clrb X
movw MDAL, AX ; new devidend LSW
;----------
set1 MDUC.0 ; second division
movw AX, BC ; get back the first quotient
xch A, X ; A = result bits
clr1 A.7 ; remove hidden 1
or A, res+2
mov res+2, A ; first byte of result + order
mov A, der+3 ; compose the sign
xor A, dev+3 ; msb(A) = sign bit
and A, #0x80
or A, res+3
mov res+3, A ; sign + order
ft2: mov A, MDUC
bt A.0, ft2 ; wait for completion
movw AX, MDAL ; get 8 bits of result
movw BC, AX
movw AX, MDCL ; dividend = remainder shifted
movw tmp, AX
movw AX, MDCH
xch A, X
mov X, tmp+1
movw MDAH, AX ; new devidend MSW
mov A, tmp
clrb X
movw MDAL, AX ; new devidend LSW
;----------
set1 MDUC.0 ; third division
movw AX, BC ; get back the second quotient
xch A, X
mov res+1, A ; second byte of result
ft3: mov A, MDUC
bt A.0, ft3 ; wait for completion
movw AX, MDAL ; get 8 bits of result
xch A, X
mov res, A ; third byte of result
nop
END
Чт янв 31, 2013 09:37:51
Пн фев 11, 2013 13:42:57
Вт фев 12, 2013 21:31:37
#include <avr/io.h>
#include "avr_io_macros.h"
#define LED1 B, 1
#define LED2 B, 2
void main()
{
char a;
PIN_INIT_AS_INPUT(LED1);
PIN_PULLUP_ON(LED1);
a = PIN_GET(LED1);
PIN_PULLUP_OFF(LED1);
PIN_INIT_AS_OUTPUT(LED1);
PIN_INIT_AS_OUTPUT(LED2);
PIN_CLR(LED1);
PIN_CLR(LED2);
while (1)
{
PIN_NEG(LED1);
PIN_NEG(LED2);
}
}