"Elbug", elektronisk telegrafnyckel.

Berätta om dina pågående projekt.
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 4812
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Mickecarlsson »

Tjusigt :tumupp:
Användarvisningsbild
petertub
Inlägg: 1047
Blev medlem: 21 september 2022, 15:59:11
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av petertub »

Snyggt !
Du har gått lödkursen ser jag dessutom.

Ha en trevlig helg och njut av ett gott arbete !
Användarvisningsbild
säter
Inlägg: 35150
Blev medlem: 22 februari 2009, 21:16:35
Ort: Säter

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av säter »

Marta skrev: 17 maj 2024, 19:07:28 Allting fungerar förutom den inverterade tonen. Det fick bli en avskuren ledare och en sladd.
Vad beror det på?
Felkonstruktion av kretskortet?
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7431
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Marta »

Det beror på att jag är gammal, trött och virrig. Pinnen som styr tonen har en inverteringsring, då skall den ha inverterad signal... Nej, det skall den inte, för den heter /Reset... Signalen skall vara rättvänd. Hade en fungerande krets på labplatta, men gjorde ändå detta misstag. Det kunde varit fler och värre fel, men det känns ju ändå förargligt.
Användarvisningsbild
Glenn
Inlägg: 36431
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Glenn »

Det måste alltid vara minst ett fel på alla kort man får hem, det är sen gammalt :)
opampen
Inlägg: 1828
Blev medlem: 16 november 2013, 18:59:54
Ort: Stockholm

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av opampen »

Jätte snyggt! Fina kort och ett bra arbete!

Men bry dig inte om den inverterade signalen! Tänk på att allt verkar för att funka i övrigt!
Användarvisningsbild
pi314
Inlägg: 7872
Blev medlem: 23 oktober 2021, 19:22:37
Ort: Stockholm

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av pi314 »

Glenn skrev: 18 maj 2024, 11:44:50 Det måste alltid vara minst ett fel på alla kort man får hem, det är sen gammalt :)
En kompis brukade säga:
Finns det inte en fix på kortet så är det inte testat ordentligt!

:tumupp:

Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7431
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Marta »

Här kommer en till konstruktion. Efter Keyer2 blir det Keyer3, som är lite modernare och bara fungerar med moderna sändare där en låg positiv spänning skall nycklas.

Den har givetvis Iambic A/B och Ultimatic samt mellanrum. 7+1 texter kan lagras på tillsammans c:a 240+80 tecken i EEPROM/RAM. Text sänds med en enkel knapptryckning. Felslag kan rättas utan att ta om allt från början. Växla paddlarna om det behövs. Till/från på såväl medhörning som utgång till tx. Hastigheten ställs med en riktig analog vridpot.

Den kan "säga" aktuell hastighet och batterstatus. Automatisk till/från, bara att börja sända och ingen knapp att glömma på så batterierna dras ur. Då det är programvara och nästan halva flash är oanvänt är där plats för utökning och förbättring.

Finns en fungerande prototyp på veroboard, skall bli ett riktigt kort när mönstret är validerat och alla detaljer klara. Är lite osäkert kring val av kontaktdon. Även medhörning som jag tycker knäpper för mycket.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
petertub
Inlägg: 1047
Blev medlem: 21 september 2022, 15:59:11
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av petertub »

Marta,
vad gör de 9 knapparna ? Jag trodde att en elbugg matades med ascii via rs.232
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7431
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Marta »

Knapparna är för att sända en llagrad text, eller göra inställningar. Ratten för att ställa in hur fort den skall sända.

När jag själv sänder med den används denna:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7431
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Marta »

Ni är väl såååååååååå nyfikna på den här också...

Kod: Markera allt

[mono]

*       16f684

        .pt pic-16


        .bc

 1      Vdd = + power
14      Gnd = - power, ground
13      ra0 = dit paddle
12      ra1 = dah paddle
11      ra2 = button group 0 input
 4 ra3/mclr = /reset
 3      ra4 = button group 1 input
 2      ra5 = button group 2 input
10  rc0/an4 = button group 0 output, battery test input
 9      rc1 = button group 1 output, battery test drive
 8      rc2 = button group 2 output, speed pot drive
 7  rc3/an7 = analog speed pot input
 6      rc4 = output to transmitter driver
 5 rc5/ccp1 = tone output

        .ec



        .or $0                  bank 0 sfr definitions

idata   .bs 1                   ind. adr data reg
tmr0    .bs 1                   timer 0
pcl     .bs 1                   program counter low
status  .bs 1                   status reg
iadres  *                       alternate name for fsr (indirect address pnt)
fsr     .bs 1                   file select reg (indirect adr reg)
porta   .bs 1                   port a data
        .bs 1
portc   .bs 1                   port b data
        .bs 2                   reserved
pclath  .bs 1                   program counter latch high
intcon  .bs 1                   master interrupt control
pir1    .bs 1                   peripheral interrupt register 1 (irq flags)
        .bs 1
tmr1l   .bs 1                   timer 1 low
tmr1h   .bs 1                   timer 1 high
t1con   .bs 1                   timer 1 control
tmr2    .bs 1                   timer 2
t2con   .bs 1                   timer 2 control
ccpr1l  .bs 1
ccpr1h  .bs 1
ccp1con .bs 1
pwm1con .bs 1
eccpas  .bs 1
wdtcon  .bs 1                   watchdog control
cmcon0  .bs 1
cmcon1  .bs 1
        .bs 3                   reserved
adresh  .bs 1                   upper bits of a/d
adcon0  .bs 1                   a/d config


        .or $80                 bank 1 sfr definitions
        .bs 1                   idata
option  .bs 1                   mixed options select reg
        .bs 1                   pcl
        .bs 1                   status
        .bs 1                   fsr
trisa   .bs 1                   port a tristate control
        .bs 1
trisc   .bs 1
        .bs 2                   reserved
        .bs 1                   pclath
        .bs 1                   intcon
pie1    .bs 1                   peripheral interrupt enable 1
        .bs 1                   reserved
pcon    .bs 1
osccon  .bs 1
osctune .bs 1
ansel   .bs 1
pr2     .bs 1
        .bs 2                   reserved
wpua    .bs 1
ioca    .bs 1
        .bs 2                   reserved
vrcon   .bs 1
eedat
eedata  .bs 1                   eeprom/flash-l data
eeadr
eeadres .bs 1                   eeprom/flash-l address
eecon1  .bs 1
eecon2  .bs 1
adresl  .bs 1                   lower bits of a/d
adcon1  .bs 1                  analog inputs config


z       .eq status*8+2          zero flag bit adr
cy      .eq status*8+0          carry flag bit adr
hc      .eq status*8+1          half carry
bsela   .eq status*8+5          bank select 0 bit adr
bselb   .eq status*8+6          bank select 1 bit adr
gie     .eq intcon*8+7          general interupt enable
peie    .eq intcon*8+6          peripheral interrupt enable
t0ie    .eq intcon*8+5          tmr0 interrupt enable
t0if    .eq intcon*8+2          tmr0 interrupt flag
t1ie    .eq pie1*8+0            tmr1 interrupt enable (bank 1)
t1if    .eq pir1*8+0            tmr1 interrupt flag
ra2ie   .eq intcon*8+4          ra2 interrupt enable
ra2if   .eq intcon*8+1          ra2 interrupt flag
iocif   .eq intcon*8+0          ioc interrupt flag
iocie   .eq intcon*8+3          ioc interrupt enable
adon    .eq adcon0*8+0          a/d enable
godone  .eq adcon0*8+1          a/d start, finished flag
tmr2on  .eq t2con*8+2           tmr2 on/off bit
eecon   .eq eecon1              prom control
.rd     .eq eecon*8+0           begin read, set to read
.wr     .eq eecon*8+1           begin write, set to write
.wren   .eq eecon*8+2           write enable, 1=enabled



inits   *                       initialization values
.trisa  .eq %_0011_1111         bank1 paddles + buttons + mclr as inputs
.trisc  .eq %_0000_1000         bank1 analog pot as input
.wpua   .eq %_0011_0111         bank1 wpu on paddles + buttons
.ioca   .eq %_0011_0111         bank1 ioc on paddles + buttons
*.ansel  .eq %_0010_1000         pot as analog, adc f/32
.ansel  .eq %_1000_0000         bank1 all but pot digital
.adcon0 .eq %_0001_1101         an7 input + adc on
.adcon1 .eq %_0101_0000         bank1 adc frequency f/32
        *                       for battery check
.triscb  .eq %_0000_1010         bank1 analog pot as input
.anselb  .eq %_1010_0000         bank1 all but pot digital
.adcon0b .eq %_0001_0101         an7 input + adc on



port
.dit    .eq porta*8+0           dit input bit
.dah    .eq porta*8+1           dah output bit
.btn0i  .eq porta*8+2           button groups inputs
.btn1i  .eq porta*8+4
.btn2i  .eq porta*8+5
.btn0o  .eq portc*8+0           button groups outputs
.btn1o  .eq portc*8+1
.btn2o  .eq portc*8+2
.pot    .eq portc*8+3           speed pot analog input
.txout  .eq portc*8+4           tx output
.tone   .eq portc*8+5           tone output


pdlmask .eq %_0000_0011         paddles bitmask
btnmask .eq %_0011_0100         buttons mask


        *                       a/d selections for adcon0
adpot   .eq %_0_0_00_11_01      read input from pot




******  banked ram allocations
*
        .or $20                 variables are placed in bank0


config  *                        saved config bytes
.mode   .bs 1
.charsp .bs 1
.setflg .bs 1
.modec  .bs 1
.charspc .bs 1
.setflgc .bs 1


speed   .bs 1                   speed in wpm
t1time  *                       tmr1 values for 1 unit
.low    .bs 1                   low byte
.high   .bs 1                   high byte
.top    .bs 1                   top byte for constant
.rem    .bs 1                   reminder/wkgreg for div8

mode    .eq config.mode         mode#
.dit    .bs 1                   dit first state
.dah    .bs 1                   dah first state
.iamba  .eq mode*8+0            bit0 automatically becomes an iambic a flag

charsp  .eq config.charsp       auto char space #
.state  .bs 1                   charsp. state
.achar  .eq charsp*8+0          those bits of number automatically becomes flags
.aword  .eq charsp*8+1


setflag .eq config.setflg       settings bit flags
        *                       flag addresses
.tone   .eq setflag*8+0         1=tone on
.tx     .eq setflag*8+1         1=tx output on
.pdlswp .eq setflag*8+2         1=swap paddles
.invout .eq setflag*8+3         1=inverted output
         *                      !! bit7 used for default settings
         *                      masks
.tonem   .eq %0000_0001         1=tone off
.txm     .eq %0000_0010         1=tx output off
.pdlswpm .eq %0000_0100         1=swap paddles
.invoutm .eq %0000_1000         1=inverted output

keyed   .bs 1                   the last sent code accumulates here
cmdnum  .bs 1                   command#
txcode  .bs 1                   code reg for autotx
autoact .bs 1                   action# after autotx char

powtim  .bs 1                   power timer

bpad
.0      .bs 1
.1      .bs 1
.2      .bs 1
.3      .bs 1
.4      .bs 1
.5      .bs 1

timer   .bs 1                   unit timer

pdltou  .bs 2                   paddle touch accumulator, nxt byte for first touch
.dit    .eq pdltou*8+0          bitflags for paddles
.dah    .eq pdltou*8+1
.firdit .eq pdltou+1*8+0        first unit of a char
.firdah .eq pdltou+1*8+1
pdlnow  .bs 1                   paddle positions now
.dit    .eq pdlnow*8+0          bitflags for paddles
.dah    .eq pdlnow*8+1
pdlent  .bs 1
.dit    .eq pdlent*8+0          bitflags for paddles
.dah    .eq pdlent*8+1






******  unbanked ram allocations
*
        .or $70                 variables are placed in common ram

pad00   .bs 1
pad0    .bs 1                   pad location, not for irq
pad1    .bs 1

intsav  *                       interrupt save
.a      .bs 1
.stat   .bs 1
.iadr   .bs 1


flag    .bs 1                   func bit flags
.config .eq flag*8+0            in config mode
.button .eq flag*8+1            for button decoding
.record .eq flag*8+2            record keyed chars
.stpdir .eq flag*8+3            last step direction
.local  .eq flag*8+4            local mode, always tone, no tx
.save   .eq flag*8+5            waiting for key to save to

state   .bs 1                   current state, 0=idle
.hold   .or 0
.idle   .bs 1                   idling
.dit    .bs 1                   sending plain dit
.dite   .bs 1                   ending plain dit
.dah    .bs 1                   sending plain dah
.dahe   .bs 1                   ending plain dah
.idit   .bs 1                   sending iambic a dit
.idite  .bs 1                   ending iambic a dit
.idah   .bs 1                   sending iambic a dah
.idahe  .bs 1                   ending iambic a dah
.ibdit   .bs 1                  sending iambic b dit
.ibdite  .bs 1                  ending iambic b dit
.ibdah   .bs 1                  sending iambic b dah
.ibdahe  .bs 1                  ending iambic b dah
.udit   .bs 1                   sending ultimatic dit
.udite  .bs 1                   ending ultimatic dit
.udah   .bs 1                   sending ultimatic dah
.udahe  .bs 1                   ending ultimatic dah
.uxdit  .bs 1                   sending ultimatic turnover dit
.uxdite .bs 1                   ending ultimatic turnover dit
.uxdah  .bs 1                   sending ultimatic turnover dah
.uxdahe .bs 1                   ending ultimatic turnover dah
.char   .bs 1                   char space
.word   .bs 1                   filling up to word space
.autodidah .bs 1                char element for autotx
.autotxe   .bs 1                ending autotx unit
.autochar  .bs 1                end of autotx char
.debounce  .bs 1                buttons debounce wait
        .or .hold









eepnt
.read   .bs 1
.write  .bs 1
.char   .bs 1

        .nt picwrite0.bin       input file name used by flasher
        .tf                     begin program file

        .or 0
        jmp start               reset vector
        nop                     fillers
        nop
        nop
        jmp irqrtn              irq vector



statjmp add pcl,a                       state machine dispatcher
        jmp dummy       idle            idling
        jmp dokeyup     dit             sending plain dit
        jmp dodite      dite            ending plain dit
        jmp dokeyup     dah             sending plain dah
        jmp dodahe      dahe            ending plain dah
        jmp dokeyup     idit            sending iambic a dit
        jmp doidite     idite           ending iambic a dit
        jmp dokeyup     idah            sending iambic a dah
        jmp doidahe     idahe           ending iambic a dah
        jmp dokeyup     idit            sending iambic b dit
        jmp doidite     idite           ending iambic b dit
        jmp dokeyup     idah            sending iambic b dah
        jmp doidahe     idahe           ending iambic b dah
        jmp dokeyup     udit            sending ultimatic dit
        jmp doudite     udite           ending ultimatic dit
        jmp dokeyup     udah            sending ultimatic dah
        jmp doudahe     udahe           ending ultimatic dah
        jmp dokeyup     utdit           sending ultimatic turnover dit
        jmp douxdite    utdite          ending ultimatic turnover dit
        jmp dokeyup     utdah           sending ultimatic turnover dah
        jmp douxdahe    utdahe          ending ultimatic turnover dah
        jmp dochar      char            char space wait
        jmp doword      word            filling up to word space wait
        jmp dokeyup     autotx          sendig autotx unit
        jmp doautotxe   autotxe         ending autotx unit
        jmp doautochar  autochar        end of autotx char
        jmp dodebounce  debounce        buttons debounce wait


dummy   rts                     dummy rtn


cmdtab  *                       commands in config mode
        add pcl,a
        jmp dummy
        jmp commands.info       7 speed, battery
        jmp commands.tx         4 y/n
        jmp commands.mode       1 none, iambic a/b, ultimatic
        jmp commands.record     8 record text
        jmp commands.swap       5 swap paddles y/n
        jmp commands.space      2 none, auto char, auto word
        jmp commands.exit       9 exit config mode
        jmp commands.invert     6 invert output y/n
        jmp commands.sound      3 y/n
        jmp dummy

*      1  2  3  4  5  6  7  8  9
*      6  3  0  7  4  1  8  5  2
*      7  4  1  8  5  2  9  6  3


     *  1 mode n/a/b/u
     *  2 space n/c/w
     *  3 sound y/n
     *  4 tx y/n
     *  5 swap y/n
     *  6 inv y/n
     *  7 s/b
     *  8 record
     *  9 command


rectab  *                       commands in recording mode
        add pcl,a
        jmp dummy
        jmp reccmd.save          7 save
        jmp reccmd.5bkfw         4 5bkfw
        jmp reccmd.1back         1 1back
        jmp reccmd.play          8 play
        jmp reccmd.insert        5 insert
        jmp reccmd.1play         2 1play
        jmp reccmd.end           9 end
        jmp reccmd.delete        6 delete
        jmp reccmd.1forw         3 1forw
        jmp dummy

*      1  2  3  4  5  6  7  8  9
*      6  3  0  7  4  1  8  5  2
*      7  4  1  8  5  2  9  6  3


     *  1 mode n/a/b/u
     *  2 space n/c/w
     *  3 sound y/n
     *  4 tx y/n
     *  5 swap y/n
     *  6 inv y/n
     *  7 s/b
     *  8 record
     *  9 command




        *                       chars used to indicate settings
chars   add pcl,a
        .rl bt %10100000        n
        .rl bt %01100000        a
        .rl bt %10001000        b
        .rl bt %00110000        u

        .rl bt %10100000        n
        .rl bt %10101000        c
        .rl bt %01110000        w
.mode   .eq 0
.char   .eq 4


nums    add pcl,a               chars used to sound numbers
        .rl bt %11111100        0
        .rl bt %01111100        1
        .rl bt %00111100        2
        .rl bt %00011100        3
        .rl bt %00001100        4
        .rl bt %00000100        5
        .rl bt %10000100        6
        .rl bt %11000100        7
        .rl bt %11100100        8
        .rl bt %11110100        9



autosent        *               actions when autotx ends
        lod a,autoact
        add pcl,a
        jmp autotx.finish       just end
        jmp autotx.ram          send from ram
        jmp autotx.rom          send from rom


******  initialization routine
*
start   *                       reset transfers here


        *                       scrub bank0 ram
        clf bsela               bank 0
        clf bselb
        lod a,#$20              get ram base
        lod iadres,a            point at first byte to scrub
.scrub  stz idata               clear a byte of ram
        inc iadres              pnt to nxt
        sbs iadres,7            at end?
        jmp .scrub              no-do nxt bt

        jsr getcfg              get settings
        sbs setflag,7           was there saved settings?
        jmp .nodef
        lod a,#1                set defaults
        lod mode,a
        lod a,#1
        lod charsp,a
        lod a,#setflag.tonem+setflag.txm
        lod setflag,a
.nodef  jsr setup               init calculated vars from settings

        .bc
        lod a,#state.idit
        lod mode.dit,a
        lod a,#state.idah
        lod mode.dah,a
        .ec

        *                       init ports
        lod a,#$07              shut down analog comparator
        lod cmcon0,a
        stz porta               make all output pins low
        stz portc
        sef bsela               bank1
        lod a,#inits.trisa      set port directions
        lod trisa,a
        lod a,#inits.trisc
        lod trisc,a
        lod a,#inits.ansel      select analog inputs, adclk=fosc/32
        lod ansel,a
        lod a,#inits.wpua       weak pull-ups on paddle
        lod wpua,a
        lod a,#inits.ioca       int on change on paddle
        lod ioca,a
        rmb option,7            enable wpu
        clf bsela               bank 0
        stz porta               redo after tris is set
        stz portc

        *                       prepare a/d
        sef bsela
        lod a,#inits.adcon1
        lod adcon1,a
        clf bsela
        lod a,#inits.adcon0
        lod adcon0,a

        *                       prepare for tone by using pwm odule
        lod a,#$0c              setup for pwm
        lod ccp1con,a
        lod a,#104/2
        lod ccpr1l,a
        sef bsela               bank1
        lod a,#104              about 600 hz tone
        lod pr2,a
        clf bsela               bank0
        lod a,#$02              /16 prescaler, tmr2 off
        lod t2con,a

        *                       check for and do master reset
        sfc port.btn0i          two reset buttons hold?
        jmp .nores
        sfc port.btn2i
        jmp .nores
        stz eepnt.write         yes, setup for eeprom reset
        stz pad0
.reset  lod a,#-1               get all bits set
        jsr eeprom.write        clear and inc
        dsz pad0                do all bits
        jmp .reset
        jmp @                   do forever
.nores

        *                       start up interrupts
        lod a,#$31              config tmr1
        lod t1con,a
        sef bsela               bank 1
        sef t1ie                set tmr1 interrupt enable flag
        clf bsela               bank0
        clf iocif               clear ioc flag
        sef iocie               enable ioc
        sef peie                enable peripheral interrupts
        clf t1if                clear tmr1 interrupt flag

        sef gie                 enable master interrupt flag
        jmp @                   do forever, all done as interrupts




******  interrupt routine
*
irqrtn  lod intsav.a,a          save accumulator
        swn a=status            nibble swap and get status
        lod intsav.stat,a       save status
        clf bsela               set bank0


        lod a,porta             get paddles
        lod pad00,a             keep them
        and a,#$fc              clear paddle bits
        sbr pad00,0             get tem swapped
        orr a,#$02
        sbr pad00,1
        orr a,#$01
        sfc setflag.pdlswp      set to swap?
        lod pad00,a             yes, store swapped


        sfc t1if                timer 1 int?
        jmp t1irq               yes

        *                       must be ioc, paddle or button
        *lod a,porta             get inputs
        *lod pad00,a             put it in memory
        lod a,pad00             get inputs
        clf iocif               clear intflag
        and a,#btnmask          buttons?
        eor a,#btnmask
        sfs z
        jmp entcmd              yes

        lod a,pad00             get back input
        and a,#pdlmask          mask out paddle bits
        eor a,#pdlmask          invert them so 1=pressed
        tfz pdltou              first touch?
        sfc z
        lod pdltou+1,a          yes, set first touch
        orr pdltou,a            accumulate paddle touch's
        lod a,state             idling?
        sfs z
        jmp .pdldon             no
        jsr begin               yes, begin a new char segment
        stz pdlent              never already pressed on first unit

.pdldon clf iocif               clear flag



irqdon  swn a=intsav.stat       nibble swap (undo prv swap) and get status
        lod status,a            restore status
        swn intsav.a            nibble swap..
        swn a=intsav.a          ..allowing restore by swn to preserve status
        rti                     irqrtn done

entcmd  *sfc flag.cmdmod         already in cmd mode?
        *jmp irqdon              yes, exit
        tfz state               idling?
        sfs z
        jmp irqdon              no, exit
        *sef flag.cmdmod         enter command mode
        lod a,#$fe              reload timer, short wait
        lod tmr1h,a
        stz tmr1l
        clf t1if                clr intflag
        lod a,#1                just 1 wait
        lod timer,a
        lod a,#state.debounce   start debounce wait
        lod state,a
        jmp irqdon              done


t1irq   *                       timer 1
        lod a,t1time.high       reload timer
        lod tmr1h,a
        lod a,t1time.low
        lod tmr1l,a
        clf t1if                clr intflag
        tfz timer               idling?
        sfc z
        jmp .idle               yes, do nothing but read pot
        stz powtim              clear power timeout
        dsz timer               count down unit timer
        jmp .speed              not expired, do nothing
        *lod a,porta             get present inputs
        lod a,pad00             get present inputs
        and a,#pdlmask          mask out paddle bits
        eor a,#pdlmask          invert them so 1=pressed
        lod pdlnow,a            store paddle positions
        lod a,state             do state machine
        jsr statjmp

.speed  sef port.btn2o          rise pot voltage
        nop                     give some time to settle
        nop
        sef godone              start conversion
.wait   sfc godone              a/d done?
        jmp .wait               no, wait
        clf port.btn2o          done, remove pot voltage
        lod a,adresh            get result
        lod pad00,a             set speed as result/8
        clf cy
        ror pad00
        clf cy
        ror pad00
        clf cy
        ror a=pad00
        add a,#5                minimum 5 wpm
        eor a,speed             changed?
        sfc z
        jmp irqdon              no, skip div8
        eor speed,a             set new wpm
        jsr div8                set timer init values
        jmp irqdon              done


.idle   lod a,#200              set fixed timer
        lod tmr1h,a
        stz tmr1l
        dsz powtim              count down power off timer
        jmp .speed              not expired
        slp                     power off and wait
        jmp irqdon              released by an irq, resume




******  begin a new char segment
*
begin
        lod a,t1time.high       reset timer..
        lod tmr1h,a
        lod a,t1time.low
        lod tmr1l,a
        clf t1if                ..and clr intflag

        lod a,#1                clear last keyed code
        lod keyed,a

        sfs pdltou.dit          dit touched?
        jmp .trydah             no
        lod a,mode.dit          state is dit
        jmp txdit               keydown and exit

.trydah sfs pdltou.dah          dah touched?
        rts                     no, do nothing
        lod a,mode.dah          state is dah
        jmp txdah               keydown and exit






******  turn on/off tx and tone
*
txon
        sfc flag.local          local mode?
        sef tmr2on              yes, force tone
        sfc setflag.tone        tone on?
        sef tmr2on              yes, turn on tone
        sfc flag.local          local mode?
        rts                     yes, no tx, done
        sfc setflag.tx          tx on?
        sef port.txout          yes, keydown tx
        rts                     done

txoff
        clf port.txout          keyup tx
        clf tmr2on              turn off tone
        rts                     done



txall   lod state,a             set state
        tfz state               idle?
        sfc z
        jmp charend             yes, do nothing
        eor a,#state.char       auto charspace?
        sfc z
        jmp txsp                yes
        eor a,#state.char       restore state
        sbr state,1             dit state, skip
        jmp txdah               it was a dah state

txdit   lod state,a             set state
        lod a,pdlnow            set paddle pos at entry
        lod pdlent,a
        lod a,#1                one time unit
        lod timer,a
        clf cy                  accumulate code
        rol keyed
        jmp txon                keydown and exit

txdah   lod state,a             set state
        lod a,pdlnow            set paddle pos at entry
        lod pdlent,a
        lod a,#3                three time units
        lod timer,a
        sef cy                  accumulate code
        rol keyed
        jmp txon                keydown and exit

txsp    lod a,#2                two more units of silence
        lod timer,a
charend
        sfc flag.record        record keyed chars?
        jmp record             yes, then exit
        rts                     no, just exit




******  routines for state machine
*       named as the corresponding state, preceeded with do
*
dokeyup *                       the keydown period has ended, unit space begins
        inc state               nxt state is always ending the unit
        lod a,#1                1 unit pause
        lod timer,a
        jmp txoff               keyup and exit

dochar  *                       char space has ended
        cla                     default to idle
        sfc pdltou.firdit       dit waiting? those two are mutually exclusive
        lod a,mode.dit          yes
        sfc pdltou.firdah       dah waiting
        lod a,mode.dah          yes
        sfs z                   paddle touched?
        jmp txall               yes, send the unit
        sfs charsp.aword        auto wordspace?
        jmp txall               no, end into idle
        lod a,#4                four more units
        lod timer,a
        lod a,#state.word       state is word space wait
        lod state,a
        rts                     done

doword  *                       word spacing has ended
        cla                     default to idle
        sfc pdltou.firdit       dit waiting? those two are mutually exclusive
        lod a,mode.dit          yes
        sfc pdltou.firdah       dah waiting
        lod a,mode.dah          yes
        jmp txall

        rts


**      a unit has ended, next unit starts

dodite
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlnow.dah          next may be dah
        lod a,#state.dah
        sfc pdlnow.dit          still dit?
        lod a,#state.dit        yes-keep it going
        stz pdltou              reset toush
        stz pdltou+1            also first toush
        jmp txall

dodahe
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlnow.dit          next may be dit
        lod a,#state.dit
        sfc pdlnow.dah          still dah?
        lod a,#state.dah        yes-keep it going
        stz pdltou              reset toush
        stz pdltou+1            also first toush
        jmp txall

doidite
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlent.dah
        sfs mode.iamba          mode a or b?
        jmp .iambb              it is b
        tfz pdlnow              in mode a, both released means stop
        sfc z                   both released?
        stz pdltou              yes, stop
.iambb  sfc pdlnow.dit          still dit?
        lod a,#state.idit       yes-keep it going
        sfc pdltou.dah          was dah touched?
        lod a,#state.idah       yes, switch to dah
        sfc pdlnow.dah          is dah hold?
        lod a,#state.idah       yes, switch to dah
        clf pdltou.dit          reset dit toush
        stz pdltou+1            also first toush
        jmp txall

doidahe
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlent.dit
        sfs mode.iamba          mode a or b?
        jmp .iambb              it is b
        tfz pdlnow              in mode a, both released means stop
        sfc z                   both released?
        stz pdltou              yes, stop
.iambb  sfc pdlnow.dah          still dah?
        lod a,#state.idah       yes-keep it going
        sfc pdltou.dit          was dit touched?
        lod a,#state.idit       yes, switch to dit
        sfc pdlnow.dit          is dit hold?
        lod a,#state.idit       yes, switch to dit
        clf pdltou.dah          reset dah toush
        stz pdltou+1            also first toush
        jmp txall

doudite
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlnow.dit          still dit?
        lod a,#state.udit       yes-keep it going
        sfc pdltou.dah          was dah touched?
        lod a,#state.uxdah      yes, switch to dah
        stz pdltou              reset toush
        stz pdltou+1            also first toush
        jmp txall

doudahe
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlnow.dah          still dah?
        lod a,#state.udah       yes-keep it going
        sfc pdltou.dit          was dit touched?
        lod a,#state.uxdit      yes, switch to dit
        stz pdltou              reset dah toush
        stz pdltou+1            also first toush
        jmp txall

douxdite
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlnow.dah          is dah pressed?
        lod a,#state.udah       yes, default to dah
        sfs pdlnow.dit          still dit?
        jmp .nodit
        lod a,#state.uxdit      yes-keep it going
        sfs pdlnow.dah          is dah pressed?
        lod a,#state.udit       no, state is first press dit
.nodit  stz pdltou              reset dit toush
        stz pdltou+1            also first toush
        jmp txall

douxdahe
        lod a,charsp.state      get default auto charspace or idle
        sfc pdlnow.dit          is dit pressed?
        lod a,#state.udit       yes, default to dah
        sfs pdlnow.dah          still dah?
        jmp .nodah
        lod a,#state.uxdah      yes-keep it going
        sfs pdlnow.dit          is dah pressed?
        lod a,#state.udah       no, state is first press dah
.nodah  stz pdltou              reset dit toush
        stz pdltou+1            also first toush
        jmp txall



record  jmp save2ram.input



******  setup timer start values and first state of a new char being keyed
*
setup   jsr div8                setup timer1 divisor for selected speed
        lod a,#state.idle       assume no charspace
        tfz charsp              use auto char?
        sfs z
        lod a,#state.char       yes
        lod charsp.state,a      set spacing state
        clf cy
        rol a=mode              *2
        lod pad0,a
        add a,pad0              *4
        add a,#1                +1
        lod mode.dit,a          set dit state
        add a,#2                dah is always two above
        lod mode.dah,a          set dah state
        rts


******  set timer1 start count from wanted speed in wpm
*       code from piclist.com
*       divides the divisor, that gives 1 wpm, with speed
*       complements the result as timer is an up counter
*
************************************************************
*Unsigned 24 bit by 8 bit divide routine
* This is basically Nikolai Golovchenko's
* Thanks to Nikolai for the original post.
** James Hillman, 2 December 2005
************************************************************
div8
        lod a,#$f0                      setup constant dividend 150000
        lod t1time.low,a                this is #tick/second times 1.2
        lod a,#$49                      divide by wpm gives divisor
        lod t1time.high,a
        lod a,#$02
        lod t1time.top,a
        stz t1time.rem     clrf    x+3          *remainder
        lod a,#24          movlw   d'24'
        lod pad0,a         movwf   counter

.nxt
        rol a=t1time.low   rlf     x,w      *shift dividend left to move next bit to remainder
        rol t1time.high    rlf     x+1,f    *
        rol t1time.top     rlf     x+2,f    *
        rol t1time.rem     rlf     x+3,f    *shift carry (next dividend bit) into remainder
        rol t1time.low     rlf     x,f      *finish shifting the dividend and save carry in x.0,
                         *since remainder can be 9 bit long in some cases
                         *this bit will also serve as the next result bit.

        lod a,speed        movf    y,w      *substract divisor from 8-bit remainder
        sub t1time.rem,a   subwf   x+3,f

        *here we also need to take into account the 9th bit of remainder, which
        *is in x.0. if we don't have a borrow after subtracting from
        *8 bits of remainder, then there is no borrow regardless of 9th bit
        *value. but, if we have the borrow, then that will depend on 9th bit
        *value. if it is 1, then no final borrow will occur. if it is 0, borrow
        *will occur. these values match the borrow flag polarity.

        sfc cy             btfsc   status,0  *if no borrow after 8 bit subtraction
        smb t1time.low,0   bsf     x,0       *then there is no borrow in result. overwrite
                          *x.0 with 1 to indicate no borrow.
                          *if borrow did occur, x.0 already
                          *holds the final borrow value (0-borrow,
                          *1-no borrow)

        sbs t1time.low,0   btfss   x,0       *if no borrow after 9-bit subtraction
        add t1time.rem,a   addwf   x+3,f     *restore remainder. (w contains the value
                          *subtracted from it previously)
        dsz pad0           decfsz  counter,f
        jmp .nxt           goto    loopu248

        not t1time.low                  complement divisor for timer1
        not t1time.high                 dont bother wit 2-komplement
*        inc t1time.low
*        sfc z
*        inc t1time.high

        rts                return


******                          transmits stored single char or text string
*
autotxchar
        jsr chars               get charcode and fall through

autotx  lod txcode,a            init code to send
        lod a,t1time.high       reset timer..
        lod tmr1h,a
        lod a,t1time.low
        lod tmr1l,a
        clf t1if                ..and clr intflag

        *lod a,#state.autodidah
.begin  lod a,#state.autotxe    state is autotxe to begin the char
        lod state,a
        lod a,#3                three units initial wait
        lod timer,a
        rts

        .bc
        clf cy
        rol txcode              test for word space
        tfz txcode
        sfs z
        jmp doautotxe.first     enter tx loop
        lod a,#4                word space, add 4 unit os silence
        jmp doautotxe.endw      set timer and state, exit
        .ec


**                              just finish sending
.finish stz state               state is idle
        sfc flag.config         config?
        rts                     yes
        sfc flag.record         record?
        rts                     yes
        clf flag.local          standard mode, clear local
        rts                     all done


**                              send from ram
.ramstart
*        lod a,#$40              set start adr
        lod iadres,a
        lod a,idata             load first char
        lod txcode,a
        jsr incram              nxt pos
        lod a,#1
        lod autoact,a
        jmp autotx.begin        start sending

.ram    lod a,#$70              failsafe
        eor a,iadres
        sfc z
        jmp doautotxe.stop
        lod a,idata             get char
        sfc z                   null is end
        jmp doautotxe.stop

        lod txcode,a
        jsr incram              nxt adr
        lod a,#%00100100
        eor a,txcode
        sfc z
        jmp .word

        jmp doautotxe           continue sending


**                              send from rom
.romstart
        *lod a,#0
        *lod eepnt.read,a
        jsr eeprom.read         load first char
        lod txcode,a
        inc eepnt.read          nxt pos
        lod a,#2
        lod autoact,a
        jmp autotx.begin        start sending


.rom
        jsr eeprom.read         get char
        inc eepnt.read          nxt adr
        orr a,#0
        sfc z                   null is end
        jmp doautotxe.stop
        *jmp .finish             at end, finish
        lod txcode,a
        eor a,#%00100100
        sfc z
        jmp .word
        jmp doautotxe           continue sending

.word   lod a,#4                fill up to 7 units pause for word space
        jmp doautotxe.endw


doautotxe
        clf cy
        rol txcode              shift out a unit
        tfz txcode
        sfc z                   at end?
        jmp .end                yes
.first  lod a,#state.autodidah  state is autodidah
        sfc cy                  dit or dah?
        jmp txdah
        jmp txdit

.stop   stz autoact             action is none
.end    lod a,#2                charspace, two more units silence
.endw   lod timer,a
        lod a,#state.autochar   state is autochar
        lod state,a
        rts                     done

doautochar
        tfz pdltou              touched?
        sfs z
        jmp .stop               yes, stop sending
        lod a,autoact           get action#
        jmp autosent            do it
.stop   stz autoact             stop sending
        stz state               state is idle
        stz pdltou              clear the touch
        jmp autotx.finish       stop sending





******                          button debounce wait has ended
*
dodebounce
        stz state               state is idle
        jsr getbtn              scan buttons
        add a,#1                make it 1-relative

        sfc flag.save           waiting for save key??
        jmp txt2prom            yes, save at selected key

        sfc flag.record         recording mode?
        jmp rectab              yes, do the rec command

        sfc flag.config         config mode?
        jmp cmdtab              yes, do the config command

        eor a,#7                enter command mode?
        sfc z
        jmp .entcfg             yes
        eor a,#7                get back btn

        eor a,#4                enter command mode?
        sfc z
        jmp .txram              yes
        eor a,#4                get back btn

        jsr eescan
        sfc z
        jmp autotx.romstart

        lod a,#%00110010
        jmp autotx



.entcfg sef flag.config         enter config mode
        sef flag.local          local sounding
        stz cmdnum              clear prev command
        lod a,#%01010000        get r
        jmp autotx              sound it and done

.txram  lod a,#$40
        jmp autotx.ramstart



******  do a command
*
commands

**      step between modes
.mode
        eor cmdnum,a            first keypress?
        lod cmdnum,a            set last cmdnum
        sfc z                   first keypress, no change
        inc mode                nxt mode
        sbr mode,2              four means rollover to zero
        stz mode
        jsr setup               set initial states for dit/dah
        lod a,mode              get current mode
        jsr chars               get indicator char
        jmp autotx              sound it and exit

**      step between word spaces
.space
        eor cmdnum,a            first keypress?
        lod cmdnum,a            set last cmdnum
        sfc z                   first keypress, no change
        inc charsp              nxt alternative
        lod a,charsp            rollover?
        sur a,#2
        sfs cy
        stz charsp              yes
        jsr setup               set state following a keyed char
        lod a,charsp            get setting
        add a,#chars.char       add offset to indicators
        jsr chars               get indicator
        jmp autotx              sound it and exit

        *jmp autotx.ramstart

**      turn buzzer on/off
.sound
        eor cmdnum,a            same as last?
        lod cmdnum,a            set last cmdnum
        lod a,#setflag.tonem    get bitmask for tone
        jmp .toggle             do toggle

**      turn tx on/off
.tx
        eor cmdnum,a            same as last?
        lod cmdnum,a            set last cmdnum
        lod a,#setflag.txm      get bitmask for tx
        jmp .toggle             do toggle

**      swap paddles
.swap
        eor cmdnum,a            same as last?
        lod cmdnum,a            set last cmdnum
        lod a,#setflag.pdlswpm  get bitmask for inverted paddles
        jmp .toggle             do toggle

**      invert tx output, removed, burns power when off
.invert
        eor cmdnum,a            same as last?
        lod cmdnum,a            set last cmdnum
        lod a,#setflag.invoutm  get bitmask for inverrted tx
        jmp .toggle             do toggle

**      tell speed and battery status
.info   * 45 512  2 batt 31 540 3 batt

        lod a,#$af              point close to end of ram
        lod iadres,a
        stz idata               truncate evental long text
        inc iadres

        lod a,speed             get speed
        jsr .putnum             put as morse
        inc iadres              keep word space

        jsr ckbatt              get battery status
        lod a,pad0
        jsr .putnum             put as morse

        jsr findblank           get first blank
        lod a,eepnt.read
        sur a,#$fb              subtract from available space
        add a,#-80              over 80?
        sfs cy
        jmp .not80              no
        stz idata               yes, put end marker
        jmp .txinfo

.not80  add a,#80               was short, get back length
        inc iadres              keep word space
        jsr .putnum             put as morse
        stz idata               put end marker

.txinfo lod a,#$b0              sound it locally
        jmp autotx.ramstart


**      enter recording mode
.record jmp save2ram.start      init recording

**      exit config
.exit
        jsr savcfg
        clf flag.config         exit config mode
        *clf flag.local          exit local sounding
        lod a,#%01010100        get +
        jmp autotx              sound and exit


**      utility, toggle 1-bit setting
.toggle sfc z                   first keypress, no change
        eor setflag,a           do toggle
        and a,setflag           test status
        lod a,#%10111000        assume on, get y
        sfc z                   on or off?
        lod a,#%10100000        was off, get n
        jmp autotx              sound it and done


.putnum *                       perform simple div by 10
        stz idata               used for quotingent
.nxt    inc idata               bump it
        add a,#-10              subtract 10
        sfc cy                  turn over?
        jmp .nxt                no, go on
        dec idata               yes, undo last sub
        add a,#10
        jsr nums                reminder to morse
        lod pad0,a
        lod a,idata             quot to morse
        jsr nums
        lod idata,a
        inc iadres
        lod a,pad0
        lod idata,a
        inc iadres
        lod a,#%00100100
        lod idata,a             end marker
        rts


******  recording commands
*
reccmd

.1back  clf flag.stpdir         set last dir
        jsr decram              1 back, fallthrough and play
.1play  lod a,idata             get char at current pos
        jmp autotx              play one char, no move
.1forw  sef flag.stpdir         set last dir
        tfz idata               at end?
        sfs z                   yes, no inc
        jsr incram              1 forw..
        jmp .1play              .. and play

.5bkfw  sfs flag.stpdir         what direction?
        jsr decram5
        sfc flag.stpdir
        jsr incram5
        jmp .1play

.insert jmp insert
.delete jmp delete

.play
        lod a,#$40              get start adr
        jmp autotx.ramstart     start playing

.save   sef flag.save           setup for save
        lod a,#%01000000        sound a dit and exit
        jmp autotx


.end
        clf flag.record         exit record
        clf flag.config         exit config
        lod a,#%01010100        sound +
        jmp autotx






save2ram

.start  lod a,#$40              set start adr
        lod iadres,a
        sef flag.record         setup for input
        lod a,#%11100010        send col and finish
        jmp autotx

.input  *                       adjust received char for autotx
        lod a,idata             keep char at current pos
        lod pad1,a
        sef cy                  get end bit
.nxt    rol keyed               shift in
        sfc cy                  char in position?
        jmp .adjdon             yes, adj done
        clf cy                  fill with zeroes
        jmp .nxt                do nxt bit
.adjdon lod a,keyed             get adj char
        lod idata,a             save it
        jsr incram              inc and adjust ram adr
        tfz pad1                was an end mark overwritten?
        sfc z                   no, leave nxt char as is
        stz idata               yes, put a new end marker
        lod a,#$bf              end of ram?
        eor a,iadres
        sfs z
        jmp .done               no done
.end    stz idata               always end mark
        clf flag.record
        lod a,#%01010100        send + as and marker
        jmp autotx

.done   *lod a,#%01000000
        *jmp autotx
        stz state
        rts

incram5 jsr incram              4+1 pos forward
        jsr incram
        jsr incram
        jsr incram
incram  tfz idata               at end?
        sfc z
        rts                     yes, no inc
        inc iadres              nxt pos
        lod a,#$70              bank turnover reached
        eor a,iadres
        lod a,#0                assume no turnover
        sfc z                   at turnover?
        lod a,#$30              yes, get skip distance
        add iadres,a            do ev. skip
        lod a,#-$bf             end of ram?
        add a,iadres            cy set if so
        lod a,#$bf              stop overflow
        sfc cy
        lod iadres,a
        rts

decram5 jsr decram              4+1 pos backward
        jsr decram
        jsr decram
        jsr decram
decram  dec iadres              prev pos
        lod a,#$9f              bank turnover reached
        eor a,iadres
        lod a,#0                assume not at turnover
        sfc z                   at turnover?
        lod a,#$-30             yes, get skip distance
        add iadres,a            do ev. skip
        lod a,#-$40             before beg of ram?
        add a,iadres            cy not set if so
        lod a,#$40              stop underflow
        sfs cy
        lod iadres,a
        rts

insert  lod a,iadres            keep current pos
        lod bpad.2,a
        lod a,#%10000110        set filler
        lod bpad.0,a
.nxt    lod a,idata             get current char
        lod bpad.1,a              keep it
        lod a,bpad.0              get prev char
        lod idata,a             put it as new char
        sfc z                   was it zero?
        jmp .end                yes, done
        lod a,bpad.1              get kept char
        lod bpad.0,a              put it as new previous
        jsr incram              nxt pos
        sfs cy                  at end of ram
        jmp .nxt                no, do nxt
        stz idata               force end
        lod a,#%01010110        sound . as overflow marker
        jmp autotx
.end    lod a,bpad.2            restore pos
        lod iadres,a
        lod a,idata             get current char
        jmp autotx              sound it and done


delete  lod a,iadres            keep current pos
        lod bpad.2,a
        eor a,#$40              on very first pos?
        sfc z
        stz idata               yes, clear text

.nxt    tfz idata               on end mark?
        sfc z
        jmp .end                yes, done
        jsr incram              nxt pos
        lod a,idata             get char
        lod bpad.0,a            keep it
        jsr decram              prev pos
        lod a,bpad.0            get char
        lod idata,a             put it
        jsr incram              nxt pos
        jmp .nxt                do nxt char
.end    lod a,bpad.2            restore pos
        lod iadres,a
        lod a,idata             get current char
        jmp autotx              sound it and done


txt2prom *                      copy text to eeprom
        clf flag.save           clear save flag
        lod bpad.0,a            keep pressed key
        eor a,#7                key7 is no no
        sfc z
        jmp .error
        eor a,#3                same goes for 4, yes 3 is 4 eor 7
        sfc z
        jmp .error

        lod a,bpad.0            get wanted txt#
        jsr eescan              already used?
        sfc z
        jsr eeremove            yes, remove it

        jsr findblank
        sfc z                   busted?
        jmp .busted             yes

        stz pad0                init limit count
        lod a,eepnt.read        set start adr
        lod eepnt.write,a
        lod a,#$40              set start adr in ram
        lod iadres,a
        tfz idata               text present?
        sfc z
        jmp .end                no, just exit with prev text cleared
        lod a,bpad.0            get key
        jsr eeprom.write        write text id
        eor a,#$fb              hit end?
        sfc z
        jmp .busted             yes, busted
.nxt    lod a,idata             get char
        jsr eeprom.write        write it
        eor a,#$fb              hit end
        sfc z
        jmp .busted             yes, busted
        lod a,idata             at end?
        sfc z
        jmp .end                yes
        jsr incram              nxt pos
        dsz pad0                eeprom safety count
        jmp .nxt                do nxt
    *    rts
.end    lod a,#-1
        jsr eeprom.write        put end marker
        lod a,#%01010100
        clf flag.record
        clf flag.config
        jmp autotx

.error  lod a,#%00110010
        jmp autotx

.busted lod a,#0                force end
        jsr eeprom.write
        lod a,#%10001000
        clf flag.record
        clf flag.config
        jmp autotx


findblank
        stz eepnt.read          find first blank
.nxtbl  jsr eeprom.read         read char
        eor a,#-1               blank?
        sfc z
        jmp .blank              yes
        inc eepnt.read          no, try nxt
        lod a,#$fb              at end?
        eor a,eepnt.read
        sfc z
        rts
        jmp .nxtbl
.blank  lod a,#$fb              busted?
        eor a,eepnt.read
        rts





******  find first unused, or start of a text, in eeprom
*
eescan  lod eepnt.char,a        set text# to scan for
        stz pad0                init limit count
        stz eepnt.read          start from beginning
.nxt    jsr eeprom.read         get char
        inc eepnt.read          pnt at nxt
        eor a,eepnt.char        found?
        sfc z
        rts                     yes, done
.nxt0   jsr eeprom.read         get char
        inc eepnt.read          nxt adr
        orr a,#0                test for zero
        sfc z
        jmp .nxt                found, try text#
        dsz pad0                limit count
        jmp .nxt0               try nxt
        clf z
        rts                     stop at limit


.endpos stz pad0                init limit count
        stz eepnt.read          start from beginning
        dec eepnt.read
.nxtend inc eepnt.read
        jsr eeprom.read         read from eeprom
        eor a,#-1               found blank?
        sfc z
        rts                     yes, done
        dsz pad0                limit count
        jmp .nxtend             do nxt
        rts                     at limit, done


eeremove
        dec a=eepnt.read        get first adr in txt to delete
        lod eepnt.write,a       set it as write adr
        stz pad0                init limit count
.skip   jsr eeprom.read         read prom
        inc eepnt.read          nxt adr
        orr a,#0                test for zero
        sfs z
        jmp .skip               found zero = end of text
.nxtmov jsr eeprom.read         read char
        lod pad1,a
        jsr eeprom.write        write and auto inc
        inc eepnt.read          inc read adr
        inc a=pad1              at blank = -1?
        sfc z
        rts                     yes, done
        dsz pad0
        jmp .nxtmov             no, move nxt
        rts                     fail, eeprom protection break




******  scan buttons and get result in a, 9=fail
*
getbtn
        stz pad1                clr button counter
        sef port.btn1o          raise lin 1 and 2
        sef port.btn2o
        jsr .test               test line 0
        sfc flag.button
        jmp .end                found, end it
        sef port.btn0o          test line 1
        clf port.btn1o
        jsr .test
        sfc flag.button
        jmp .end
        sef port.btn1o          test line 2
        clf port.btn2o
        jsr .test
.end    clf port.btn0o          lower all lines
        clf port.btn1o
        clf port.btn2o
        lod a,pad1              get result
        rts                     all done

.test   sef flag.button         assume found
        sfs port.btn0i          pressed?
        rts                     yes, test done
        inc pad1                no, inc to nxt button
        sfs port.btn1i          do nxt...
        rts
        inc pad1
        sfs port.btn2i
        rts
        inc pad1
        clf flag.button         test failed
        rts


eeprom
.write  sef bsela       banksel eecon1
        lod eedata,a    set data
        lod a,eepnt.write
        inc eepnt.write
        lod eeadres,a   set address
        sef eecon.wren  bsf eecon1,wren ;enable write
        *               bcf intcon,gie ;disable ints
        *               btfsc intcon,gie ;see an576
        *               goto $-2 ;
        lod a,#$55      movlw 55h ;unlock write
        lod eecon2,a    movwf eecon2 ;
        lod a,#$aa      movlw aah ;
        lod eecon2,a    movwf eecon2 ;
        sef eecon.wr    bsf eecon1,wr ;start the write
        *               bsf intcon,gie ;enable int
        sfc eecon.wr
        jmp @-2
        clf eecon.wren
        inc eeadr
        lod a,eeadr     return nxt free adr
.ret    clf bsela
        rts
.read   sef bsela
        lod a,eepnt.read
        *inc eepnt.read
        lod eeadres,a
        sef eecon.rd
        lod a,eedata
        jmp .ret


ckbatt
        sef bsela
        lod a,#inits.anselb
        lod ansel,a
        lod a,#inits.triscb      bank1 analog pot as input
        lod trisc,a
        clf bsela
        lod a,#inits.adcon0b     an4 input + adc on
        lod adcon0,a
        sef port.btn0o          rise battery test voltage
        jmp @+2                     give some time to settle
        jmp @+2
        jmp @+2
        jmp @+2
        jmp @+2
        sef godone              start conversion
.wait   sfc godone              a/d done?
        jmp .wait               no, wait
        lod a,adresh            get result
        lod pad0,a
        sef bsela
        lod a,#inits.ansel
        lod ansel,a
        lod a,#inits.trisc      bank1 analog pot as input
        lod trisc,a
        clf bsela
        clf port.btn0o          remove test voltage
        lod a,#inits.adcon0     an7 input + adc on
        lod adcon0,a
        rts


getcfg  lod a,#$fd              get cfg eeprom adr
        lod eepnt.read,a
        jsr eeprom.read         get it
        lod config.mode,a       save it
        lod config.modec,a
        inc eepnt.read          nxt pos
        jsr eeprom.read         get it
        lod config.charsp,a     save it
        lod config.charspc,a
        inc eepnt.read
        jsr eeprom.read         get it
        lod config.setflg,a     save it
        lod config.setflgc,a


savcfg  lod a,#$fd              get cfg eeprom adr
        lod eepnt.write,a
        lod a,config.mode
        eor a,config.modec
        lod a,config.mode
        sfs z
        jsr eeprom.write
        lod a,#$fe              get cfg eeprom adr
        lod eepnt.write,a
        lod a,config.charsp
        eor a,config.charspc
        lod a,config.charsp
        sfs z
        jsr eeprom.write
        lod a,#$ff              get cfg eeprom adr
        lod eepnt.write,a
        lod a,config.setflg
        eor a,config.setflgc
        lod a,config.setflg
        sfs z
        jsr eeprom.write
        rts

        .bc
config  *                        saved config bytes
.mode   .bs 1
.charsp .bs 1
.setflg .bs 1
.modec  .bs 1
.charspc .bs 1
.setflgc .bs 1
        .ec


key2binx lod a,#1
        rts




        .bs 64-@\64

        .en


[/mono]
Användarvisningsbild
petertub
Inlägg: 1047
Blev medlem: 21 september 2022, 15:59:11
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av petertub »

Marta,

du har fallenhet för sådant, klart värt 572B x 2

Jag letar vidare.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7431
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Marta »

Så har då korten till Keyer3 levererats från China och ett är monterat och klart. Till den här blev mönstret rätt. Istället blev det problem med piezobrickan för medhörning.

Den första på veroboard har en piezo inbyggd i en plastklump som tar upp kortyta och ljudstyrkan är på gränsen till acceptabelt. På den är det 3.5mm kontaktdon och den använder intern pull-up i MCU'n. Den har även en strömbrytare.

Den här har 1/4" kontakter och extern pull-up så inga oskyddade MCU-pinnar ansluts utåt. Det blir 4 motstånd som tar upp plats. Den liggande stiftanslutningen som lådan skall ha hål för är också skrymmande. Ingen brytare, det sparar en hel del yta. MCU ställs i viloläge efter några sekunder och drar då endast någon µA. Den startar sedan omärkligt snabbt.

I min okunskap trodde jag en lös piezobricka skulle ge kraftigare ljud och dessutom kan den monteras ovanför nämnda motstånd. Resultatet blev en knappt hörbar viskning. Så nu är frågan hur det skall lösas? En dynamisk minihögtalare skulle troligen fungera, men är stor och drar betydligt mer ström. En större pieobricka borde flytta mer luft, men måste nog monteras på kortets undersida, ner mot lådans botten. Annan frekvens skall provas, men den får inte bli gäll och skrikig.

Tillägg:
Den här stora piezobrickan måste väl höras betydligt bättre. Är här någon som har provat den?
https://www.electrokit.com/piezoelement-35mm-7bb-35-3
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
opampen
Inlägg: 1828
Blev medlem: 16 november 2013, 18:59:54
Ort: Stockholm

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av opampen »

Bra! Roligt att den är i gång nu!

Trevligt att du använder hålmonterat!
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7431
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: "Elbug", elektronisk telegrafnyckel.

Inlägg av Marta »

Där återstår att få till medhörningen. Har beställt några olika alternativ som skall testas. Antagligen skulle det behövas ett nytt kort för att bli riktigt bra. Skall testa en lite större piezobricka och en riktigt stor, samt ett par inkapslade varianter.

Återstår även att cadda en låda och testas hur den blev. Lådan till bygget på vero blev inte bra. Är svårt att ta av och sätta på locket. Min 3D klarar små överhäng mycket bättre än jag trodde, så det skall bli ett helt annat fäste nu.

Hålmontering har definitivt sina fördelar för enhänta invalider. Det blir lätt att få knapparna i en fin rak linje och allt tar mycket mindre tid. För enhänta är det många moment att montera en SMD, där Ni tvåhänta enkelt kan hålla den med en pincett måste jag ställa en hållare på plats. Ett väldigt flaxande med den enda handen...
Skriv svar