Вс янв 20, 2019 11:31:29
Вс янв 20, 2019 13:02:45
Вс янв 20, 2019 13:54:24
Вс янв 20, 2019 14:09:06
Вс янв 20, 2019 20:11:06
Пн янв 21, 2019 00:54:41
LSR XH
ROR XL
LSR XH
ROR XL
CLR R0
ADC XL,R0
ADC XH,R0
Пн янв 21, 2019 05:47:41
Вт янв 22, 2019 00:35:52
Пт янв 25, 2019 16:55:38
Сб янв 26, 2019 18:20:06
Вс янв 27, 2019 02:06:11
Вс янв 27, 2019 04:54:29
ldi R16, 0b00100001
out ADMUX, R16
LDI R16,0b11000001
out ADCSRA, R16
m1:
SBIC ADCSRA,6
RJMP M1
IN R0,ADCL
in R17, ADCH
out OCR2, R17
main:
ldi R16, 0b00000000
out ADMUX, R16
ldi R16, 0b11010100
;ldi R16, 0b11000100
out ADCSRA, R16
m2:
SBIC ADCSRA,6
RJMP M2
in XL,ADCL
in XH,ADCH
; in XH, ADCH
; in XL, ADCL
RJMP GO
Вс янв 27, 2019 05:42:00
Вс янв 27, 2019 08:34:38
Вс янв 27, 2019 10:12:55
Вс янв 27, 2019 17:09:17
Пн янв 28, 2019 07:26:04
; ----------
; Авторы: ARV, Z_h_e, Kavka с форума radiokot.ru
; ----------
#include <avr/io.h>
.macro ENTER arg:vararg ; макрос имеет переменное число параметров
.set selector, 0 ; в этой переменной будем отмечать нужные регистры
.set sel_sreg, 0 ; в этой переменной будем отмечать сохранение SREG
; перебераем аргументы и проверяем на допустимость
.irp reg,\arg
.set ch, 1
.irp p, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
.if (\p == \reg) ; если аргументом макроса совпадает с элементов из списка
.set ch, 0
.endif
.endr
.irp p, R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R31
.if (\p == \reg)
.set ch, 0
.endif
.endr
.irp p, xl,xh,yl,yh,zl,zh,sreg,XL,XH,YL,YH,ZL,ZH,SREG
.if (\p == \reg)
.set ch, 0
.endif
.endr
.if ( ch )
; ругаемся если аргумент не опознан... :-)
.print "Error: macro ENTER - unkown register"
.err
.endif
.endr
; перебрать аргументы и отметить их битами в selector
.irp reg,\arg
.set i, 0
; надо перечислить все регистры по порядку!!!
.irp p, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
.if (\p == \reg) ; если аргументом макроса совпадает с элементов из списка
.set selector ,(selector | (1 << i)) ; сделаем отметку в нужном бите
.endif
.set i, i+1 ; и продолжим счет
.endr
.endr
.irp reg,\arg
.set i, 0
.irp p, R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R31
.if (\p == \reg)
.set selector ,(selector | (1 << i))
.endif
.set i, i+1
.endr
.endr
; альтернативные названия регистров
.irp reg,\arg
.set i, 26
; надо перечислить все регистры в соответствии с номерами
.irp p, XL,XH,YL,YH,ZL,ZH
.if (\p == \reg)
.set selector ,(selector | (1 << i))
.endif
.set i, i+1
.endr
.endr
.irp reg,\arg
.set i, 26
.irp p, xl,xh,yl,yh,zl,zh
.if (\p == \reg)
.set selector ,(selector | (1 << i))
.endif
.set i, i+1
.endr
.endr
; проверяем список аргументов на SREG
.irp reg,\arg
.irp p, SREG, sreg
.if (\p == \reg)
.set selector ,(selector | 1) ; сделаем отметку для r0
.set sel_sreg ,1 ; сделаем отметку для SREG
.endif
.endr
.endr
; сохраняем регистры
; сначала r0
.if (selector & (1))
push r0
.endif
; потом SREG
.if (sel_sreg)
in r0, _SFR_IO_ADDR(SREG) ; _SFR_IO_ADDR(SREG) - извлекаем адрес порта
push r0
.endif
; наконец все остальные, перебрать биты selector от МЛАДШЕГО к старшему и сохранить нужные регистры
.set i, 1
.irp p, r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
.if (selector & (1<< i))
push \p
.endif
.set i, i+1
.endr
.endm
;----------
.macro LEAVE
.set i, 31
; регистры до r1
.irp p, r31,r30,r29,r28,r27,r26,r25,r24,r23,r22,r21,r20,r19,r18,r17,r16,r15,r14,r13,r12,r11,r10,r9,r8,r7,r6,r5,r4,r3,r2,r1
.if selector &(1<< i)
; если бит в маске установлен - регистр извлекается из стека
pop \p
.endif
; перебор битов ведется в обратном порядке!!!
.set i, i - 1
.endr
.if (sel_sreg)
pop r0
out _SFR_IO_ADDR(SREG), r0
.endif
.if (selector & (1))
pop r0
.endif
.endm
; Например, вот такой исходник
;.global main
;main:
;ENTER r2,r3,SREG,ZH,ZL
;nop
;LEAVE
; Тут нужен препроцесор, т.к. avr-as его не умеет,
; а определения регистров ввода-вывода прописаны
; в Си-шных заголовочных файлах (привет SREG :-) ).
; С помощью вот таких командочек
; avr-gcc -E -mmcu=atmega48 gnu-as_macros.S | avr-as -mmcu=atmega48 -
; avr-objdump -d a.out
; Получим вот такой код
;00000000 <main>:
; 0: 0f 92 push r0
; 2: 0f b6 in r0, 0x3f ; 63
; 4: 0f 92 push r0
; 6: 2f 92 push r2
; 8: 3f 92 push r3
; a: ef 93 push r30
; c: ff 93 push r31
; e: 00 00 nop
; 10: ff 91 pop r31
; 12: ef 91 pop r30
; 14: 3f 90 pop r3
; 16: 2f 90 pop r2
; 18: 0f 90 pop r0
; 1a: 0f be out 0x3f, r0 ; 63
; 1c: 0f 90 pop r0
Вт янв 29, 2019 14:40:41
Вт янв 29, 2019 15:02:17
Вт янв 29, 2019 15:29:57