;------------------------------------ ; ; CW transmitter controller (CW72.asm) ; ; ver: 0.14 ; type: stand alone ; date: 2007/10/2 ; copyright(c) by M.Nomura (JJ1SUN) ; ;------------------------------------ ; use Atmel AT90S1200 or AT90S2313 ; Atmel AVRASM macro assembler ;------------------------------------ ;I/O ports ; PORT B bit 0 TX out (active low) ; bit 1 TX enable (active high) ; bit 2 RX enable (active high) ; bit 3 Piezo Buzzer (active low) ; bit 4 ; bit 5 ; bit 6 ; bit 7 ; PORT D bit 0 Paddle dot (input active low) ; bit 1 Paddle dash (input active low) ; bit 2 ; bit 3 Speed switch (bit 0 active high) ; bit 4 Speed switch (bit 1 active high) ; bit 5 Speed switch (bit 2 active high) ; bit 6 Speed switch (bit 3 active high) ;------------------------------------ ; CPU type ; .equ AT90S1200 = 1 ; AT90S1200 selected .equ AT90S2313 = 0 ; AT90S2313 not selected ; .nolist ; .if AT90S1200 .include "1200def.inc" .endif .if AT90S2313 .include "2313def.inc" .endif ; .list ; ; assembly options ; .equ DOTREQ = 0B00000001 ; dot request flag .equ DASHREQ = 0B00000010 ; dash request flag .equ SPEED0 = 15 .equ SPEED1 = 14 .equ SPEED2 = 13 .equ SPEED3 = 12 .equ SPEED4 = 11 .equ SPEED5 = 10 .equ SPEED6 = 9 .equ SPEED7 = 8 .equ SPEED8 = 7 .equ SPEED9 = 6 ; .equ SDELAY = 0B11111111 ; semi break-in delay ; ;-------------------------------------- ; CPU register declaration ; .def SWSAVE = r14 ; CW speed swich save .def SPEED = r15 ; CW speed param. .def COUNTER1 = r16 ; software loop counter 1 .def COUNTER2 = r17 ; software loop counter 2 .def TIMEC1 = r18 ; base time counter 1 .def TIMEC2 = r19 ; base time counter 2 .def GP0 = r20 ; general purpose register 0 .def GP1 = r21 ; general purpose register 1 .def SEMICOUNT = r22 ; semi breakin timing counter .def DCOUNT = r23 ; timing down counter .def DOTDASHM = r24 ; bit 0=dot memory, bit 1=dash memory (1=request,0=no request) ; ;--------------------------------------- .cseg ;--------------------------------------- ; program starts here ; .org 0 RJMP RESET ; reset entry ; RETI ; external interrupt entry ; ;---------------------------------------- ; Program ID ; ID: .db "CW72 ver.0.14 " ; ;---------------------------------------- ; RESET: .if AT90S2313 LDI GP0,low(RAMEND) ; set stack pointer (AT90S2313) OUT SPL,GP0 .endif ; RCALL INIT ; port & timer initialize RCALL GETSWITCH ; read CW speed switch MAIN1: IN GP0,PIND ; dot paddle ? ANDI GP0,DOTREQ BREQ DOTPRO IN GP0,PIND ; dash paddle ? ANDI GP0,DASHREQ BREQ DASHPRO RCALL GETSWITCH ; read speed switch RCALL WAITL TST SEMICOUNT BREQ MAIN1 DEC SEMICOUNT BRNE MAIN1 ; CBI PORTB,1 ; TX disable RCALL WAITL SBI PORTB,2 ; RX enable RJMP MAIN1 ; DOTPRO: SBI PORTB,1 ; TX enable CBI PORTB,2 ; RX disable RCALL WAITL ; short time wait loop ; CBI PORTB,0 ; TX on CBI PORTB,3 ; Buzzer on CLR DOTDASHM ; dot/dash memory clear ; LDI COUNTER1,5 ; 5 * 15 * waitl = 1 dot time DOTPRO1: LDI COUNTER2,15 DOTPRO2: RCALL WAITL SBIS PIND,1 ; dash paddle ? ORI DOTDASHM,DASHREQ DEC COUNTER2 BRNE DOTPRO2 ; DEC COUNTER1 BRNE DOTPRO1 ; SBI PORTB,0 ; TX off SBI PORTB,3 ; Buzzer off ; LDI COUNTER1,5 ; space timing DOTPRO3: LDI COUNTER2,13 DOTPRO4: RCALL WAITL SBIS PIND,1 ; dash paddle ? ORI DOTDASHM,DASHREQ DEC COUNTER2 BRNE DOTPRO4 ; DEC COUNTER1 BRNE DOTPRO3 ; MOV GP0,DOTDASHM ANDI GP0,DASHREQ BRNE DASHPRO LDI SEMICOUNT,SDELAY ; semi break-in timing RJMP MAIN1 ; DASHPRO: SBI PORTB,1 ; TX enable CBI PORTB,2 ; RX disable ; CBI PORTB,0 ; TX on CBI PORTB,3 ; Buzzer on CLR DOTDASHM ; LDI COUNTER1,15 ; 15 * 15 * waitl = 1 dash time DASHPRO1: LDI COUNTER2,15 DASHPRO2: RCALL WAITL SBIS PIND,0 ; dot paddle ? ORI DOTDASHM,DOTREQ DEC COUNTER2 BRNE DASHPRO2 DEC COUNTER1 BRNE DASHPRO1 ; SBI PORTB,0 ; TX off SBI PORTB,3 ; Buzzer off LDI COUNTER1,5 DASHPRO3: LDI COUNTER2,13 DASHPRO4: RCALL WAITL SBIS PIND,0 ; dot paddle ? ORI DOTDASHM,DOTREQ DEC COUNTER2 BRNE DASHPRO4 ; DEC COUNTER1 BRNE DASHPRO3 ; MOV GP0,DOTDASHM ANDI GP0,DOTREQ BRNE DOTPRO LDI SEMICOUNT,SDELAY ; semi breakin delay RJMP MAIN1 ; ;------------------------------------------------- ; Short time wait ; WAITL: MOV TIMEC1,SPEED WAITL1: LDI TIMEC2,0B10000000 WAITL2: DEC TIMEC2 BRNE WAITL2 DEC TIMEC1 BRNE WAITL1 RET ; ;----------------------------------------------- ; Get speed switch ; GETSWITCH: IN GP0,PIND ; read swicth LSR GP0 LSR GP0 LSR GP0 ANDI GP0,0B00001111 CP GP0,SWSAVE ; change SW ? BREQ GETSW2 MOV SWSAVE,GP0 LDI GP1,SPEED0 CPI GP0,0 BREQ GETSW1 LDI GP1,SPEED1 CPI GP0,1 BREQ GETSW1 LDI GP1,SPEED2 CPI GP0,2 BREQ GETSW1 LDI GP1,SPEED3 CPI GP0,3 BREQ GETSW1 LDI GP1,SPEED4 CPI GP0,4 BREQ GETSW1 LDI GP1,SPEED5 CPI GP0,5 BREQ GETSW1 LDI GP1,SPEED6 CPI GP0,6 BREQ GETSW1 LDI GP1,SPEED7 CPI GP0,7 BREQ GETSW1 LDI GP1,SPEED8 CPI GP0,8 BREQ GETSW1 LDI GP1,SPEED9 GETSW1: MOV SPEED,GP1 GETSW2: RET ; ;----------------------------------------------- ; Ports and working register initialize ; INIT: LDI GP0,0B11111111 ; bit 0-7 output OUT DDRB,GP0 LDI GP0,0B01110100 ; bit 0-6 input OUT DDRD,GP0 LDI GP0,0B00001101 ; RX enable,TX disable ; key up, Buzzer off OUT PORTB,GP0 LDI GP0,0B01111111 ; input pull up register enable OUT PORTD,GP0 CLR DOTDASHM ; Dot/Dash memory CLR SEMICOUNT ; semi break-in counter RET ; ;---------------------------------------------- ; end program ;----------------------------------------------