Bug-ST6
© by Vittorio Crapella - i2viu
TASTO TELEGRAFICO CON ST6210
Per recuperare tutto il progetto BUGST6.ZIP
Per recuperare il file BUGST6.HXE (3KB) in formato zip
Per vedere BUGST6.ASM in formato testo
TASTO "BUG" PER TELEGRAFIA - VERSIONE ST6
Ho sviluppato un programma per il microcontrollore ST62T10 della SGS-Tomson affinché diventasse un tasto elettronico per il cw. Questo "bug" ha come tutti un ingresso per il "paddle" punti e uno per quello delle linee, ha un'uscita che va a +5V con il cw per polarizzare un transistore che piloterà il TX, ha un'uscita di B.F. per il monitor , ha un pulsante "funzione" per i vari comandi, ha un pulsante di "reset" per tornare in ogni momento nel modo di configurazione standard, ha un potenziometro per regolare la velocità, e in fine ha un potenziometro per allungare o accorciare la durata del punto o della linea (RATIO).
Quest'ultimo potenziometro e` da considerarsi diviso in due parti; la prima meta` riguarda il punto e la seconda meta` la linea. Nel primo quarto regolo il punto da corto a normale, nel secondo quarto da normale a lungo mentre nel terzo quarto di potenziometro regolo la linea da corta a normale e per finire, nell'ultimo quarto regolo la linea da normale a lunga. Combinando le pigiate del tasto funzione con quelle delle "paddle" si possono dare dei comandi al "bug" secondo la tabella qui sotto raffigurata in cui i numeri indicati indicano appunto l'ordine di pigiata per ottenere ogni comando specificato. Ad esempio per sapere a quanti WPM e` regolato il potenziometro della velocità si deve pigiare prima il tasto funzioni poi la pala linee e in fine la pala dei punti , verrà risposto in cw un numero seguito da WPM.
Se voglio regolare il punto leggermente più corto dello standard posiziono il potenziometro RATIO verso il segno meno e tenendo pigiato entrambe le palette (punti e linee) pigio in fine un colpo il tasto funzioni .
La stessa procedura posso usare anche per allungare o accorciare la linea , potendo cosi avere ad esempio un punto leggermente più corto e una linea leggermente più lunga pur avendo un solo potenziometro di regolazione ratio
I NUMERI INDICANO L'ORDINE DI PIGIATA
Per chi vuole fare esercizio di scrittura in ricezione di gruppi casuali deve pigiare per primo il tasto funzione, pala linee, tasto funzione e per finire pala punti . Quando il bug é allacciato al TX e schiaccio il tasto RESET ottengo come risultato, oltre quello di annullare eventuali regolazioni fatte con RATIO, di mandare in portante continua il trasmettitore durante eventuali accordi; basta pigiare o pala punti o linea per tornare nel modo normale.
PAGINE CORRELATE:
TASTO BUG SOFT ST6210
© by Vittorio Crapella - i2viu
.title "BUG-SOFT" ;01/11/1995 by i2viu Op. Vittorio Crapella Sondrio
;
.vers "ST62E10"
.w_on
;****************************************************************************
;* VARIABILI DEL MICRO *
;****************************************************************************
a .def 0ffh ;ACCUMULATOR (REGISTRO ACCUMULATORE)
x .def 080h ;X REGISTER (REGISTRO X)
y .def 081h ;Y REGISTER (REGISTRO Y)
v .def 082h ;V REGISTER (REGISTRO V)
w .def 083h ;W REGISTER (REGISTRO W)
; DEFINIZIONE DEI REGISTRI DELLE PORTE
; ------------------------------------
port_a .def 0c0h ;PORT A DATA REGISTER
port_b .def 0c1h ;PORT B DATA REGISTER
port_c .def 0c2h ;PORT C DATA REGISTER
pdir_a .def 0c4h ;PORT A DIRECTION REGISTER (0=Input 1=Output)
pdir_b .def 0c5h ;PORT B DIRECTION REGISTER
pdir_c .def 0c6h ;PORT C DIRECTION REGISTER
popt_a .def 0cch ;PORT A OPTION REGISTER
popt_b .def 0cdh ;PORT B OPTION REGISTER
popt_c .def 0ceh ;PORT C OPTION REGISTER
; DEFINIZIONE DEL REGISTRO DEGLI INTERRUPT
; ----------------------------------------
ior .def 0c8h ;INTERRUPT OPTION REGISTER.
; DEFINIZIONE DEL REGISTRO PER IL CONVERTITORE A/D
; ------------------------------------------------
addr .def 0d0h ;A/D DATA REGISTER (REGISTRO DATI DEL CONVERTITORE)
adcr .def 0d1h ;A/D CONTROL REGISTER (REGISTRO DI CONTROLLO)
; DEFINIZIONE DEI REGISTRI DEL TIMER
; ----------------------------------
psc .def 0d2h ;TIMER PRESCALER REGISTER (REGISTRO DEL PRESCALER)
tcr .def 0d3h ;TIMER DATA REGISTER (REGISTRO DATI)
tscr .def 0d4h ;TIMER TSCR REGISTER ( REGISTRO PER IL CONTROLLO
;DELLO STATO DEL TIMER)
; DEFINIZIONE DEL REGISTRO PER IL WATCH-DOG
; -----------------------------------------
wdog .def 0d8h ;WATCHDOG REGISTER
; DEFINIZIONE DEL REGISTRO PER LO SPAZIO DATI ROM
; -----------------------------------------------
drw .def 0c9h ;DATA ROM WINDOW REGISTER
;****************************************************************************
;* VARIABILI DEL PROGRAMMA *
;****************************************************************************
punto .def 084h ;flag di pigiata-esecuzione punto
linea .def 085h ;flag di pigiata-esecuzione punto
corto .def 086h ;durata punto
lungo .def 087h ;durata linea
pausa .def 088h ;durata spazio fra battute
mode .def 089h ;bit0=memoria punto bit1=memoria linea bit3=S.A.
medio .def 08ah ;punto+spazio diviso due = puntomedio
div .def 08bh ;dividento per SUBB e risultato da SUBB
ratio .def 08ch ;massimo ratio
test .def 08dh ;per sapere se ratio up o dw 1=up 0= dw
unita .def 08eh
decine .def 08fh
rest .def 090h ;resto div
tipo .def 091h ;modo di operare 1-4 1=jambic 2=no mem punto 3=sq.
;4= semi automatico
delai .def 092h ;valore per routines delay
nrcar .def 093h ;numero dei caratteri della tabella per casulai
tipcar .def 094h ;tipo di casuale 0-5 lett,num,acc,punteg,let-num,comp
car .def 095h ;numero car gen (5)
tab .def 096h ;nr dove parte la tabella per ricerca caratteri
casu .def 097h ;pari a 5x nrcar
ratiop .def 098h ;viene depositato ratio punto minore di 90
ratiol .def 099h ;viene depositato ratio linea maggiore di 90
;massimo fino a 0BFh ;ultima cella ram disponibile
;****************************************************************************
;* SETTAGGIO INIZIALE *
;****************************************************************************
; INIZIO DEL PROGRAMMA
; --------------------
.org 0880h
inizio ; INIZIALIZZAZIONE DELLE PERIFERICHE
ldi wdog,0ffh ; RICARICA IL WATCH DOG
; SETTAGGIO DELLA PORTA "A" COME INPUT PULL-UP
; ---------------------------------------------
ldi port_a,00000000b
ldi pdir_a,11110000b ;CON 0FFh SI SELEZIONA L'USCITA PUSH-PULL
ldi popt_a,11110000b ; 000 INPUT PULL-UP
;da A0 a A3 mai come A/D
; SETTAGGIO DELLA PORTA "B" COME OUTPUT PUSH-PULL 10mA
; --------------------------------------------
ldi port_b,01111111b ;setta a 1 alla partenza gli out
ldi pdir_b,01111111b ;CON 0h SI SELEZIONA L'INPUT PULL-UP
ldi popt_b,01111111b
ldi adcr,0 ;DISABLE A/D INTERRUPT
ldi tscr,0 ;DISABLE TIMER INTERRUPT
ldi ior,0 ;DISABLE ALL INTERRUPT
reti ;RIPRISTINA I FLAG PRINCIPALI
jp main ;SALTA AL PROGRAMMA PRINCIPALE
;****************************************************************************
;* SUBRINE DI INTERRUPT *
;****************************************************************************
ad_int ;INTERRUPT DEL CONVERTITORE A/D
reti
tim_int ;INTERRUPT DEL TIMER
ldi wdog,255
ldi tcr,110
ldi tscr,01011010b
jrs 2,port_b,zero
set 2,port_b ;mette alto pin 2 porta_b
reti
zero res 2,port_b ;mette basso pin 2 porta_b
reti
BC_int ;INTERRUPT DELLE PORTE A e B
reti
A_int ;INTERRUPT DELLA PORTA A
reti
nmi_int ;INTERRUPT NON MASCHERABILE
reti
;****************************************************************************
;* SUBROUTINE *
;****************************************************************************
delay ld x,a
ld a,delai
ld y,a
ld a,x
ldi wdog,255
rep dec y
jrnz rep
ret
tasti ldi wdog,0feh
jrs 0,port_a,t2 ;se non pigio pala punti vai a t2
jrs 1,port_a,t1 ;se non pigio pala linee vai a t1
jrs 0,linea,l1p2 ;di qui se pigio entrambe
jrs 1,linea,l1p2
;se la linea e` gia` pigiata (non=0) salta
ldi punto,1 ;altrimenti prima punto
ldi linea,2 ;poi linea
ritor ret ;ritorna
l1p2 jrs 0,punto,ritor
jrs 1,punto,ritor
ldi linea,1 ;se il punto non e` finito allora
ldi punto,2 ;allora linea=1 e punto=2
ret
t1 ;arrivo qui se pigio punti e non linee
jrs 0,punto,ritorn ;se punto non e` 0 salta
jrs 1, punto,ritorn
jrs 0,port_a,ritorn ;se non pigio punti salta
jrs 0,linea,p2 ;se linea non e` 0 salta a mettere punto=2
ldi punto,1 ;altrimenti punto=1
ritorn ret
p2 jrr 0,mode,ritorn ;verifica il MODO se con o senza memoria
ldi punto,2 ;se con mem allora punto=2
ret
t2 ;arriva qui se non pigio punti
;verifica se linea e` gia `pigiata
jrs 0,linea,ritorn ;se lo e` gia ritorna
jrs 1,linea,ritorn
jrs 1,port_a,ritorn ;pure se non pigio linee salta
jrs 0,punto,l2 ;se pigio linea verfica punto
;se non e` 0 salta a mettere linea=2
ldi linea,1 ;altrimenti linea=1
ret
l2 jrr 1,mode,ritorn ;verifica il MODO se con o senza memoria
ldi linea,2 ;se con mem allora linea=2
ret
out jrr 7,port_b,out ;se pigiato FUNZ non va in TX
set 1,port_b ;ini cw out livello alto
out1 set 4,ior
ldi tcr,110
ldi tscr,01011010b
suono call delay
ldi wdog,255
jrr 2,mode,lines
clr linea
jrs 0,port_a,suon1
ldi punto,1
suon1 jrr 1,port_a,suono ;se e` S. A. e pigio pala linee continua suono
jp cade
lines call tasti
cade call delay
dec a
jrz suo
jp suono
suo res 1,port_b ;fine cw out livello basso
res 4,ior
res 2,port_b
ret
velo ldi drw,alfa.w ;VELOCITA`
ldi tab,90 ;punta ai numeri in TAB
jrr 6,delai,div4 ;se none QRS salta
ldi div,2 ;se QRS divide solo per 2
jp ldmed
div4 ldi div,4
ldmed ld a,medio
call subb
ldi a,230
call subb ;torna con a=wpm
cpi a,10
jrc cacw ;se a < di dieci allora solo un numero
ldi div,10
call subb ;torna con a=decine di wpm
call cw
call spclu ;spazia fra i num. wpm
ld a,rest ;punta ai numeri rest=unita wpm
cacw call cw
call spclu
call spclu
call spclu
ldi a,11111011b ;W
call cw2
call spclu
ldi a,11110110b ;P
call cw2
call spclu
ldi a,00000011b ;M
call cw2
ret
comandi ldi wdog,0feh ;COMANDI
jrr 0,port_a,velo
jrs 7,port_b,comandi
type ldi drw,let.w
ldi tab,40h
ld a,tipo
cpi a,1
jrnz lop2
ldi mode,3 ;jambic
call cw ; J
call spclu
ldi a,11111101b ; A
call cw2
lop2 cpi a,2
jrnz lop3
ldi mode,2 ;no memoria punto
call cw ; N
call spclu
ldi a,00000011b ; M
call cw2
lop3 cpi a,3
jrnz lop4
clr mode ;mode=0 = squizze
call cw ; S
call spclu
ldi a,00001101b ; Q
call cw2
lop4 cpi a,4
jrnz usc
ldi mode,5 ;semi automatico
call cw ; S
call spclu
ldi a,11111101b ; A
call cw2
usc ldi wdog,0feh
jrr 0,port_a,casual
jrr 7,port_b,inctip
jrs 1,port_a,usc
ret
inctip inc tipo
ld a,tipo
cpi a,6
jrnz oltre
ldi tipo,1
oltre jp type
casual ;GENERAZIONE CARATTERI CASUALI
ldi car,5
ldi drw,alfa.w ;finestra dei caratteri
casual1 ld a,test ;prende il valore test (casuale) per
ldi wdog,255 ;puntare a un carattere
cpia cp a,nrcar ;verifica se e compreso nelle 27 lettere
jrc ldiw
sub a,nrcar ;se maggiore sottrae 27 fino a renderlo
jp cpia ;minore
ldiw ld y,a ;salva moment. a in y
rlc a ;ruota a per rendere casuale
sub a,casu ;sottrae pure casu sempre per casuale
add a,car ;aggiunge per come sopra
inc test
ld test,a ;e lo mette in test per utilizzare la prox
ld a,y ;recupera a da y
call cw ;va a prendere il car corrispondente e poi cw
call spclu ;spazio fra lettere
dec car ;conta i car generati (gruppi di 5)
jrnz altrca ;se non e` zero salta
ld a,test ;altrimenti per cambiare il casuale complememta
rlc a
ld test,a ;e rimette in test per usare la prox
ldi car,5 ;rimette numero caratteri 5
call spclu ;doppio spazio fra gruppo e gruppo
call spclu
call anadig ;aggiorna velocita`
altrca
jrr 7,port_b,nctip ;cambia tipo di casuale
jrr 1,port_a,nocas ;se pigio pala linee esce da casuale
inc casu ;conta quante lettere generate
ld a,nrcar
cp a,casu
jrc jpca ;se non ancora salta altrimenti
rlc a
ld test,a
add a,car
sla a
ld casu,a
jpca jp casual1 ;ricomincia a gen casuale
nocas ret
nctip inc tipcar ;cambia tipo di casuali
ld a,tipcar
cpi a,1 ;NUMERI
jrnz due_ ;se non e` 1 salta
ldi tab,90 ;punta a 40h+27 dove comincia numeri
ldi nrcar,10 ;quantita` car numeri
due_ cpi a,2 ;ACCENTATE
jrnz tre_
ldi tab,100 ;punta a 40h+27+10
ldi nrcar,7 ;quantita` accentate
tre_ cpi a,3 ;PUNTEGGIATURA
jrnz qua_
ldi tab,107 ;punta a 40h+27+10+7
ldi nrcar,14 ;quantita` puntegg.
qua_ cpi a,4 ;LETTERE E NUMERI
jrnz cin_
ldi tab,40h ;punta inizio tabella alfabeto
ldi nrcar,36 ;quantita` lett. e num.
cin_ cpi a,5 ;COMPLETO
jrnz zero_
ldi tab,40h
ldi nrcar,57 ;totale caratteri
zero_ cpi a,6
jrnz okas
ldi tipcar,0 ;SOLO LETTERE
ldi tab,40h
ldi nrcar,26
okas ldi wdog,255
jrr 7,port_b,okas
jp casual
spclu ld a,lungo ;SPAZIO x CASUALE
space call delay
call delay
dec a
jrnz space
ret
subb ;DIVISIONE si entra con dividendo in DIV
;ritorna con DIV= a/DIV
clr x ;x=0
sub_ sub a,div
inc x
ldi wdog,255
cp a,div
jrnc sub_
ld rest,a ;resto
ld a,x
ld div,a ;risultato
ret
cw ;RISPONDE IN CW per wpm e comandi
;a= nr della tabella da prendere
ldi wdog,0feh
add a,tab
ld x,a
ld a,(x) ;punta a tab. numeri
cw2 ldi w,8
rlc a
jrc cerca0 ;se cy=1 allora cerca 0
cerca1 dec w
ld v,a
rlc a
jrnc cerca1
inc casu ;per casuale
jp cw_
cerca0 dec w
ld v,a
rlc a
inc test ;per casuale
jrc cerca0
cw_ ld a,v
rlc a
jrnc cort
ld v,a
ld a,lungo
jp calout
cort ld v,a
ld a,corto
calout call out
ld a,pausa
call space
dec w
jrz fine
jp cw_
fine ldi a,0ffh ;in comandi non compara dall' 1/4 e arriva a USC
ret
;CONVERTE ANALOGICO/DIGITALE PER VELOCITA`
anadig res 6,pdir_b ;mette a 0 bit 6 per impostare A/D pin9
ldi adcr,00110000b ;attiva A/D
attendi jrr 6,adcr,attendi
ld a,addr ;mette in a valore della conversione
set 6,pdir_b ;disattiva A/D del pin 9
ldi div,2 ;trova val di un punto
call subb
ld pausa,a
ld medio,a
ld a,ratiop
call ratok
ld a,ratiol
ratok
ldi div,10 ;prepara a dividere x 10
call subb ; ratio/10
ld v,a ;salva a in v=ratio/10
ld a,rest ;verifica se >2
cpi a,3
jrc minor3 ;se minore 3 salta
ldi div,3
call subb ;divide rest/3
ld y,a ;salva a in y=rest/3
minor3 ld a,v ; riprende ratio/10
cpi a,9 ;ver. se a < 9 salta e` ratio punto
jrc medx
ld a,medio
add a,medio ;in a= linea
add a,medio
ld w,a ;salva in w=linea
jp esegui
medx ld a,medio
esegui clr unita
ldi div,10 ;se ratiolinee decine=lungo/10
call subb
ld decine,a ;salva a in decine=medio/10
ld a,rest
cpi a,2
jrc minor2 ;se <2 salta
ldi div,2
call subb
ld unita,a ;unita=rest/2
minor2 ld a,v ;prende ratio/10
cpi a,9
jrnc suba9 ;salta se =>9 cioe` ratio linea
jp rat_cort ;altrimenti e` ratio punto
suba9 cpi a,10
jrnc subia
ret
subia subi a,9 ;rende ratio ok per calcoli
cpi a,2 ;non va meno di 2
jrnc calxa ;se e`>2 salta
ldi a,2
calxa ld v,a
call xadd ;v=decine*v =A*B
ld a,w ;carica a lungo
ldi div,2 ;prende 1/2 linea
call subb
add a,v ;1/2linea+(A*B)
add a,y ;+R2
add a,unita ;+R1 = nuovo lungo (durata linea)
cpi a,255
jrc okl ;se minore 255 salta
ldi a,255
okl ld lungo,a
ret
rat_cort call xadd
ld a,medio
ldi div,2 ;1/2 medio=1/2 punto
call subb
add a,v ;+A*B
add a,y ;+R2
add a,unita ;+R1 =nuovo corto (durata punto)
cpi a,12
jrnc okp ;se maggiore salta
ldi a,12
okp ld corto,a
ret
;MOLTIPLICAZIONE decine x v
xadd clr a
adda add a,decine
ldi wdog,255
dec v
jrnz adda
ld v,a ;salva in v=A*B
ret
rat_da ;LEGGE RATIO arriva da LeP + FUNZ.
res 5,pdir_b ;bit 5 pin 10 a 0 per A/D
ldi adcr,00110000b ;attivo A/D
atteso jrr 6,adcr,atteso ;aspetto conversione
ld a,addr ;mette in a ratio
set 5,pdir_b ;disattiva pin 5 per A/D
cpi a,90
jrc rat_pu ;se a<90 e` ratio punto
ld ratiol,a ;mette in ratiol(inea)
call ratok
ret
rat_pu ld ratiop,a
call ratok
ret
.block 64-$%64
let .byte 11110111b
.byte 11110111b ;ja jambic
.byte 00000010b ;nm no mem punto
.byte 11111000b ;sq squezze
.byte 11111000b ;sa semi automatico
.block 64-$%64
alfa .byte 11111101b ;a
.byte 00001000b ;b
.byte 00001010b ;c
.byte 00000100b ;d
.byte 11111110b ;e
.byte 11110010b ;f
.byte 00000110b ;g
.byte 11110000b ;h
.byte 11111100b ;i
.byte 11110111b ;j
.byte 00000101b ;k
.byte 11110100b ;l
.byte 00000011b ;m
.byte 00000010b ;n
.byte 00000111b ;o
.byte 11110110b ;p
.byte 00001101b ;q
.byte 11111010b ;r
.byte 11111000b ;s
.byte 00000001b ;t
.byte 11111001b ;u
.byte 11110001b ;v
.byte 00001100b ;z
.byte 00001001b ;x
.byte 00001011b ;y
.byte 11111011b ;w
.byte 00011111b ;=0
.byte 11101111b ;=1
.byte 11100111b ;=2
.byte 11100011b ;=3
.byte 11100001b ;=4
.byte 11100000b ;=5
.byte 00010000b ;=6
.byte 00011000b ;=7
.byte 00011100b ;=8
.byte 00011110b ;=9
.byte 11110101b ;ƒ
.byte 00001110b ;•
.byte 11110011b ;u`
.byte 11101101b ;a`
.byte 11100100b ;‚
.byte 00010100b ;‡
.byte 00011011b ;¤
.byte 11001100b ;?
.byte 00010010b ;/
.byte 00010110b ;)
.byte 00101101b ;(
.byte 11010101b ;.
.byte 11101110b ;'
.byte 00110011b ;,
.byte 00010001b ;bt
.byte 00111000b ;:
.byte 11001101b ;sottolineato
.byte 00100001b ;-
.byte 00010010b ;"
.byte 00101010b ;;
.byte 11101010b ;ar
;***************************************************************************
;* PROGRAMMA PRINCIPALE *
;***************************************************************************
main ldi tab,40h ;prepara per casuale tipo 0=solo lettere
ldi nrcar,26
clr tipcar
ldi tipo,1
ldi mode,3
ldi delai,50 ;parte qrq
ldi ratiop,48 ;parte con un ratio appena sotto il 50
ldi ratiol,145 ;parte con linea appena poco piu` lunga
call anadig ;legge potenziometro velocita`
paus
ld a,pausa
call space
call delay
taa
jrs 0,punto,punta ;salta a punta se punto=1
jrs 0,linea,line ;salta se linea non e` 0
jrs 1,punto,punta ;salta se punto=2
jrs 1,linea,line
call tasti
call anadig ;aggiorna lettura pot. VELO.
jrs 7,port_b,taa
asp jrr 0,port_a,qrs
jrr 1,port_a,com2
ldi wdog,255
jp asp
qrs ld a,delai
cpi a,100
jrz qrq
ldi delai,100
jp paus
qrq ldi delai,50
jp paus
com2
call comandi
clr punto ;azzera punto e linea
clr linea
jp paus
line ld a,lungo
clr tab ;per ricordare in OUT che e` linea
call out
clr linea
jrs 7,port_b,paus
ld a,punto
cpi a,0
jrnz jpau
; call decpu ;INCREMENTA VELOCITA`
; call decsp
; call decli
jp paus
jpau call rat_da ;call rati
jp paus
punta ld a,corto
ldi tab,0ffh ;per ricordare in OUT che e` punto
call out
clr punto
jrs 7,port_b,paus
ld a,linea
cpi a,0
jrnz jpaus
; call incpu ;DECREMENTA LA VELOCITA`
; call incsp
; call incli
jp paus
jpaus call rat_da ;aggiorna RATIO punto o linea
jp paus
;****************************************************************************
;* VETTORI DI INTERRUPTS *
;****************************************************************************
.org 0ff0h
jp ad_int ;INTERRUPT DEL CONV. A/D vector #4
jp tim_int ;INTERRUPT DEL TIMER vector #3
jp BC_int ;INTERRUPT PORTE A e B vector #2
jp A_int ;INTERRUPT PORTA A vector #1
.org 0ffch
jp nmi_int ;INTERRUPT NON MASCHERABILE vector #0
jp inizio ;INTERRUZIONE PER IL SETTAGGIO INIZIALE
;*****************************************************************************
.end ; Termine del programma