; встроенный 4мгц генератор ; ШИМ звук телеграфа для FM маяка, LED контроль посылок (CW key) list p=16f628a #include "p16f628a.inc" ; processor specific variable definitions LIST __CONFIG _CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT ;***** VARIABLE DEFINITIONS **************************************** UDATA 0x20 BITS1 RES 1 ; технобиты NUMCHAR RES 1 PBIT RES 1 CHAR RES 1 TON RES 1 TIME_MS20 RES 1 SEC RES 1 MIN RES 1 DELAYSPEED RES 1 NUMTABLE RES 1 ; номер таблицы, 1-MOE,2-MOI..., 6-MO SWITCH RES 1 ; номер, заданный перемычками ;-------------------------------------------------------------------- UDATA_SHR 0x7E w_temp RES 1 ; variable used for context saving status_temp RES 1 ; variable used for context saving ;--- биты порта 'B' ------------------------------------------------- #define PINPWM PORTB,3 #define PTT PORTB,4 #define LED PORTB,5 ;-------------------------------------------------------------------- #define BEEPBIT BITS1,0 #define BBEEP BITS1,1 ; время пищать телеграфом #define BEACONBIT BITS1,2 ;-------------------------------------------------------------------- ; 8гц при 32768 = .4096 = 0x1000 циклов HIBYTE EQU 0xF0 LOBYTE EQU 0x00 ; частоты шим модулятора HZ2000 EQU .26 ; при прескалере /16 HZ1500 EQU .42 HZ1000 EQU .62 HZ700 EQU .89 HZ300 EQU .208 ; SPEED EQU .2 ;задержка в N раз от 20гц ;********************************************************************** rst code 0x00 goto BEGIN ; go to beginning of program ;********************************************************************** intrpt code 0x04 ; TIMER1 коррекция циклов: movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ;--------------------------------- BTFSC PIR1,TMR1IF ; прерывание от TMR1 ? GOTO TMR1_INT ; да, идём на его обработку GOTO ENDINT ;--------------------------------- TMR1_INT: BANKSEL PIR1 ; BCF PIR1,TMR1IF ; очистить наличие прерывания MOVLW HIBYTE ; загрузить таймер MOVWF TMR1H ; MOVLW LOBYTE ; MOVWF TMR1L ; BTFSC BEACONBIT ; проверить на маяк CALL BEACONWORK ; и запустить его ; MS20: INCF TIME_MS20,F ; просчитать 8 циклов и получить секунду. MOVLW .8 ; для часового кварца ; XORWF TIME_MS20,W BTFSS STATUS,Z GOTO ENDINT CLRF TIME_MS20 ;----------- INCF SEC,F ; счётчик секунд MOVLW .60 XORWF SEC,W BTFSS STATUS,Z GOTO ENDINT CLRF SEC ;----------- INCF MIN,F ; счётчик минут MOVLW .6 ; если 6я - то будет 1я XORWF MIN,W BTFSS STATUS,Z GOTO ENDINT MOVLW 1 ; начало счёта с 1й минуты MOVWF MIN ;--------------------------------- ENDINT: movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ;--------------------------------------------------------- BEGIN: ; установка портов BANKSEL TRISB MOVLW 0 ; порт B вывод MOVWF TRISB CLRF PORTB MOVLW 0xFF ; порт A ввод MOVWF TRISA ; включить TMR2 с прескалером 16 BANKSEL T2CON MOVLW B'00000111' MOVWF T2CON ; отключение компараторов MOVLW 0x07 MOVWF CMCON ; установка TMR1 прерывания MOVLW LOBYTE ; загрузить 50000 для 20Гц прерывания MOVWF TMR1L MOVLW HIBYTE MOVWF TMR1H BANKSEL PIE1 BSF PIE1,TMR1IE ; прерывания от TMR1 BANKSEL T1CON BSF T1CON,TMR1ON ; TMR1 - режим таймера ; двестрочки только для часового кварца BSF T1CON,TMR1CS BSF T1CON,T1OSCEN ; BSF INTCON,PEIE ; включить переферийные прерывания BSF INTCON,GIE ;--начало работы---------------------------------------- MOVLW HZ1000 MOVWF TON CALL SETTONE MOVLW SPEED ; загрузить задержку MOVWF DELAYSPEED ;--осмотр перемычек------------------------------------- ; перемычки RA2 RA3 RA4 об землю MOVF PORTA,W ; порт А в W MOVWF SWITCH RRF SWITCH,F RRF SWITCH,W XORLW 0xFF ; инвертировать ANDLW B'00000111' MOVWF SWITCH ; SWITCH - 3 младшие бита теперь как перемычки ; вставлено - 1 ;------------------------------------------------------ CLRF TIME_MS20 CLRF PORTB CLRF SEC MOVLW 1 ; начало счёта с 1й минуты MOVWF MIN ; осмотр перемычек-------------------------------------------- ; перемычки 0-TEST 1 MIN, 1-MOE, 2-MOI, 3-MOS, 4-MOH, 5-MO5, 6-MO ; 0 INCF SWITCH,W XORLW 1 BTFSC STATUS,Z GOTO TIMETEST ; 1 MOVF SWITCH,W XORLW 1 BTFSC STATUS,Z GOTO NUMBER1 ; 2 MOVF SWITCH,W XORLW 2 BTFSC STATUS,Z GOTO NUMBER2 ; 3 MOVF SWITCH,W XORLW 3 BTFSC STATUS,Z GOTO NUMBER3 ; 4 MOVF SWITCH,W XORLW 4 BTFSC STATUS,Z GOTO NUMBER4 ; 5 MOVF SWITCH,W XORLW 5 BTFSC STATUS,Z GOTO NUMBER5 ; 6 MOVF SWITCH,W XORLW 6 BTFSC STATUS,Z GOTO NUMBER6 ; если не 0-6, то ... ; проверка часов - включено ПТТ(LED) в течение первой минуты в 5тиминутном цикле TIMETEST: CLRWDT MOVLW 1 XORWF MIN,W BTFSS STATUS,Z GOTO OFFLED BSF LED GOTO TIMETEST OFFLED: BCF LED GOTO TIMETEST ;------------------------------------------------------- NUMBER1: CLRWDT MOVF MIN,W ; проверить текущую минуту XORLW 1 BTFSS STATUS,Z ; 1я минута ? GOTO NUMBER1 ; нет, ждать MOVLW 1 ; задать номер таблицы MOVWF NUMTABLE CALL STARTBEACON LOOPNUM1: CLRWDT BTFSC BEACONBIT GOTO LOOPNUM1 GOTO NUMBER1 ;------------------------------------------------------- NUMBER2: MOVLW 2 ; выдать при включении - кто я? MOVWF NUMTABLE CALL STARTBEACON IM2: CLRWDT BTFSC BEACONBIT GOTO IM2 ; основное тело 2й минуты WORK2: CLRWDT MOVF MIN,W ; проверить текущую минуту XORLW 2 BTFSS STATUS,Z ; 2я минута ? GOTO WORK2 ; нет, ждать MOVLW 2 ; задать номер таблицы MOVWF NUMTABLE CALL STARTBEACON LOOPNUM2: CLRWDT BTFSC BEACONBIT GOTO LOOPNUM2 GOTO WORK2 ;------------------------------------------------------- NUMBER3: MOVLW 3 ; выдать при включении - кто я? MOVWF NUMTABLE CALL STARTBEACON IM3: CLRWDT BTFSC BEACONBIT GOTO IM3 ; основное тело 3й минуты WORK3: CLRWDT MOVF MIN,W ; проверить текущую минуту XORLW 3 BTFSS STATUS,Z ; 3я минута ? GOTO WORK3 ; нет, ждать MOVLW 3 ; задать номер таблицы MOVWF NUMTABLE CALL STARTBEACON LOOPNUM3: CLRWDT BTFSC BEACONBIT GOTO LOOPNUM3 GOTO WORK3 ;------------------------------------------------------- NUMBER4: MOVLW 4 ; выдать при включении - кто я? MOVWF NUMTABLE CALL STARTBEACON IM4: CLRWDT BTFSC BEACONBIT GOTO IM4 ; основное тело 4й минуты WORK4: CLRWDT MOVF MIN,W ; проверить текущую минуту XORLW 4 BTFSS STATUS,Z ; 4я минута ? GOTO WORK4 ; нет, ждать MOVLW 4 ; задать номер таблицы MOVWF NUMTABLE CALL STARTBEACON LOOPNUM4: CLRWDT BTFSC BEACONBIT GOTO LOOPNUM4 GOTO WORK4 ;------------------------------------------------------- NUMBER5: MOVLW 5 ; выдать при включении - кто я? MOVWF NUMTABLE CALL STARTBEACON IM5: CLRWDT BTFSC BEACONBIT GOTO IM5 ; основное тело 5й минуты WORK5: CLRWDT MOVF MIN,W ; проверить текущую минуту XORLW 5 BTFSS STATUS,Z ; 5я минута ? GOTO WORK5 ; нет, ждать MOVLW 5 ; задать номер таблицы MOVWF NUMTABLE CALL STARTBEACON LOOPNUM5: CLRWDT BTFSC BEACONBIT GOTO LOOPNUM5 GOTO WORK5 ;------------------------------------------------------- NUMBER6: MOVLW 6 ; приводной постоянный MO MOVWF NUMTABLE WORK6: CALL STARTBEACON LOOPNUM6: CLRWDT BTFSC BEACONBIT GOTO LOOPNUM6 GOTO NUMBER6 ;------------------------------------------------------- STARTBEACON CLRF BITS1 CLRF PBIT ; обнулить указатель на сл-й передаваемый бит из CHAR BSF PBIT,7 ; 7й бит - первый передаваемый в байте CLRF NUMCHAR ; обнулить указатель на номер в таблице BSF BEACONBIT ; пора маячить - режим маяка BSF PTT ; включить передачу для FM RETURN ;--------------------------------------------------------- code 0x0100 ; [MOE ] ; add offset to pc to generate a computed goto MOE: ADDWF PCL DT 0xEE,0x1D,0xDC,0x20,0x00,0xFF ; [MOI ] ; add offset to pc to generate a computed goto MOI: ADDWF PCL DT 0xEE,0x1D,0xDC,0x28,0x00,0xFF ; [MOS ] ; add offset to pc to generate a computed goto MOS: ADDWF PCL DT 0xEE,0x1D,0xDC,0x2A,0x00,0xFF ; [MOH ] ; add offset to pc to generate a computed goto MOH: ADDWF PCL DT 0xEE,0x1D,0xDC,0x2A,0x80,0x00,0xFF ; [MO5 ] ; add offset to pc to generate a computed goto MO5: ADDWF PCL DT 0xEE,0x1D,0xDC,0x2A,0xA0,0x00,0xFF ; [MO ] ; add offset to pc to generate a computed goto MO: ADDWF PCL DT 0xEE,0x1D,0xDC,0x00,0xFF ;--------------------------------------------------------- BEACONWORK BTFSS PBIT,7 ; все ли биты байта переданы ? GOTO SEND8 ; нет, допередадим ; выбор таблиц MOVF NUMTABLE,W XORLW 1 BTFSC STATUS,Z GOTO NEXTMOE ; MOVF NUMTABLE,W XORLW 2 BTFSC STATUS,Z GOTO NEXTMOI ; MOVF NUMTABLE,W XORLW 3 BTFSC STATUS,Z GOTO NEXTMOS ; MOVF NUMTABLE,W XORLW 4 BTFSC STATUS,Z GOTO NEXTMOH ; MOVF NUMTABLE,W XORLW 5 BTFSC STATUS,Z GOTO NEXTMO5 ; MOVF NUMTABLE,W XORLW 6 BTFSC STATUS,Z GOTO NEXTMO GOTO NEXTMO ;если не 6 то MO ;-------------------------------- NEXTMOE: MOVLW HIGH MOE ; см AN556E MOVWF PCLATH MOVF NUMCHAR,W ; загрузим номер очередного байта из таблицы CALL MOE GOTO NEXTALL ;-------------------------------- NEXTMOI: MOVLW HIGH MOI ; см AN556E MOVWF PCLATH MOVF NUMCHAR,W ; загрузим номер очередного байта из таблицы CALL MOI GOTO NEXTALL ;-------------------------------- NEXTMOS: MOVLW HIGH MOS ; см AN556E MOVWF PCLATH MOVF NUMCHAR,W ; загрузим номер очередного байта из таблицы CALL MOS GOTO NEXTALL ;-------------------------------- NEXTMOH: MOVLW HIGH MOH ; см AN556E MOVWF PCLATH MOVF NUMCHAR,W ; загрузим номер очередного байта из таблицы CALL MOH GOTO NEXTALL ;-------------------------------- NEXTMO5: MOVLW HIGH MO5 ; см AN556E MOVWF PCLATH MOVF NUMCHAR,W ; загрузим номер очередного байта из таблицы CALL MO5 GOTO NEXTALL ;-------------------------------- NEXTMO: MOVLW HIGH MO ; см AN556E MOVWF PCLATH MOVF NUMCHAR,W ; загрузим номер очередного байта из таблицы CALL MO ; GOTO NEXTALL ;-------------------------------- NEXTALL: MOVWF CHAR ; поместим текущий байт из таблицы в CHAR INCF NUMCHAR,F ; увеличим счётчик SUBLW 0xFF ; сверим байт с концом записи BTFSC STATUS,Z ; перескочим, если не конец записи GOTO SNDEND ; на конец BTFSC CHAR,7 ; если ноль BSF BBEEP ; бип не включим BTFSS CHAR,7 ; если не ноль BCF BBEEP ; бип не отключим RLF CHAR,F BCF STATUS,C ; очистим, на всякий случай RRF PBIT,F GOTO SETMORZE ; выключить/включить звук телеграфа ; SEND8: BTFSC CHAR,7 ; если ноль BSF BBEEP ; бип не включим BTFSS CHAR,7 ; если не ноль BCF BBEEP ; бип не отключим RLF CHAR,F BCF STATUS,C ; очистим, на всякий случай RRF PBIT,F BTFSC STATUS,C ; из первого бита (8передали) ушли в перенос ? RRF PBIT,F ; да, сдвинем дальше - до 7-го - проверка на входе ; GOTO SETMORZE ; выключить/включить звук телеграфа ;--------------------------------------------------------- SETMORZE: BTFSS BBEEP ; включить или выключить звук телеграфа GOTO NOSOUND GOTO SOUND ;--------------------------------------------------------- SNDEND: BCF BEACONBIT ; сбросить режим маяка - всё передано BCF PTT ; отключить PTT RETURN ;--------------------------------------------------------- SOUND: MOVLW B'00001100' MOVWF CCP1CON ; режим PWM BSF LED RETURN ;--------------------------------------------------------- NOSOUND: CLRF CCP1CON BCF PINPWM BCF LED RETURN ;--------------------------------------------------------- SETTONE: MOVF TON,W BANKSEL PR2 ; установить чатоту ШИМ MOVWF PR2 BCF STATUS,C BANKSEL TON RRF TON,W MOVWF CCPR1L ; установить скважность 2 RETURN ;--------------------------------------------------------- END