A PIC16F629 mini CW-QRSS beacon.

Beacons are useful to test propagation, even for small distance links. This one requires MPLAB IDE to generate machine code from assembler and a PIC programmer to write code into the PIC memory. The text sent from the beacon is inserted in the program before compiling and cannot be changed without reprogramming the PIC.cw_beacon
The ASM source code of the project is the following:


; 	CW Beacon controller 
;	by IW2KPU
; 	16F629 con oscillatore interno 4MHz
;	Velocità CW selezionabili:
; 	20 wpm, 10 wpm, QRSS1, QRSS3, QRSS10, QRSS30, QRSS60
;	Due messaggi selezionabili in trasmissione
;	Many Thanks to Johan Bodin SM6LKM
;
;	GP2	GP1	GP0	CW Speed
;	0	0	0	20 WPM (dot=60msec)  	int. tutti verso massa
;	0	0	1	10 WPM	(dot=120msec)
;	0	1	0	QRSS1
;	0	1	1	QRSS3
;	1	0	0	QRSS10	
;	1	0	1	QRSS30
;	1	1	0	QRSS60
;	1	1	1	QRSS120					int. tutti aperti
;
;	GP4 verso massa per msg0, GP4 aperto per msg1
;	GP5 output, GP3 a +5V attraverso R da 10K, con pulsante verso massa per reset

;-------------------------------------------------------------------------------
;	Direttive assembler
;-------------------------------------------------------------------------------


	title		"CW Beacon"
	subtitle	"QRSS Beacon"
	list		p=12F629          
	#include	        
	errorlevel  -302            	; suppress message 302 from list file
	radix		dec					; decimal radix as default

	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 


;-------------------------------------------------------------------------------
;	Nomi delle variabili in RAM (registri)
;-------------------------------------------------------------------------------

	CBLOCK	0x20	; inizio indirizzi dei registri RAM
		delcnt		; punto/linea/space delay tick counter
		gpioval
		secs
		del1	
		del2
		del3
	ENDC


#define	tx	GPIO,5	;in trasmissione va a +5V GP5


;-------------------------------------------------------------------------------
;	CW character macros
;-------------------------------------------------------------------------------

;	punto   = 1T tx + 1T pausa
;	punto_  = 1T tx + 3T pausa (spazio tra caratteri)
;	linea  = 3T tx + 1T pausa
;	linea_ = 3T tx + 3T key up (spazio tra caratteri)

__A	macro
	call	punto
	call	linea_
	endm

__B	macro
	call	linea
	call	punto
	call	punto
	call	punto_
	endm

__C	macro
	call	linea
	call	punto
	call	linea
	call	punto_
	endm

__D	macro
	call	linea
	call	punto
	call	punto_
	endm

__E	macro
	call	punto_
	endm

__F	macro
	call	punto
	call	punto
	call	linea
	call	punto_
	endm

__G	macro
	call	linea
	call	linea
	call	punto_
	endm

__H	macro
	call	punto
	call	punto
	call	punto
	call	punto_
	endm

__I	macro
	call	punto
	call	punto_
	endm

__J	macro
	call	punto
	call	linea
	call	linea
	call	linea_
	endm

__K	macro
	call	linea
	call	punto
	call	linea_
	endm

__L	macro
	call	punto
	call	linea
	call	punto
	call	punto_
	endm

__M	macro
	call	linea
	call	linea_
	endm

__N	macro
	call	linea
	call	punto_
	endm

__O	macro
	call	linea
	call	linea
	call	linea_
	endm

__P	macro
	call	punto
	call	linea
	call	linea
	call	punto_
	endm

__Q	macro
	call	linea
	call	linea
	call	punto
	call	linea_
	endm

__R	macro
	call	punto
	call	linea
	call	punto_
	endm

__S	macro
	call	punto
	call	punto
	call	punto_
	endm

__T	macro
	call	linea_
	endm

__U	macro
	call	punto
	call	punto
	call	linea_
	endm

__V	macro
	call	punto
	call	punto
	call	punto
	call	linea_
	endm

__W	macro
	call	punto
	call	linea
	call	linea_
	endm

__X	macro
	call	linea
	call	punto
	call	punto
	call	linea_
	endm

__Y	macro
	call	linea
	call	punto
	call	linea
	call	linea_
	endm

__Z	macro
	call	linea
	call	linea
	call	punto
	call	punto_
	endm

__AA	macro
	call	punto
	call	linea
	call	linea
	call	punto
	call	linea_
	endm

__AE	macro
	call	punto
	call	linea
	call	punto
	call	linea_
	endm

__OE	macro
	call	linea
	call	linea
	call	linea
	call	punto_
	endm

__0	macro
	call	linea
	call	linea
	call	linea
	call	linea
	call	linea_
	endm

__1	macro
	call	punto
	call	linea
	call	linea
	call	linea
	call	linea_
	endm

__2	macro
	call	punto
	call	punto
	call	linea
	call	linea
	call	linea_
	endm

__3	macro
	call	punto
	call	punto
	call	punto
	call	linea
	call	linea_
	endm

__4	macro
	call	punto
	call	punto
	call	punto
	call	punto
	call	linea_
	endm

__5	macro
	call	punto
	call	punto
	call	punto
	call	punto
	call	punto_
	endm

__6	macro
	call	linea
	call	punto
	call	punto
	call	punto
	call	punto_
	endm

__7	macro
	call	linea
	call	linea
	call	punto
	call	punto
	call	punto_
	endm

__8	macro
	call	linea
	call	linea
	call	linea
	call	punto
	call	punto_
	endm

__9	macro
	call	linea
	call	linea
	call	linea
	call	linea
	call	punto_
	endm

__error	macro
	call	punto
	call	punto
	call	punto
	call	punto
	call	punto
	call	punto
	call	punto
	call	punto_
	endm

__atten	macro
	call	linea
	call	punto
	call	linea
	call	punto
	call	linea_
	endm

__excla	macro
	call	punto
	call	punto
	call	linea
	call	linea
	call	punto_
	endm

__plus	macro
	call	punto
	call	linea
	call	punto
	call	linea
	call	punto_
	endm

__comma	macro
	call	linea
	call	linea
	call	punto
	call	punto
	call	linea
	call	linea_
	endm

__minus	macro
	call	linea
	call	punto
	call	punto
	call	punto
	call	punto
	call	linea_
	endm

__perio	macro
	call	punto
	call	linea
	call	punto
	call	linea
	call	punto
	call	linea_
	endm

__slash	macro
	call	linea
	call	punto
	call	punto
	call	linea
	call	punto_
	endm

__equal	macro
	call	linea
	call	punto
	call	punto
	call	punto
	call	linea_
	endm

__quest	macro
	call	punto
	call	punto
	call	linea
	call	linea
	call	punto
	call	punto_
	endm

__@	macro
	call	punto
	call	punto
	call	punto
	call	linea
	call	punto
	call	linea_
	endm

__wait	macro
	call	punto
	call	linea
	call	punto
	call	punto
	call	punto_
	endm


;-------------------------------------------------------------------------------
;	INIZIO PROGRAMMA
;-------------------------------------------------------------------------------

	ORG	0x0000

;	Recupera il valore di taratura dell'oscillatore interno

	call    0x3FF             ; recupera il valore di taratura oscillatore interno
	bsf     STATUS,RP0        ; vai al bank 1 
	movwf   OSCCAL            ; aggiorna OSCCAL col valore di taratura
	bcf     STATUS,RP0        ; vai al bank 0

;	Definisce i pin di ingresso e di uscita

	clrf	GPIO 			;inizializza GPIO
	movlw	b'00000111'		;definisce GP ingressi digitali
	movwf	CMCON 			
	bsf		STATUS,RP0 		;Bank 1
	movlw	b'00010111' 	;definisce GP0,GP1,GP2,GP4 ingressi  e GP5 uscita
	movwf	TRISIO 			
	movlw	b'00010111'		;seleziona il pull-up su GP0,GP1,GP2,GP4
	movwf	WPU
	movlw	b'01111111'		;attiva i pull-ups
	movwf	OPTION_REG
	bcf     STATUS,RP0      ; vai al bank 0

;-------------------------------------------------------------------------------
;	Parte principale
;-------------------------------------------------------------------------------

mainloop:
	movf	GPIO,w		; legge le gli switch sulle porte
	movwf	gpioval		; li copia in RAM
	btfsc	gpioval, 4	; Se int. su GP4 chiuso a massa sceglie msg1, se aperto msg0
	goto	msg0
	goto	msg1

;*******************************************************************************
;	CHANGE AS NEEDED
;*******************************************************************************

msg0:
	call	delay_3t		; 4 from bottom + this one = 7T

	__I
	__Z
	__2
	__Z
	__Z
	__Z
	__slash
	__B

	call	delay_1t		; now we have 4T space

	goto	mainloop


;*******************************************************************************
;	IZ2ZZZ QTH JN99LM - CHANGE AS NEEDED -
;*******************************************************************************

msg1:
	call	delay_3t		; 4 from bottom + this one = 7T

	__I
	__Z
	__2
	__Z
	__Z
	__Z

	call	delay_4t

	__Q
	__T
	__H

	call	delay_4t

	__J
	__N
	__9
	__9
	__L
	__M

	call	delay_4t

	__P
	__S
	__E

	call	delay_4t

	__C
	__F
	__M

	call	delay_1t

	goto	mainloop

;-------------------------------------------------------------------------------
;	Dot/linea subroutines
;-------------------------------------------------------------------------------

punto:					; punto normale
	bsf	tx				; tx on
	call	delay_1t	; aspetta 1 punto
	bcf	tx				; tx off
	call	delay_1t	; aspetta 1 punto
	return
punto_:				; punto alla fine di un carattere
	bsf	tx
	call	delay_1t
	bcf	tx
	call	delay_3t
	return

linea:				; linea normale
	bsf	tx
	call	delay_3t
	bcf	tx
	call	delay_1t
	return

linea_:				; linea alla fine di un carattere
	bsf	tx
	call	delay_3t
	bcf	tx
	call	delay_3t
	return


;-------------------------------------------------------------------------------
;	Routine di ritardo CW punto/linea/spazio
;-------------------------------------------------------------------------------

delay_4t:
	movlw	4
	goto	dodelay

delay_3t:
	movlw	3
	goto	dodelay

delay_1t:
	movlw	1

dodelay:
	movwf	delcnt	; salva il valore del ritardo
loop:
	; viene eseguita un ritardo pari alla durata di un punto
	; ritardo che dipende dagli switch GP0-GP1-GP2
	movf	gpioval,w	; recupera il valore di GPIO salvato
	andlw	0x07		; mantiene solo i valori GP0-GP1-GP2
	clrf	PCLATH		; computed goto: attenzione stare in segmento da 256 bytes
	addwf	PCL,f		; somma al byte basso del program counter
	goto	dl0		; 20wpm
	goto	dl1		; 10wpm
	goto	dl2		; QRSS1
	goto	dl3		; QRSS3
	goto	dl4		; QRSS10
	goto	dl5		; QRSS30
	goto	dl6		; QRSS60
	goto 	dl7		; QRSS120
dl0:
	call 	del_60msec
	goto 	rpt
dl1:
	call 	del_60msec
	call 	del_60msec
	goto 	rpt
dl2:
	call 	del_1sec
	goto 	rpt
dl3:
	movlw	.3
	goto	ddl
dl4:
	movlw	.10
	goto	ddl
dl5:
	movlw	.30
	goto	ddl
dl6:
	movlw	.60
	goto	ddl
dl7:
	movlw	.120
ddl:
	movwf	secs
	call	del_1sec
	decfsz	secs, f
	goto	ddl
rpt:
	decfsz	delcnt,f
	goto	loop
	return

; Ritardo di 1 secondo 4 MHz
del_1sec
			;999990 cycles
	movlw	0x07
	movwf	del1
	movlw	0x2F
	movwf	del2
	movlw	0x03
	movwf	del3
Delay_0
	decfsz	del1, f
	goto	$+2
	decfsz	del2, f
	goto	$+2
	decfsz	del3, f
	goto	Delay_0
			;6 cycles
	goto	$+1
	goto	$+1
	goto	$+1
			;4 cycles (including call)
	return
;
; Ritardo di 60 msec a 4 MHz
del_60msec
			;59993 cycles
	movlw	0xDE
	movwf	del1
	movlw	0x2F
	movwf	del2
Delay_1
	decfsz	del1, f
	goto	$+2
	decfsz	del2, f
	goto	Delay_1
			;3 cycles
	goto	$+1
	nop
			;4 cycles (including call)
	return

;-------------------------------------------------------------------------------
	END

Lascio un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *