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!!!
Caro Cláudio bom dia.
Fiz diversas alterações. O que consegui foi aumentar o número de erros ou então manter os tres já existentes.
Estou tendo a liberdade de te enviar o programa, que é relativamente pequeno. Por favor, dê uma analisada. Segue abaixo: Att, João.
__CONFIG _MCLRE_OFF & _CP_ON & _WDT_OFF & _ExtRC_OSC
LIST P=12C508A,mm=on
__IDLOCS h’1′
RADIX hex
#include “p12C508A.inc”
;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 0x3 ;auto character spacing
TX equ 0x4 ;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 0x07
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
movlw ~(1<<TX) ;mask for TRIS for output pins
tris GPIO ;and activate outputs
clrw ;setup the options bits
option
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
Olá João! Parece que você nem dormiu pensando neste asm, não é verdade (risos)?
Assim que tiver um tempinho, irei ver se consigo, com meu parco conhecimento, te ajudar.
Cláudio
Olá João! Para o 12f508a ficou assim:
__CONFIG _MCLRE_OFF & _CP_ON & _WDT_OFF & _ExtRC_OSC
LIST P=12C508A,mm=on
__IDLOCS h’1′
RADIX hex
#include
;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 0x07
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
movlw ~(1<<TX) ;mask for TRIS for output pins
tris GPIO ;and activate outputs
clrw ;setup the options bits
option
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
Houve apenas pequenos erros de caracteres antigos.
o hex ficou assim:
:020000040000FA
:10000000400A500049004B002000560031002E00ED
:040010003100340087
:1000800040002600EF0C060040000200030C670051
:100090004601030E0701E201630A730A630A0300C3
:1000A000730A730A630A0300630A730A630A5C0A29
:1000B000730A730A630A5C0A670069006902760CB6
:1000C00082090902480A8605690069023B0C470556
:1000D00082090000860466066705390C8209090258
:1000E000010D0000480A860569006902B50C470445
:1000F00082090000860466066705390C8209090238
:10010000020D480A280006026901E802830A000875
:021FFE00E30FEF
:00000001FF
Agora, se for usar o 12f509 mudará o include apenas, assim:
__CONFIG _MCLRE_OFF & _CP_ON & _WDT_OFF & _ExtRC_OSC
LIST P=12C509,mm=on
__IDLOCS h'1'
RADIX hex
#include
;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 0x07
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
movlw ~(1<<TX) ;mask for TRIS for output pins
tris GPIO ;and activate outputs
clrw ;setup the options bits
option
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
O hex para o pic12f509 será este:
:020000040000FA
:10000000400A500049004B002000560031002E00ED
:040010003100340087
:1000800040002600EF0C060040000200030C670051
:100090004601030E0701E201630A730A630A0300C3
:1000A000730A730A630A0300630A730A630A5C0A29
:1000B000730A730A630A5C0A670069006902760CB6
:1000C00082090902480A8605690069023B0C470556
:1000D00082090000860466066705390C8209090258
:1000E000010D0000480A860569006902B50C470445
:1000F00082090000860466066705390C8209090238
:10010000020D480A280006026901E802830A000875
:021FFE00E30FEF
:00000001FF
Ou seja, o mesmo hex, pois não vi alteração.
Para usar o hex acima, copie em um arquivo de texto e salve com terminação ' .hex '. Ex meu_programa.hex ou o nome original se tiver.
Divirta-se!
Cláudio
Prezado Cláudio.
Até que tentei, mas não avancei em nada. Não detectei nenhuma linha repetida. Quanto a algum “;” que esteja faltando, se realmente está não sei como acertar.
Voce poderia dar uma olhada no ASM?
Att,
João
Caro Cláudio, boa noite e grato pela atenção.
Segue os eros:
Error[115] C:\TESTE\PIK.ASM 146 : Duplicate label (“ASPACE” or redefining symbol that cannot be redefined)
Error[115] C:\TESTE\PIK.ASM 154 : Duplicate label (“DIT” or redefining symbol that cannot be redefined)
Error[115] C:\TESTE\PIK.ASM 172 : Duplicate label (“DAH” or redefining symbol that cannot be redefined)
Att, João
Olá João!
Parece que temos ‘label’s duplicados em seu programa. O que são os ‘label’? São rótulos que damos a endereços das linhas do programa para facilitar a vida do programador.
Lembramos facilmente de nomes mas não de números.
Observe está porção de código abaixo:
MAIN ;<—–ISTO É UM 'LABEL' OU RÓTULO PARA O ENDEREÇO DA LINHA ( UM NOME FANTASIA PARA FACILITAR O PROGRAMADOR)
……..
LIGAR ; <—-ESTE TAMBÉM É UM 'LABEL'
BSF PORTA,0
GOTO SAIR ; <—-ESTE TAMBÉM É UM 'LABEL'
DESLIGAR ; <—-ESTE TAMBÉM É UM 'LABEL'
BCF PORTA,0
……….
SAIR ;<—-ESTE TAMBÉM É UM 'LABEL'
GOTO MAIN
Note que, se você declarar um mesmo ' label' em duas localizações do programa gerará o erro 115. Veja o exemplo abaixo:
pula4
goto main
pula5
goto ligar_equip
pula6
goto desligar_equip
pula4 ;<—————————————- temos um label repetido, irá gerar um erro 115
goto sair
O que fazer? Mudamos alguma coisa no label!!!
ex.
pula4
goto main
pula5
goto ligar_equip
pula6
goto desligar_equip
xpula4 ;<—————————————- acrescentei um 'x', mas poderia ser trocado por outra palavra qualquer inexistente no programa.
goto sair
Importante: Terá que saber quais partes do programa migravam para este label via os 'gotos' ou 'call' e também alterar da mesma forma.
ex.
goto pula4
ficará :
goto xpula4
Acontece muito isto quando fundimos pedaços de programa para formar um único programa.
Tente então, primeiramente, identificar se existe estes 3 label: ASPACE,DIT e DAH, repetidos em alguma parte do programa.
Pode até ser um comentário que perdeu o ';' e esta entrando para compilação.
Divirta-se
Cláudio
Caro Cláudio, boa noite.
Vira e volta estou por aqui com minhas dúvidas.
Estou com um Projeto que quero montar mas ao complilar o ASM apresenta três erros, consequentemente não gerando o HEX. O ASM é para o PIC12C508A e gostaria que fosse para 12C509 que é o que tenho aqui. Fiz a alteração no programa complilei mas os três erros continuam aparecendo.
Voce poderia dar uma analisada no ASM e tentar sanar esses três erros.
Antecipadamente fico-lhe grato.
Att,
João
Olá João!
Você poderia dizer quais os códigos de erro que está dando?
Cláudio
Caro Claudio, bom dia.
Grato pelo retorno. Vou continuar tentando alguma solução por aqui. Caso voce avance nos testes fico grato em me informar.
Att,
João.