

;****************************************************************************
;Автор:Гуцал Т.А.                                                           *
;Дата:2 Апреля 2010г.                                                       *
;Версия:1,0                                                                 *
;Имя файла:Tuner.asm                                                        *
;Для AVR:ATMEGA8                                                            *
;Тактовая частота:8Мгц  от внешнего кварца                                  *                        
;****************************************************************************
;Выполняемые функции-инициализация и настройка синтезатора частоты на базе
;LC7218 
;реализация обмена програмная на PC-0 (CE),PC-1 (DI),PC-2 (CL)
;CE-вывод разрешения обмена данными
;DI-вывод передачи данных в LC7218
;CL-вывод синхронизации

.nolist
.include "m8def.inc"
.list

;Обявления:
;****************************************************************************
.def  temp=r16             ;временный регистр
.def  Paus=r17             ;счетчик для подпрограммы задержки 
.def  Counter=r21          ;счетчик выведеных битов
.def  Buffer=r23           ;временный регистр

.equ  CE=0                 ;сигнал CE соответствует 0 биту порта C
.equ  DI=1                 ;сигнал DI соответствует 1 биту порта C
.equ  CL=2                 ;сигнал CL соответствует 2 биту порта C
;****************************************************************************
Reset:
;очищаем регистры
;Убираем мусор с регистров
Registr_Clr:
ST 	Z+,R16		       	; Сохраняем 0 в ячейку памяти
CPI	Zl,30		        ; Достигли последнего регистра
BRNE  Registr_Clr       ; Нет? Крутимся дальше!
CLR	ZL			        ; Очищаем индекс
CLR	ZH

;настройки портов и регистров
ldi   Temp,High(RamEnd)
out   sph,Temp
ldi   Temp,Low(RamEnd)
out   spl,Temp	           ;Инициализируем стек

ldi  Temp,0b00000111
out  DDRC,Temp             ;РC-0,РC-1,РC-2 выхода
clr  Temp
out  PortC,Temp            ;все выхода выключены

;загружаем переменные в озу
ldi temp,22
sts 0x60,Temp
ldi temp,4
sts 0x61,Temp
ldi temp,0b00000000
sts 0x62,Temp
ldi temp,0b00001010
sts 0x63,Temp
clr temp
;задержка
Stari:
rcall Pause
inc  temp
cpi  temp,100
brne Stari
;*****************************************************************************
;             Основное тело
Start:
cbi PortC,CE        ;заприщаем прием данных
;для настройки первых 4-х битов задающих направление и объем данных
ldi Counter,4       ;запишим количество передаваемых бит
ldi Buffer,1        ;настраиваем на прием 36 бит для инициализации
rcall write         ;отправляем младшим битом вперед
Data:
ldi temp,4          ;количество передаваемых байт
clr Yh
ldi Yl,0x60         ;усановим регистр Y на 60 ячейку памяти
sbi PortC,CE        ;разрешаем прием данных
nop 
nop
Fin:
ldi Counter,8       ;запишим количество передаваемых бит
ld  Buffer,Y+       ;достаним перввый байт и увеличим адрес
rcall write         ;отправляем младшим битом вперед
dec temp            ;уменьшаем темп
brne Fin            ;передаем все три байта значющих и один настроечный
ldi Counter,4       ;запишим количество передаваемых бит
clr Buffer          ;последних 4 бита передаем нулями
rcall write         ;отправляем младшим битом вперед
cbi PortC,CE        ;заприщаем прием данных
;задержка между посылками
clr temp
Star:
rcall Pause
inc  temp
cpi  temp,100
brne Star
rjmp Start
;***************************************************************************
;Запись одного байта
write:
ror Buffer          ;вытесним бит в перенос младшим битом вперед
brcc WrZero         ;проверяем что у нас 1 или 0
rcall One           ;если один то к One 
rjmp WrOut          ;и после к WrOut
WrZero:
rcall Zero          ;если ноль то к Zero          
WrOut:
dec Counter         ;уменьшим счетчик
brne write          ;если еще не все вывели то в нгачало
ret



;***************************************************************************
;передаем 0 
Zero:
    cbi	PORTC,DI	            ;ноль на на вывод данных DI
    rcall Pause                     ;задержка  
    sbi	PORTC,CL	            ;единица на вывод синхронизации CL
    rcall Pause                     ;задержка  
    cbi	PORTC,CL	            ;сбросим вывод синхронизации CL
    ret  
;***************************************************************************
;передаем 1 
One:
    sbi	PORTC,DI	            ;единицу на вывод данных DI
    rcall Pause                     ;задержка
    sbi	PORTC,CL	            ;единица на вывод синхронизации CL
    rcall Pause                     ;задержка  
    cbi	PORTC,CL	            ;сбросим вывод синхронизации CL
    cbi	PORTC,DI	            ;сбросим вывод данных DI
	ret

;*****************************************************************************
;подпрограмма задержки
; задержка 60 мкс
Pause:
clr Paus
Beginning:
inc Paus
nop
cpi Paus,95
brne Beginning
ret
