Цитата:
|
если использовать UART0, то вместо команд STS, LDS используються соответственно OUT и IN. может кто-то объяснить почему?
|
__________________________________________________ _________
Смотрим в AVR Studio-Help-AVR Tools User Guide-AVR Assembler-
Instruction
команды in, out, LD/LDS/LDD and ST/STS/STD.
Видим:
IN Rd,A 0 ‹= d ‹= 31, 0 ‹= A ‹= 63 PC ‹- PC + 1
Words: 1 (2 bytes) Cycles: 1
(i)LDS Rd,k 0 ‹= d ‹= 31, 0 ‹= k ‹= 65535 PC ‹- PC + 2
Words: 2 (4 bytes) Cycles: 2
То есть, команды in, out выгоднее использовать чем lds, sts.
Занимают меньше места в памяти, выполняются быстрее.
Но, могут работать только с регистрами расположенными по адресам
в пространстве адресов ввода-вывода 0...63 (0...$3F),
или, что то же самое $20...$5F в общем пространстве памяти.
__________________________________________________ _______
Для того, чтобы выяснить с какими регистрами работает
команды IN/OUT, а с какими LD/LDS/LDD and ST/STS/STD
открываем полный даташит (например для ATmega128 - doc2467),
Register Summery и смотрим на адреса регистров.
Или смотрим в файле m128def.inc
(...:Program FilesAtmelAVR ToolsAvrAssemblerAppnotesm128def.inc)
раздел
; I/O Register Definitions
;**** Memory Mapped I/O Register Definitions ($FF-$60) ****
Работают только с LD/LDS/LDD and ST/STS/STD
(Кроме USART1 тут, например, регистры DDRF, PORTF.)
;**** I/O Register Definitions ($3F-$00) ****
Работают только с IN/OUT.
(С LDS/STS эти регистры можно, конечно, тоже использовать (но не нужно),
только нельзя написать lds tmp, UDR0, получится не то, что ожидается).