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, boa tarde.
Sim, é um programa para chave iâmbica. Esta chave é bem simples, tendo o controle de velocidade por potenciômetro.
Tentei compilar, não consegui. Surgiram muitos erros.
At,
João
Caro Cláudio, boa noite.
O programa com o PIC12C509 que voce saneou está muito bom.
É possível e prático modificar o ASM para que possa ser gravado no PIC12F629, mantendo todas as funcionalidades do programa?
Att,
João.
Olá João!
Tem algumas diferenças entre os 2 modelos, como comparadores internos, posição inicial de ram, e registradores internos. Mas, creio que possa ser mais ou menos assim :
;__CONFIG _MCLRE_OFF & _CP_ON & _WDT_OFF & _ExtRC_OSC ;ORIGINAL
__CONFIG 0X3FC6 ; PARA OSCILADOR COM RESISTOR/CAPACITOR
;__CONFIG 0X3FC4 ; PARA OSCILADOR INTERNO DE 4MHZ
LIST P=12f629
__IDLOCS h’1′
RADIX hex
#include “p12f629.inc”
#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 0×03 ;auto character spacing
TX equ 0×04 ;keying output
;timing calibration values
DAH equ 0xb5 ;counts for dah
DIT equ 0x3b ;counts for dit
REST equ 0×39 ;counts for dit rest
ASPACE equ 0×76 ;counts for char space
cblock 0×20 ;antes 07
flgs
timer1
paddle
endc
;======================================================================
org 0×0
goto start
data ‘P’,’I’,’K’,’ ‘,’V’,’1′,’.’,’1′,’4′
org 0×40 ;leave unprotected memory unused
;======================================================================
start
clrw ;initialise GPIO
movwf GPIO
BANK1
movlw ~(1<<TX) ;mask for TRIS for output pins
movwf trisio
;tris GPIO ;and activate outputs
movlw 0x00 ;setup the options bits
movwf OPTION_REG
;clrw ;setup the options bits
;option
BANK0
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
Tente compilar e verifique se funciona pois não tive oportunidade de testar.
O que faz este circuito? Chave iambica?
Cláudio
Olá Cláudio, boa noite.
Tudo certinho, entendi sua explanação. Quanto ao MPASMWIN marquei o “case sensitive” e agora compilou sem problemas.
Muito bom mesmo, valeu de verdade seus ensinamentos.
Muito obrigado por estas valiosas informações.
Deus te abençoe sempre. Atenciosamente,
João.
Caro Cláudio, boa noite.
Desconsidere a mensagem anterior.
Beleza, consegui compliar com o MPLAB IDE. Ficou cem por cento.
Fico-lhe muito grato mais uma vez pela atenção e boa vontade em ajudar.
Deus te ilumine sempre e muito obrigado.
Att,
João.
Caro Cláudio, boa tarde.
Copiei o seu ASM conferi linha por linha com o meu ASM. Ao compilar com o MPASMWIN deu os mesmos tres erros e uma reportagem.
Fiz um teste com outro programa ASM, compilou certinho.
O que será que está ocorrendo. Se voce conseguiu compilar porque eu não consigo?
Att,
João.
Olá João!
É o mesmo programa que você me enviou? A únicas coisas que encontrei foi alguns caracteres diferentes apesar de semelhantes. Por exemplo, olhe na porção de código abaixo:
LIST P=12C508A,mm=on
__IDLOCS h’1′
RADIX hex
#include
Observe como é as aspas na linha __IDLOCS h’1′.
Mas se você digitar aspas fica assim __IDLOCS h’1′. Notou a diferença nelas ?
As notações hexas corretas aparecem em azul. Ex. 0x03 , h’1′, etc, tem que ficar em azul. Se ficar em vermelho está errado.
Também, observe como é o ‘x’ da porção de código abaixo:
AS equ 0×03 ;auto character spacing
TX equ 0×04 ;keying output
Mas se digitar, será assim ( olhe somente o x):
AS equ 0x03 ;auto character spacing
TX equ 0x04 ;keying output
Diferença sutil que estava dando erro ao tentar compilar.
Para facilitar, usei o recurso ‘replace’ na aba ‘edit’ e substitui todas estas ocorrências ‘estranhas’ de uma única vez do texto asm.
Daí compilou sem problemas. Talvez possa ser a versão do compilador, não sei.
Cláudio
Olá João! Esqueci um ponto. Verifique no mpasmwin se não está setado para diferenciar letras maiúsculas de minusculas . Se tiver, coloque para não diferenciar, pois no código tem locais que as letras foram escritas em maiúsculas e outros em minusculas. Veja o exemplo abaixo:
aspace ; <– aqui em minusculas
clrf flgs
clrf paddle ;clear the paddle latch
comf paddle,f
movlw ASPACE ;prepare for end of character delay ;<- aqui está em maisculas
call delay
Claudio
Olá João! Ultima forma. O Mpasmwin tem que diferenciar maiúsculas da minusculas, pois tem DIT equ 0x3b que é uma constante e ‘dit’ que é um label. Se ele não diferenciar, irá dar justamente os 3 erros que você reportou.
Cláudio
Olá João!
Antes que pergunte como mudar no MPASMWIN, vá na pasta que está instalado e abra-o diretamente, por clicar 2 vezes. Aparecerá a tela do MPASMWIN. Na parte esquerda encontrará uma caixa que pode ser ticada de nome ‘CASE SENSITIVE’. Se ticada, irá diferenciar de maiúsculas de minusculas. Depois feche o programa e tente recompilar seu arquivo pelo mplab_ide.
Cláudio