; RAEV.ASM - En ræve sender, ; ; Dette program udsender morse OZ7FOX-x p† port A, bit 0. G†r LAV for ptt. ; Senderen aktiveres f›rst med LAV p† port A, bit 1. ; ; v‘rdien af x bestemmes af port B, bit 1-3: (interne pull-up enabled) ; Hvis bit 1 er lav udsendes OZ7FOZ-A ; Hvis bit 2 er lav udsendes OZ7FOZ-U ; Hvis bit 3 er lav udsendes OZ7FOZ-V ; ellers g†s i testmode ; ; hastigheden bestemmes af port B, bit 0: ; hvis bit 0 er h›j sendes med 6 ord pr minut. ; hvis bit 0 er lav sendes med 1 ord pr minut. ; ; pauserne mellem afsendelse af morsen bestemmes af port A, bit 2-4: ; hvis bit 2 er lav, pause i 3 min. ; hvis bit 3 er lav, pause i 5 min. ; hvis bit 4 er lav, pause i 10 min. ; ellers g†s i testmode ; ; Sendetiden er altid 1 minut. ; ; ; S‘t fx. en modstand p† 470 ohm og en LED i serie og forbind mellem ; RA0 (eller RA1) og GND for at teste resultatet. ; ; Antager at der anvendes en xtal frekvens p† ca. 4 Mhz. ; __CONFIG skal derfor v‘re 15H ; ; Benyt TOPIC -XW raev.hex for at programmere ; ; ; Version ; 1.07 Interne pullup modstande p† port B enabled. ; 1.06 sender t‘ndes med lav p† portA,bit1 og ptt er portA,bit0 ; 1.05 Hastighed og pausetid bestemmes af port b, postfix char af port a. ; 1.04 sender postfix (a,u eller v) v‘lges fra port b, bits 1-3. ; 1.03 implementeret n›jagtive delays ; 1.02 gjort priktid konfigurerbar ; 1.01 holder pause ; 1.00 sender morse uafbrudt LIST P=16C84 __CONFIG 17H ;RC OSC, WATCHDOG ; __CONFIG 15H ; __XT_OSC __WDT_ON ; Xtal OSC, WATCHDOG __IDLOCS 1234 ; ------ system registre ------ ; PortA equ 5 PortB equ 6 TrisA equ 85H TrisB equ 86H OptReg equ 81H PCL equ 2 ; the Program-Counter register Status equ 3 ; the status register RBPU equ 7 ; pullup resistor bit ; status register bits: CARRY EQU 0 ; carry bit DC EQU 1 ; Digit-Carry ZERO EQU 2 ; zero bit RP0 EQU 5 ; RP0 bit RP1 EQU 6 ; RP1 bit ; ------- Port bel‘gning ------- ; ; digitale udgange til styring af sender og afsendelse af morse: SenderOnPort equ PortA SenderOnBit equ 1 SenderTastPort equ PortA SenderTastBit equ 0 ; ; ----- Variable i ram ------- ; RAM equ 0x20 ; start herfra ved 16c84 cpu ; ; variable til brug ved sending af morse-tegn: Tegnet equ RAM+0 ; det "tegn" der skal sendes PrikTid equ RAM+1 ; "tid" = antal 10ms (0=50ms,1=60ms..) TempTid equ RAM+2 ; midlertidig timer register ChIndex equ RAM+3 ; index til det tegn der skal sendes ; ; variable til delay-l›kker: CntMin equ RAM+4 ; t‘ller antal minutter CntSec equ RAM+5 ; t‘ller antal secunder Cntx50 equ RAM+6 ; t‘ller antal 50ms delays i et sekund Cnt50ms equ RAM+7 ; t‘ller i 50ms delays Cnt1ms equ RAM+8 ; t‘ller i 1ms delays ; ; diverse variable: Flags equ RAM+9 ; bit 0 er pausebit ; Start clrf PortA ; init port A bsf SenderTastPort,SenderTastBit ; turn off transmitter bsf SenderOnPort,SenderOnBit ; turn off ptt clrf PortB ; Init. port B bsf Status,RP0 ; select register bank 1 movlw b'00001111' ; RB7-Rb4,rb0 output rb1-3 input movwf PortB ; s‘t outputs/inputs movwf TrisB^80H ; reg-bank movlw b'00011100' ; RA0,1 output ra2-4 input movwf PortA movwf TrisA^80H ; reg-bank bcf OptReg^80H,RBPU ; Enable internal pullups on port B bcf Status,RP0 ; select register bank 0 ; her indf›res senere: ; - afl‘s switches for at hente priktid (hastighed) ; - afl‘s switches for at hente pausetid ; btfsc PortB,0 ; bit 0 h›j ? goto HighSpeed movlw .10 ; S‘t priktid til 100ms ( 6=80 ) goto SetSpeed HighSpeed movlw .2 ; S‘t priktid til 60 ms ; SetSpeed movwf PrikTid clrf Flags goto Restart Testing ;; testing !!! bsf PortA,1 call VentPrikTid clrf PortA ; stop sender og sluk den! call VentPrikTid goto Testing ;; testing !!! Restart bsf SenderTastPort,SenderTastBit ; ingen morse afsendes pt. bcf SenderOnPort,SenderOnBit ; t‘nd for senderen call delay50ms ; vent p† at senderen er "varm" clrf ChIndex SendOz movf ChIndex,w call MorseCall ; returnerer med tegn i w andlw 0xff ; 0? bz SendChBegin call SendTegn ; sender "tegnet" incf ChIndex,f ; tæl index en op, klar til næste tegn call VentPrikTid goto SendOz ; fortsæt indtil 0 nås ; ; Test port B: ; Hvis bit 1 er h›j udsendes OZ7FOZ-A ; Hvis bit 2 er h›j udsendes OZ7FOZ-U ; Hvis bit 3 er h›j udsendes OZ7FOZ-V ; ellers g†s i testmode ; SendChBegin clrf ChIndex btfss PortB,1 ; bit 1 lav ? goto SendCh ; ja send 'A' btfss PortB,2 ; bit 2 lav ? goto bit2h ; ja send 'U' btfss PortB,3 ; bit 3 lav ? goto bit3h ; ja send 'V' goto Testing bit2h movlw .3 movwf ChIndex goto SendCh bit3h movlw .7 movwf ChIndex SendCh movf ChIndex,w call MorseCh ; returnerer med tegn i w andlw 0xff ; 0? bz PellerK call SendTegn ; sender "tegnet" incf ChIndex,f ; tæl index en op, klar til næste tegn call VentPrikTid goto SendCh ; fortsæt indtil 0 nås ; PellerK ; pause eller konstant ? btfsc Flags,0 goto StartPause ; Konstant tone sendes SendKonstant clrwdt bsf SenderTastPort,SenderTastBit ; sluk udgang call VentPrikTid ; lidt extra mellemrum call VentPrikTid bcf SenderTastPort,SenderTastBit ; t‘nd udgang call delay1min bsf Flags,0 ; marker pausebit goto Restart ; pauserne mellem afsendelse af morsen bestemmes af port A, bit 2-4: ; hvis bit 2 er h›j, pause i 3 min. ; hvis bit 3 er h›j, pause i 5 min. ; hvis bit 4 er h›j, pause i 10 min. ; ellers g†s i testmode. StartPause clrf PortA ; hold op med at sende og sluk sender bsf SenderTastPort,SenderTastBit bsf SenderOnPort,SenderOnBit movlw .3 btfss PortA,2 ; bit 2 lav ? goto Pausen ; ja pause i 3 min btfss PortA,3 ; bit 3 lav ? goto Abit3h ; ja pause i 5 min btfss PortA,4 ; bit 4 lav ? goto Abit4h ; ja pause i 10 min goto Testing Abit3h movlw .5 goto Pausen Abit4h movlw .10 Pausen movwf CntMin PauseLoop call delay1min decfsz CntMin,f goto PauseLoop ; bcf Flags,0 ; nulstil pausebit goto Restart ; pausen er ovre, begynd forfra ;**DOC** ;NAM SendTegn Sender et morse "tegn" ;ARG w-register indeholder "tegnet" ;DSC Et "tegn" i denne sammenhæng er 's','p','m', hvor ; 's' = streg, 'p' er prik, 'm' er mellemrum ;**ENDDOC** SendTegn movwf Tegnet ; gem tegnet bsf SenderTastPort,SenderTastBit ; sluk udgang ; sublw 's' ; er tegnet 's' ? bz SendStreg ; movf Tegnet,w sublw 'p' ; er tegnet 'p' ? bz SendPrik ; ; antag det er et mellemrum! call VentPrikTid call VentPrikTid call VentPrikTid return ; send en streg (lang høj signal) SendStreg bcf SenderTastPort,SenderTastBit ; t‘nd udgang call VentPrikTid call VentPrikTid call VentPrikTid bsf SenderTastPort,SenderTastBit ; sluk udgang return ; send en prik (kort høj signal) SendPrik bcf SenderTastPort,SenderTastBit ; t‘nd udgang call VentPrikTid bsf SenderTastPort,SenderTastBit ; sluk udgang return ; Holder udgangen i tiden svarende til en prik VentPrikTid call delay50ms movf PrikTid,w movwf TempTid VentLoop call delay5ms call delay5ms clrwdt decfsz TempTid,f goto VentLoop return ; Et meget n›jagtigt 1ms ventel›kke for en 4Mhz CPU. delay1ms movlw .197 movwf Cnt1ms nop goto $+1 goto $+1 dly1ms goto $+1 decfsz Cnt1ms,f goto dly1ms retlw 0 ; Bruger delay1ms for at f† en meget n›jagtig 5ms forsinkelse. delay5ms call delay1ms call delay1ms call delay1ms call delay1ms call delay1ms movlw .4 movwf Cnt1ms tweek5ms decfsz Cnt1ms,f goto tweek5ms return ; bruger delay1ms for at f† en n›jagtig 50ms forsinkelse delay50ms movlw .50 movwf Cnt50ms dly50ms call delay1ms decfsz Cnt50ms,f goto dly50ms movlw .14 movwf Cnt1ms tweek50ms decfsz Cnt1ms,f goto tweek50ms retlw 0 ; benytter delay50ms til at lave 1 minuts ventetid. delay1min clrwdt movlw .60 ; pause i 60 sec = 1 min movwf CntSec dlySec movlw .20 ; 20 * 50ms = 1 sekund movwf Cntx50 dly50 call delay50ms clrwdt decfsz Cntx50,f ; flere 50 ms pauser ? goto dly50 ; decfsz CntSec,f ; flere 10 sec pauser ? goto dlySec return ;**DOC** ;NAM MorseStr Hent en streng af "kodede" morse kode tegn. ;RET w-register indeholder det ønskede tegn. ;DSC Denne funktion returnerer et tegn fra en streng af tegn der udgør en kodning ; af morse tegn der skal sendes. ; Tegnene er kodet som følger: ; 's' for streg ; 'p' for prik ; 'm' for mellemrum ; 0 skal altid afslutte strengen ; Dvs. at strengen "spps" er et X. ;**ENDDOC** MorseCall addwf PCL,f retlw 's' ; 'O' retlw 's' retlw 's' retlw 'm' retlw 's' ; 'Z' retlw 's' retlw 'p' retlw 'p' retlw 'm' retlw 's' ; '7' retlw 's' retlw 'p' retlw 'p' retlw 'p' retlw 'm' retlw 'p' ; 'F' retlw 'p' retlw 's' retlw 'p' retlw 'm' retlw 's' ; 'O' retlw 's' retlw 's' retlw 'm' retlw 's' ; 'X' retlw 'p' retlw 'p' retlw 's' retlw 'm' retlw 'm' ; retlw 'm' retlw 0 ; MorseCh addwf PCL,f retlw 'p' ; 'A' - start med 0 retlw 's' retlw .0 retlw 'p' ; 'U' - start med 3 retlw 'p' retlw 's' retlw .0 retlw 'p' ; 'V' - start med 7 retlw 'p' retlw 'p' retlw 's' retlw .0 ; ORG 2100H ; DE "Copyright (C) 1998 Claus Ørnhøj Petersen" END