;**** Управление микросхемой MAX5154 через интерфейс SPI *****************
;*
;* К микроконтроллеру AT90S8515 по интерфейсу SPI подключена микросхема
;* MAX5154. На выходе ЦАП А получаем пилообразное напряжение с нарастающим
;* передним фронтом, а на выходе ЦАП В – пилообразное напряжение с
;* ниспадающим задним фронтом.
;* Тактовая частота микроконтроллера AVR: 4 МГц (Стандарт STK200).
;*  
;*************************************************************************

.nolist
.include "8515def.inc"
.list

.equ  DACa  = $20	; Загрузка входного регистра А, регистр ЦАП А неизменен
.equ  DACb  = $C0	; Загрузка входного регистра В, оба регистра ЦАП обновл.
.equ  nss   = PB4	; /SS = PB4

.def  OutL  = r12	; Младший байт для вывода через SPI
.def  OutH  = r13	; Старший байт для вывода через SPI
.def  InL   = r14	; Младший байт для ввода через SPI
.def  InH   = r15	; Старший байт для ввода через SPI
.def  temp  = r16	; Рабочий регистр
.def  A_lo  = r24	; Младший байт ЦАП A
.def  A_hi  = r25	; Старший байт ЦАП A
.def  B_lo  = r26	; Младший байт ЦАП B
.def  B_hi  = r27	; Старший байт ЦАП B

Reset:
rjmp  Initial

Output_SPI:	; 16 бит через SPI, CPHA=0,CPOL=0
cbi   PortB,nss	; /SS = активный (лог. 0)
out   SPDR,OutH	; Выводим старший байт
spi1:
sbis  SPSR,SPIF	; Пропускаем следующую команду, если передача завершена
rjmp  spi1
in    InH,SPDR	; Запоминаем прочитанный байт
out   SPDR,OutL	; Выводим младший байт
spi2:
sbis  SPSR,SPIF	; Пропускаем следующую команду, если передача завершена
rjmp  spi2
in    InL,SPDR	; Запоминаем прочитанный байт
sbi   PortB,nss	; /SS = неактивный (лог. 1)
ret

Initial:	; Часть инициализации
ldi   temp, Low(RAMEND)
out   SPL, Temp
ldi   temp, High(RAMEND)
out   SPH, Temp	; Инициализируем указатель стека
ldi   temp,$70	; SCK=0,MISO=PullUp,MOSI=1,/SS=1,ост.=HiZ
out   PortB,temp	; Выводим состояние простоя
ldi   temp,$B0	; SCK,MOSI,/SS = выход, остальные = входы
out   DDRB,temp	; Конфигурируем направление передачи данных через порт В
ldi   temp,$50	; SPIE=0,SPE=1,DORD=0,MSTR=1,CPHA=0,CPOL=0
out   SPCR,temp	;   f(SCK)=f(Сист.) / 4
ldi   A_lo,$00
ldi   A_hi,$00	; Инициализируем счетчик А нулем
ldi   B_lo,$00
ldi   B_hi,$00	; Инициализируем счетчик В нулем
Loop:
adiw  A_lo,2	; Инкрементируем на 1 регистр двойной длины A (2 – потому что S0=0)
cbr   A_hi,$E0	; Обнуляем разряды 15..13 (переполнение)
sbr   A_hi,DACa	; Устанавливаем разряды управл-я для ЦАП А
mov   OutL,A_lo
mov   OutH,A_hi
rcall Output_SPI	; Выводим в ЦАП А 16 бит через SPI
sbiw  B_lo,2	; Декрементируем на 1 регистр двойной длины В (2 – потому что S0=0)
cbr   B_hi,$E0	; Обнуляем разряды 15..13 (переполнение)
sbr   B_hi,DACb	; Устанавливаем разряды управл-я для ЦАП В
mov   OutL,B_lo
mov   OutH,B_hi
rcall Output_SPI	; Выводим в ЦАП В 16 бит через SPI
rjmp  Loop
