Para os amantes das transmissões em CW (o famoso ‘código Morse’ em transmissões), o incrível manipulador eletrônico criado pelo Sr. Steven T. Elliott em 1988, conhecido como “K8”, foi um salto tecnológico nestas transmissões, facilitando em muito as comunicações. Recentemente, foi me pedido sobre a possibilidade de mudar o modêlo do microcontrolador, para um mais atual, com memória flash. Veja o resultado….
Veja o esquema abaixo:
Podemos observar que o esquema, que não difere do original, exceto pela necessidade de colocar um pull up no pino 4. Foi dado opção de escolha entre o modelo 12f629 ou 12f675, bastando alterar comentando ou descomentando, no arquivo asm, e , em seguida, recompilar no MPLAB-IDE. Infelizmente, não tenho conhecimento de código ‘morse’,e portanto , ‘penei’ para entender a rotina (excelente, por sinal). Obtive a ajuda do Sr. João, profundo conhecedor da ‘arte’ do CW. O autor original também disponibilizou seu Email para eventuais dúvidas : email: steve@k1el.com or k1el@aol.com. Vários sites também poderão prover ajuda orientadoras para o uso deste dispositivo (aviso que eu não entendo).
Abaixo, segue os arquivos ASM e HEX compilados com o prefixo da estação original do autor. Servem para testes apenas.
Altere o prefixo para corresponder a sua estação no código ASM, na parte:
CALL_0 EQU M_P ;Coloque seu prefixo aqui, letra por letra (use sempre um M_ na frente da letra)
CALL_1 EQU M_Y ; não mais de 7 caracteres
CALL_2 EQU M_2
CALL_3 EQU M_M
CALL_4 EQU M_G
CALL_5 EQU M_END
CALL_6 EQU M_END
CALL_7 EQU M_END
SPEED_DEFAULT EQU WPM_15 ; E escolha aqui a velocidade padrão que usará nas comunicações
Depois recompile com o MPLAB-IDE para obter o arquivo HEX correto para sua estação.
Segue o arquivo ASM, de novembro de 2012 (obs. com bug ao enviar prefixo da estação em modo BEACON):
K8_629_ASM
Segue o arquivo HEX, de novembro de 2012, da compilação do ASM acima:
K8_629_HEX
Pasta zipada com algumas atualizações feitas em 10/03/2018, sendo corrigido o bug ao enviar prefixo da estação em modo BEACON):
K8_MAN_MORSE
Também, manipulador PIK adaptado para 12f675, de novembro de 2012 aqui.
Links técnicos:
datasheet Pic12f629
Curiosidades:
May Day
Titanic
Telegráfo e a previsão do tempo
Até o próximo artigo!!!
Olá Cláudio, bom dia.
Estou com o circuito idêntico ao seu aqui no Protoboard.
Resultado:
Na saída, pino 3, coloquei um buzzer.
Ao aterrar, via resistor 1k, o pino 6 ou 7 no buzzer sai um som constante, o que não é correto.
Exemplo do correto:
Aterrando-se o pino 6 deveria sai vários sons breves, dit dit dit dit….que são os pontos.
Aterrando-se o pino 7 devria sair vários sons longos, dah dah dah dah- – – -que são os traços.
Poderia ser o inverso, sem problema. Aí se mudaria a posição na chave, entendeu. O importante é que de um lado saia sons breves e do outro sons longos. O potenciômetro ajusta a velocidade desses sons.
Att,
João
Olá João!
Meio caminho andado…..
Cláudio
Olá João!
Consegui achar o asm original e esquema (pik). Abri no Mplab duas instâncias, sendo que em uma coloquei o projeto com o asm para o 12f508a e na outra, para o projeto 12f675/629. Fiz as modificações para adequar ao hardware interno do pic 12f629/675. Rodei em ambos em modo de simulação, e obtive resultados iguais. Montei o circuito original, que usa um capacitor de 4n7 junto ao resistor de 22k (ou potenciômetro). Observei as formas de onda com o osciloscópio e parecem reagir conforme o esperado. Este dispositivo não emite som para monitor, apenas chaveia o transmissor conforme os pontos e traços. Coloquei um ‘monitor’, ou seja, um pequeno ‘buzzer’ que apita se a saída estiver alta . Apertando uma tecla, o som no buzzer é curto, com espaçamento entre o próximo apito. Apertando a outra tecla, o período parece umas 3 vezes maior, com espaçamento do anterior. Apertando as duas teclas, intercala ora um ora outro. Experimente, por favor, pegando o arquivo aqui.
Cláudio
Olá Cláudio, boa noite.
Fico feliz pelos testes e resultados obtidos. Vou testar por aqui e te informo.
O autor do programa, datado de 2001, é o radioamador de indicativo VK1OD, nome Owen, da Austrália.
Att,
João.
Olá Cláudio, boa noite.
Fique tranquilo e valeu o esforço até aqui.
Vou continuar tentando;se conseguir algum sucesso de aviso.
Forte abraço e que Deus te ilumine sempre.
Att,
João.
Olá João!
Fiz uns testes e consegui aparentemente ter sucesso, mas como não tinha o 12f629 eu usei o 12f675. Mas creio que o hex deva funcionar também no 12f629.
Seria interessante, se você souber, citar o autor do programa original, pois ele merece os créditos.
Cláudio
Olá Cláudio, boa tarde.
Com ou sem capacior de 100k nos pinos 6 e 7 à terra não fez diferença. Com ou sem resistor de 10K no pino 4, também, não fez diferença. Mantendo os resistores de 1k nos pinos 6 e 7, ou diminuindo para 200R, também, não fez diferença.
Resultado:
1) Ao ligar o oscilador ele já fica emitindo pulsos, ou seja, no pino 3 tem tensão e não deveria ter.
A tensão no pino 3 só deve ocorrer quando aterrar o pino 6 ou 7. Se conseguir anular esta tensão no pino 3, quando em repouso, acredito que resolverá o problema.
3) os pinos 6 (breves) e 7 (longos) estão atuando.
2) O potenciômetro está atuando certindo, prá maior ou menor velocidade.
3) O resistor de 10k do VCC ao pino 4 não está surtindo efeito.
Conclusão: Ao ligar o oscilador ele não deve emitir nenhum sinal, ou seja, no pino 3 não deve ter tensão. A tensão no pino 3 só ocorrerá quando se aterrar os pinos 6 ou 7.
Att,
João
Olá João! Não tem jeito. Terei que montar em um protoboard para fazer testes. Mas não tenho disponibilidade no momento. Assim que tiver um tempinho vou fazer isto e se tiver sucesso te retorno.
Cláudio
Olá Cláudio.
Pino 2 : Do +5VCC para potenciômetro que vai ao pino 2. O potenciômetro altera velocidade dos pontos e traços.
Pino 3 : Saída. É ligado na base de um NPN com o emissor à terra. Quando a base recebe tensão o transmissor é ativado.
Pino 4 : Ligado a um capacitor de 1k à terra.
Pino 5 : Não usa
Pino 6 : Capacitor 100k à terra + resistor de 1K, sendo a outra extremidade do resistor ligada à chave que ao ser aterrada emite pulsos.
Pino 7 : Capacitor 100k à terra + resistor de 1K,
sendo a outra extremidade do resistor ligada à chave que ao ser aterrada emite pulsos.
OBS: As ligações acima são para o PIC12C509.
Att,
João
Olá João!
Olá João!
Então, realmente precisa dos pullups. Elimine para teste os 2 resisotres de 100k ao gnd. Mantenha a ligação a chave mas ao invés de resistor de 1k use de 220 ohms.
Coloque o resistor de 10k ao pino 4, o outro lado ao vcc. Mantenha o capacitor neste pino ao gnd. Use o hex obtido pelo programa abaixo, incluido no fim deste comentário.
asm:
AUTOR ORIGINAL : VKD10D OWEN (Austrália)
__CONFIG _MCLRE_OFF & _CP_ON & _WDT_OFF & _EXTRC_OSC_NOCLKOUT ;
LIST P=12f629
__IDLOCS h’1′
RADIX hex
ERRORLEVEL -302
#include
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
;port & flgs mask definitions
;these equates must be contiguous from 0
DITSW equ 0 ;dot switch (on paddle key)
DAHSW equ DITSW+1 ;dash switch (on paddle key)
IL equ DAHSW+1 ;iambic dash flag
IC equ IL+1 ;in character
AS equ 0x03 ;auto character spacing
TX equ 0x04 ;keying output
;timing calibration values
DAH equ 0xb5 ;counts for dah
DIT equ 0x3b ;counts for dit
REST equ 0x39 ;counts for dit rest
ASPACE equ 0x76 ;counts for char space
cblock 0x20 ;antes 07
flgs
timer1
paddle
endc
;======================================================================
org 0x0
goto start
data ‘P’,’I’,’K’,’ ‘,’V’,’1′,’.’,’1′,’4′
org 0x40 ;leave unprotected memory unused
;======================================================================
start
clrw ;initialise GPIO
movwf GPIO
BANK1
movlw ~(1<<TX) ;mask for TRIS for output pins
movwf TRISIO
bsf IOC,3 ;liga interrupção por mudança pino 4
bsf IOC,1 ;liga interrupção por mudança pino 6
bsf IOC,0 ;liga interrupção por mudança pino 7
bcf WPU,2 ;cancela pullup no pino 5
bcf WPU,4 ;cancela pullup no pino 3
bsf WPU,0 ;habilita pullup no pino 6
bsf WPU,1 ;habilita pullup no pino 6
;tris GPIO ;and activate outputs
movlw 0X00 ;setup the options bits
movwf OPTION_REG
;clrw ;setup the options bits
;option
BANK0
bsf INTCON,3
bsf INTCON,6
movlw 0X07
movwf CMCON ;DESLIGA COMPARADORES
movlw (1<<DAHSW|1<<DITSW) ;paddle pins
clrflgs
clrf flgs
;value used to jump into jump table
;bit use
;0 dit
;1 dah
;2 il
;3 ic
route
andwf GPIO,w ;or in the paddle
andlw 1<<DITSW|1<<DAHSW ;mask paddle bits
iorwf flgs,w ;or in the flgs
addwf PCL,f ;computed goto
jtable
goto dit
goto dah
goto dit
sleep
goto dah
goto dah
goto dit
sleep
goto dit
goto dah
goto dit
goto aspace
goto dah
goto dah
goto dit
goto aspace
aspace
clrf flgs
clrf paddle ;clear the paddle latch
comf paddle,f
movlw ASPACE ;prepare for end of character delay
call delay
movfw paddle ;get paddle latch
goto route
dit
bsf GPIO,TX ;tx hi
clrf paddle ;clear the paddle latch
comf paddle,f
movlw DIT ;prepare for dit
bsf flgs,IL ;iambic long flag
call delay ;and delay
nop
bcf GPIO,TX ;tx lo
btfsc GPIO,AS ;is autospace on
bsf flgs,IC ;set in character flag
movlw REST ;put element duration in W
call delay
movfw paddle ;get paddle latch
iorlw 1<<DITSW ;ignore dit bit
nop
goto route
dah
bsf GPIO,TX ;tx hi
clrf paddle ;clear the paddle latch
comf paddle,f
movlw DAH ;prepare for dah
bcf flgs,IL ;iambic long flag
call delay ;and delay
nop
bcf GPIO,TX ;tx lo
btfsc GPIO,AS ;is autospace on
bsf flgs,IC ;set in character flag
movlw REST ;put element duration in W
call delay
movfw paddle ;get paddle latch
iorlw 1<<DAHSW ;ignore dah bit
goto route
;======================================================================
;delays (spins) for number of clicks in reg W
;5 cycles per click, 2.0mS at 10KHz (10wpm)
delay
movwf timer1
movfw GPIO ;read paddle
andwf paddle,f ;latch paddle
decfsz timer1,1
goto $-3
retlw 0
;======================================================================
end
Gerou este hex:
:020000040000FA
:100000004028500049004B002000560031002E00CF
:040010003100340087
:10008000030185008316EF3085009615961416142B
:1000900015111512151495140030810083128B155B
:1000A0000B17073099000330A00105050339200420
:1000B0008207702880287028630080288028702894
:1000C000630070288028702869288028802870287C
:1000D0006928A001A201A20976308F2022085528A4
:1000E0000516A201A2093B3020158F200000051241
:1000F0008519A01539308F202208013800005528B5
:100100000516A201A209B53020118F2000000512AA
:100110008519A01539308F20220802385528A100F2
:0A0120000508A205A10B9028003489
:084000000000000000000100B7
:02400E00563F1B
:00000001FF
Cláudio