;-------------------------------------------------------------------------- ; Программа управляемого генератора прямоугольного сигнала ;-------------------------------------------------------------------------- LIST P=16C63A, R=DEC include "p16c63a.inc" __CONFIG _WDT_OFF & _XT_OSC & _PWRTE_ON & _BODEN_ON __IDLOCS H'1200' StartByte EQU 0x20 Cnt0 EQU 0x21 Cnt1 EQU 0x22 Cnt2 EQU 0x23 TimeH0Loaded EQU 0x24 TimeH1Loaded EQU 0x25 TimeH2Loaded EQU 0x26 TimeL0Loaded EQU 0x27 TimeL1Loaded EQU 0x28 TimeL2Loaded EQU 0x29 TimeH0 EQU 0x30 TimeH1 EQU 0x31 TimeH2 EQU 0x32 TimeL0 EQU 0x33 TimeL1 EQU 0x34 TimeL2 EQU 0x35 ORG 0 Start ;Установка начальных значений переменных и SFR **************** BCF PORTC,3 ; запрещение выдачи частоты синхронизации для CC 60 CLRF PORTB ; выключение светодиодов и питания карточки BSF STATUS,RP0 ;выбор второго банка памяти MOVLW 0x01 MOVWF TRISA ;порт A настроен на работу как выход кроме RA0 (I/O) MOVWF TRISB ;все выводы порта В настроены на работу как выходы кроме RB0 MOVLW 0xB6 MOVWF TRISC ;RC2 = MCLR BCF OPTION_REG,7 ;разрешены Pull up резисторы на порту B (~200K) BCF STATUS, RP0 ;Из за того что в команде адрес регистра задается только 7 битами, а для адресации всей памяти микросхемы надо как миниум 8, старшие биты адреса хранятся отдельно в регистре STATUS, это биты RP0 и RP1. Бит RP1 используется только в микросхемах с объемом RAM больше 256 байт. Биты RP0 и RP1 определяют используемый банк регистров, а номер регисра внутри текущего банка берется из кода команды. Микросхема имеет 2 банка регисров. Некоторые управляющие регистры находятся во втором банке. MOVLW 0 ;0x90 MOVWF INTCON ;прерывания не используются MOVLW 0x15 ;настройка таймера 1 MOVWF T1CON MOVLW 0x0B ;настройка модуля для сброса таймера 1 MOVWF CCP1CON MOVLW 0x64 MOVWF CCPR1L MOVLW 0x57 MOVWF CCPR1H ; CLRF TimeCardOn ;сброс времени для вставки карточки MOVLW 0x90; 0xD0 - for parity MOVWF RCSTA ;настройка параметров приемника USART. Регистр RCSTA управляет настройкой приемника последовательного порта BSF STATUS,RP0 ;выбор второго банка памяти MOVLW 0x24; 0x64 - for parity MOVWF TXSTA ;настройка параметров передатчика USART MOVLW 0x01 ;(115200 бод) MOVWF SPBRG ;настройка скорости обмена по последовательному порту BCF STATUS,RP0 ;после настройки SFR востанавливаем банк памяти CLRF PORTA BSF PORTC,0 ; выдаем сигнал компьютеру об отсутсвии карточки ; BSF Flags,SlotEmpty ; слот пустой MOVLW 0x20 MOVWF FSR MOVLW 0xFF MOVWF Cnt0 MOVWF Cnt1 MOVWF Cnt2 MOVWF TimeH0Loaded MOVWF TimeH1Loaded MOVWF TimeH2Loaded MOVWF TimeL0Loaded MOVWF TimeL1Loaded MOVWF TimeL2Loaded MOVLW 10 MOVWF TimeH0 MOVLW 10 MOVWF TimeH1 MOVLW 10 MOVWF TimeH2 MOVWF TimeL0 MOVWF TimeL1 MOVWF TimeL2 ; GOTO NoCarryL ; Увеличиваем значение счетчика TimeH на единицу NoCarryH BTFSC PIR1,RCIF CALL GetRSData MOVLW 1 ADDWF TimeH0,W MOVWF TimeH0 BTFSS STATUS,C GOTO NoCarryH MOVLW 1 ADDWF TimeH1,W MOVWF TimeH1 BTFSS STATUS,C GOTO NoCarryH MOVLW 1 ADDWF TimeH2,W MOVWF TimeH2 BTFSS STATUS,C GOTO NoCarryH ; Счетчик TimeH переполнился, востанавливаем его и начинаем считать TimeL MOVF TimeH0Loaded,W MOVWF TimeH0 MOVF TimeH1Loaded,W MOVWF TimeH1 MOVF TimeH2Loaded,W MOVWF TimeH2 BSF PORTB,7 ; Вывод положительного фронта импульса BCF PORTB,6 ; CALL SetRSData NOP NOP NOP NoCarryL BTFSC PIR1,RCIF CALL GetRSData MOVLW 1 ADDWF TimeL0,W MOVWF TimeL0 BTFSS STATUS,C GOTO NoCarryL MOVLW 1 ADDWF TimeL1,W MOVWF TimeL1 BTFSS STATUS,C GOTO NoCarryL MOVLW 1 ADDWF TimeL2,W MOVWF TimeL2 BTFSS STATUS,C GOTO NoCarryL MOVF TimeL0Loaded,W MOVWF TimeL0 MOVF TimeL1Loaded,W MOVWF TimeL1 MOVF TimeL2Loaded,W MOVWF TimeL2 BCF PORTB,7 ; Вывод отрицательного фронта импульса BSF PORTB,6 ; CALL SetRSData ; Если количество импульсов меньше константы, считаем их BTFSS Cnt2,7 GOTO NoCarryH NoCarryCnt BTFSC PIR1,RCIF CALL GetRSData MOVLW 1 ADDWF Cnt0,W MOVWF Cnt0 BTFSS STATUS,C GOTO NoCarryH MOVLW 1 ADDWF Cnt1,W MOVWF Cnt1 BTFSS STATUS,C GOTO NoCarryH MOVLW 1 ADDWF Cnt2,W MOVWF Cnt2 BTFSS STATUS,C GOTO NoCarryH MOVLW 0xFF MOVWF Cnt0 MOVWF Cnt1 MOVWF Cnt2 GOTO NoCarryCnt GetRSData BCF PIR1,RCIF ; Прием и запись в память байта MOVF RCREG,W MOVWF INDF ; MOVWF TXREG MOVLW 0x20 ; Проверка прихода стартовго байта SUBWF StartByte,W BTFSS STATUS,Z RETURN INCF FSR,F ; Увеличение адреса с MOVF FSR,W ; проверкой на переполнение SUBLW 0x2A BTFSS STATUS,Z RETURN MOVLW 0x20 MOVWF FSR GOTO NoCarryH ;SetRSData ; BTFSS PIR1,TXIF ;ожидание окончания передачи ; RETURN ; MOVF PORTB,W ; MOVWF TXREG ; BCF PIR1,TXIF ; RETURN END