;*********************************************************************************************** ; SAA1057.asm Программа загрузки данных в микросхему синтезатора частоты SAA1057 ; ; И.Н.Шевченко (RW1ZK) 30.04.2007 ;*********************************************************************************************** list p=16F84A ; используется PIC16F84A #include ; файл, описывающий специфические переменные, ; соответствующие процессору __CONFIG 03FF1H ; WDT выкл, бит защиты не установлен ;*********************************************************************************************** CLB EQU 1 ; Вывод RB1 - линия CLB DLEN EQU 2 ; Вывод RB2 - линия DLEN DAT EQU 3 ; Вывод RB3 - линия DAT RegM EQU 0CH ; Старший байт WORD_A,_B RegL EQU 0DH ; Младший байт WORD_A,_B Bait EQU 0EH ; Счётчик количества передаваемых байт Bit EQU 0FH ; Счётчик количества передаваемых бит ;*********************************************************************************************** ORG 0x000 ; вектор сброса процессора, ; начальный адрес goto START ; С программы START ;*********************************************************************************************** ; Подпрограмма вывода данных I2C ;*********************************************************************************************** I2C bsf PORTB, DLEN ; DLEN=>1 call PAUSE_5 ; Пауза 5 мс call CLB_C ; Импульс CLD call PAUSE_5 ; Пауза 5 мс ;*********************************************************************************************** ; Загрузка кол-ва байт, бит, адреса первого выводимого RegM ;*********************************************************************************************** OUTPUT bsf Bait, 1 ; кол-во выводимых байт равно 2 movlw RegM ; Загрузим адрес первого RegM movwf FSR ; в FSR для косвенной NEXT movf INDF, w ; адресации через INDF bsf Bit, 3 ; кол-во выводимых бит равно 8 ;*********************************************************************************************** ; Загрузка в SAA1057 байта данных ;*********************************************************************************************** SDVIG rlf INDF, f ; Сдвиг регистра INDF влево btfsc STATUS, C ; Выводимый бит данных равен 1? goto PIN_HI ; Да, выводим 1 call CLB_C ; Импульс CLD goto BIT_NEXT ; На вывод следующего бита PIN_HI bsf PORTB, DAT ; DAT=>1 call PAUSE_5 ; Пауза 5 мс call CLB_C ; Импульс CLD nop ; Пауза 1 м.ц. bcf PORTB, DAT ; DAT=>0 BIT_NEXT call PAUSE_5 ; Пауза 5 мс decfsz Bit, f ; Вывели все биты? goto SDVIG ; Нет, продолжим... incf FSR, f ; Выводим следующий байт данных decfsz Bait, f ; Вывели все байты данных? goto NEXT ; Нет, продолжим... bcf PORTB, DAT ; Да, DAT=>0 goto $+1 ; Пауза 2 м.ц. bcf PORTB, DLEN ; DLEN=>0 nop ; Пауза goto $+1 ; 3 м.ц. call CLB_C ; Импульс CLВ call PAUSE_5 ; Пауза 5 мс return ; Возврат из п/п I2C ;*********************************************************************************************** ; Формирование импульса CLB ;*********************************************************************************************** CLB_C bsf PORTB, CLB ; CLB=>1 call PAUSE_5 ; Пауза 5 мс bcf PORTB, CLB ; CLB=>0 return ; Возврат из п/п CLB_C ;*********************************************************************************************** PAUSE_5 goto $+1 ; Пауза 2 м.ц. goto $+1 ; Пауза 2 м.ц. return ; Выход из п/п PAUSE_5 ;*********************************************************************************************** ; Начало программы ;*********************************************************************************************** START clrf PORTB ; очистили выходные защёлки порта B bsf STATUS, RP0 ; 1-й банк clrf PORTB ; Все порты В на выход bcf STATUS, RP0 ; 0-й банк clrf Bait ; Очистим счётчик Bait clrf Bit ; и Bit ;*********************************************************************************************** ; Загрузка WORD_B ;*********************************************************************************************** WORD_B movlw b'11000011' ; Режим FM, шаг 10 кгц movwf RegM ; PCA - 0.07, SB2 - 1, movlw b'10000101' ; синхр., дет. фазы - авт. movwf RegL ; BRM - ON ;*********************************************************************************************** call I2C ; Вывод данных в SAA1057 ;*********************************************************************************************** ; Загрузка WORD_A ;*********************************************************************************************** WORD_A movlw b'00100111' ; Коэффициент movwf RegM ; деления movlw b'00010000' ; равен movwf RegL ; 10000 ;*********************************************************************************************** call I2C ; Вывод данных в SAA1057 ;*********************************************************************************************** ; На данный момент в SAA1057 загружены оба слова конфигурации WORD_B, WORD_A ; SAA1057 оказалась на удивление "капризной" и привередливой к временным характеристикам ; Программа проверена в "железе" ; Дальше текст на ваше усмотрение... (вывод данных в LCD, опрос кнопок и т.д.) ;*********************************************************************************************** goto $ ; Баста карапузики! ;*********************************************************************************************** END ; Конец программы