MANIPULADOR ELETRÔNICO K8 – PARA OS AMANTES DO CW , ADAPTADO P/ VERSÃO COM PIC12F629 OU 12F675

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!!!

110 comments on “MANIPULADOR ELETRÔNICO K8 – PARA OS AMANTES DO CW , ADAPTADO P/ VERSÃO COM PIC12F629 OU 12F675

  1. 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

    1. 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

    2. 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

  2. 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

  3. 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

    1. 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

  4. 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

  5. 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.

Comments are closed.

Back To Top