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

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

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

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

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

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

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

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

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

Comments are closed.

Back To Top