Rádio Valvulado - Preciso de Ajuda

Started by Fauzi, 04 de September de 2021, as 23:58:13

Previous topic - Next topic

Fauzi

*
Iniciante
Posts: 24
Logged
#15
Obrigado, vou ver os vídeos do Mauro (não sabia desse canal). Talvez me aventure a tentar a calibrar usando esses geradores de RF on-line, usando o PC, ou mesmo algum app de celular. Pior que tá não deve ficar. Se conseguir ajustar as faixas de ondas curtas já estará bom. Em último caso talvez em mande pra alguém habilitado pra fazer. Aqui na minha cidade não tem ninguém.
Vou tentar postar uma foto das bobinas de FI apenas pra curiosidade. Estou usando o postimage, no item de "miniaturas para foruns". Não sei se vão ficar no tamanho exigido pelo fórum. Queira me desculpar caso alguma coisa fique fora das normas.


xformer

Administrator
******
DIY Freak
Posts: 6,396
e^(i x pi)+1=0
Logged
Eu uso este hospedeiro de imagens:

http://www.hostcgs.com.br/hostimagem/index.php

Um gerador de RF (rádio frequência) fornece sinais de alta frequência (na faixa das centenas de quilohertz e megahertz). No celular ou PC você só vai ter sinais de áudio frequência (até 20 kHz).
Você precisa ter o gerador pra calibrar e ajustar as bobinas e os trimmers do capacitor variável (e talvez um frequencímetro e osciloscópio).  Se os caras mexeram na bobina do oscilador local, não tenha dúvida que mexeram nos transformadores de FI e nos trimmers de ajuste. Não é coisa pra quem não tem experiência (eu não sei fazer).
O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

Questão

Usuário suspenso
*
Iniciante
Posts: 118
Logged
Quote from: xformer on 05 de September de 2021, as 18:08:14

Um gerador de RF (rádio frequência) fornece sinais de alta frequência (na faixa das centenas de quilohertz e megahertz). No celular ou PC você só vai ter sinais de áudio frequência (até 20 kHz).

A verdade é que a faixa de AM não é nem rf direito... começa ali em 500 Khz. Um arduino, com o micro mais ordinário do universo, roda suave a 16MHz, podendo gerar um sinal de 8MHz. Qualquer osciloscópio meia boca enxerga lá seus 40MHz. Não se apegue muito à limitação do equipamento, sabendo o que precisa fazer e com algum improviso você consegue.

xformer

Administrator
******
DIY Freak
Posts: 6,396
e^(i x pi)+1=0
Logged
Quote from: Questão on 05 de September de 2021, as 22:12:58
A verdade é que a faixa de AM não é nem rf direito... começa ali em 500 Khz. Um arduino, com o micro mais ordinário do universo, roda suave a 16MHz, podendo gerar um sinal de 8MHz. Qualquer osciloscópio meia boca enxerga lá seus 40MHz. Não se apegue muito à limitação do equipamento, sabendo o que precisa fazer e com algum improviso você consegue.

A faixa de RF é a parte do espectro eletromagnético em que há a comunicação por rádio. Então a banda de frequências das estações de rádio OM (ondas médias) em AM (amplitude modulada) é sim RF.  É possível operação de rádio em frequências até na faixa de frequências de áudio. Comunicações com submarinos são feitas em menos de 100 Hz (com antenas muito longas).



A questão da necessidade de um gerador de RF, é que ele fornece um sinal modulado (seja em amplitude - AM, ou em variação de frequência - FM) onde uma portadora carrega um sinal útil (áudio). Só gerar um sinal sem modulação não seria muito útil para calibrar os rádios.
Um circuito digital de microcontrolador (e.g. Arduíno) só conseguiria fornecer um sinal sem modulação AM, de amplitude fixa. Precisaria acrescentar um modulador (um mixer + filtro ressonante) de forma a ser útil para a empreitada. Mas não é fácil se conseguir sinais com frequência desejada com um microcontrolador. Mesmo com 16 MHz de clock, talvez não se consiga um sinal de 540 kHz certinho para calibrar o extremo inferior e um de 1600 kHz para o extremo superior da faixa de OM.  Já é difícil conseguir Baud Rates exatos para comunicação serial (que tem frequências bem mais baixas 300 bps a 115000 bps) com clocks altos, então para sinais na faixa do mega hertz é mais difícil ainda.


O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

A.Sim

****
Handmaker
Posts: 1,245
Location: São Leopoldo
Logged
#19
Enquanto isso...

O pessoal do mundo digital continua tentando conseguir chegar perto daquilo que o pessoal do analógico já fazia há cinquenta anos atrás.

Para gerar um sinal de áudio com 0,01% de distorção, qualquer guri monta um ponte de Wien com um TL071. Mas também dá para usar um DSP de 64 bits rodando a 5 GHz...
Transformadores Schatz
...The bitterness of poor quality [transformers] is remembered long after the sweetness of today's funny gadgets low price has faded from memory... (obsoletetellyemuseum)

- pelo retorno do tópico "Chinelagem" !

Questão

Usuário suspenso
*
Iniciante
Posts: 118
Logged
Já usei um dsp de 20 dólares pra montar um amplificador classe D :]

As vezes é domingo de tarde e você só quer brincar um pouco, não fazer o trem mais otimizado do mundo. Ademais, estamos em tempos curiosos onde um cortex série M de 32 bits custa menos que um ampop razoável. E o futuro promete mais.

https://create.arduino.cc/projecthub/michalin70/ab-use-an-arduino-as-am-music-transmitter-d3b6e3

Já montei um arranjo parecido, mas com um STM, sem o filtro e mandando só alguns tons. Funciona, se tiver algum micro dando sopa pode montar sem medo.

A.Sim

****
Handmaker
Posts: 1,245
Location: São Leopoldo
Logged
#21
Claro. Quem sabe, faz com dois transistores. Quem não sabe, usa dois PICs (mas agora, na escola, só usam ARM).
Transformadores Schatz
...The bitterness of poor quality [transformers] is remembered long after the sweetness of today's funny gadgets low price has faded from memory... (obsoletetellyemuseum)

- pelo retorno do tópico "Chinelagem" !

Matec

*****
Hand MasterMind
Posts: 2,939
Logged
Sem entrar em mérito de tecnologia, mas o que o Fauzi iria precisar, junto com outros instrumentos, seria um gerador desses aqui:



:)

xformer

Administrator
******
DIY Freak
Posts: 6,396
e^(i x pi)+1=0
Logged
Quote from: Questão on 06 de September de 2021, as 16:34:47
https://create.arduino.cc/projecthub/michalin70/ab-use-an-arduino-as-am-music-transmitter-d3b6e3

Já montei um arranjo parecido, mas com um STM, sem o filtro e mandando só alguns tons. Funciona, se tiver algum micro dando sopa pode montar sem medo.

Facílimo de montar e gravar, então vamos fazer o teste de São Tomé:
[spoiler][/spoiler]

O sketch original programa a frequência de saída do PWM para 600 kHz. Acontece que a frequência do PWM é determinada por um registrador do ATMEGA que é o OCR2A. Esse registrador é de 8 bits (portanto aceita valores inteiros de 0 a 255) e para alguns valores dele, temos as seguintes frequências de PWM:



Como para 600 kHz o valor de OCR2A seria um valor quebrado, o valor inteiro mais próximo é 12, o que corresponde a 615.38 kHz.  Então a possibilidade de se escolher uma determinada frequência é pouca e limitada aos valores inteiros de OCR2A. No meu Arduino Nano eu consegui 591 kHz (o display é um frequencímetro onde os 3 primeiros dígitos são a mantissa e o quarto dígito é o expoente de 10, então 5.91 x 10^5).  A diferença para 615 kHz (3 a 4 %) eu acredito que se deva ao fato do clock do meu Nano ser um ressonador cerâmico e não um cristal.
O sinal quando a entrada de áudio está ligada à tensão Aref (máximo = 5V) é assim:
[spoiler][/spoiler]

Se a entrada de áudio estiver sem sinal (entrada com Aref/2), acontece o seguinte:
[spoiler]  [/spoiler]
Nesse caso o ATMEGA desliga por alguns ciclos o sinal e o liga pelo mesmo número de ciclos.

A contagem do frequencímetro fica pela metade:
[spoiler][/spoiler]

Então na verdade, a modulação não é de amplitude modulada (o vídeo do link diz isso também), e nem PWM, mas seria uma transmissão por CW (continuous wave, usada para código morse), onde o PWM do áudio é transmitido por CW.

Funciona no rádio ?  Sim, eu injetei sinal senoidal no Arduíno e liguei meu toca-fitas em rádio AM. Mas o som é muito ruim (além de que eu precisava servir de antena encostando meus dedos no fio de saída para que o rádio pegasse).

Veja como fica o sinal de 591 kHz com o áudio:
[spoiler][/spoiler]

Passando por um filtro passa baixas RC, fica assim:
[spoiler][/spoiler]

Também mudei o sketch para frequências de 1000 kHz e 1600 kHz:
[spoiler]
[/spoiler]

Eu acho que dessa forma é muito difícil usar isso para calibrar o rádio. E teria que usar as frequências de 533 e 1600 kHz como extremos (525 e 1705 kHz que é a faixa definida pela Abert para ondas médias) e tem de usar um Arduino com clock de cristal. Mas para calibrar ondas curtas teria que pensar em outro jeito já que as frequências são mais altas.

Se fizer citação desta mensagem, retire as imagens de dentro da citação.
O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

Questão

Usuário suspenso
*
Iniciante
Posts: 118
Logged
Fera demais, curti o frequencímetro! Belíssimo oscilador a cristal.

Bom, os senhores se detiveram em atirar pedras, mas eu só vim sugerir uma alternativa pro problema do rapaz, hora nenhuma disse que ia competir com a rhodes nos geradores de rf de instrumentação.

Isso é pwm sim, o que ele faz na verdade é ligar e desligar o pwm de alta frequência. Um truque bastante divertido. É um pwm sobre pwm, se quiser pensar assim. Eu usei isso com um f103 falsificado de 80MHz (me custou 3 reais na época, mais barato que os 741 da local). Fiz algumas notas musicais pré-programadas, então não tinha lidar com ruídos de quantização. O alcance dá em torno de 5 metros.

Se quiser um gerador de AM fajuto em meia tarde tá aí o esquema. Não é bom, tampouco preciso, mas é fácil.

P.S. Pro Asim essa, um tx de fm em bit-banging com ARM de 3GHz:
https://github.com/markondej/fm_transmitter
Já testei, funciona liso

xformer

Administrator
******
DIY Freak
Posts: 6,396
e^(i x pi)+1=0
Logged
#25
Quote from: Questão on 07 de September de 2021, as 00:11:57
Fera demais, curti o frequencímetro! Belíssimo oscilador a cristal.

Você conseguiu enxergar meu oscilador a cristal ?  ???
Eu fiz com um ci 74LS04 e soldei alguns componentes smd e o cristal de 4 MHz nos pinos das portas inversoras, assim poderia usar em qualquer protoboard e ele serve de clock para o PIC do frequencímetro.
[spoiler][/spoiler]

Se quiser montar o frequencímetro, ele é projeto de dois italianos e  originalmente usava o PIC 16C84.  Eu alterei o código para usar o 16F84A e displays de anodo comum (eles usaram catodo comum, conforme esquema):



[spoiler]Código original:
Quote
;*******************************************************************
;                          FMETER.ASM
;             4 digits auto-ranging frequency-meter
;           made by Simone Benvenuti & Andrea Geniola
;       e-mail: simone.benvenuti@studenti.ing.unipi.it
;               andrea.geniola@studenti.ing.unipi.it
;*******************************************************************
;
; A frequency counter which can read frequencies from 0Hz to 50MHz is
; here implemented using a PIC microcontroller. The basic hardware for
; the measurement circuit is shown below: the measure result can be read
; on 4 seven-segments displays in the engeneering notation (A.BC * 10^D).
; The displays are driven using only 11 output pins and 4 transistors;
; during a refresh cycle each digit is turned on for 62.5 usec
; The input frequency is "gated" for a precise duration of time. The gate
; is implemented in software as an accurate delay. In order to minimize
; the error the gate is 1msec wide if the frequency is above 256KHz,
; otherwise is 1msec wide. If the frequency is below 128Hz the digits
; blink to warn that the error can be greater than the device resolution.
; To minimize the energy consumption the PIC turns in sleep mode if no
; input signal is detected for 10sec (this period is software tunable),
; but it wake-up itself immediately when the input is stimulated.
; The program is written for the PIC16C84 but cheaper PICs (as PIC16C61)
; can be used.
;
;                        ________________
;             cents gnd -| RA2      RA1 |- tenths gnd       
;             esp   gnd -| RA3      RA0 |- units gnd       
; input -////--+-----| RA4/TOCKI    |-                    ___a___
;         470ohm   |    -|              |- 4 MHz cristal      |     |
;                  | gnd-|              |- VDD 3..5 Volt     f|     |b
;   input control  +-----| RB0      Rb7 |- "g" segment        |  g  |
;          "a" segment  -| RB1      RB6 |- "f" segment        |-----|
;          "b" segment  -| RB2      RB5 |- "e" segment       e|     |c
;          "c" segment  -| RB3      RB4 |- "d" segment        |  d  |
;                        ----------------                     -------
;*******************************************************************
;
        LIST    p=16C84, wdte=0 ; PIC16C84 is the target processor
;
;status registers:
pc   equ   02   ;program counter
porta   equ     05      ;I/O register
portb   equ     06      ;I/O register
status  equ     03      ;status register
tmr     equ     01      ;8 bits counter
trisa   equ     0x5     ;port "a" direction register
trisb   equ     0x6     ;port "b" direction register
intcon  equ     0x0B    ;interrupt control register
;
;general registers:
unita   equ     0x0C      ;display units 
decimi  equ     0x1D      ;display tenths 
cents   equ     0x1E      ;display cents 
esp     equ     0x1F      ;display exponent 
H_byte  equ     0x10      ;high_byte of the read number (N)
L_byte  equ     0x11      ;low_byte of the read number (N)
conta_r equ     0x12      ;refresh counter
cifra   equ     0x13      ;parameter
U       equ     0x14      ;units
D       equ     0x15      ;tens
H       equ     0x16      ;hundreds
M       equ     0x17      ;thousands
DM      equ     0x18      ;tens of thousands
CM      equ     0x19      ;hundreds of thousands
conta1  equ     0x1A      :first counter register
conta2  equ     0x1B      ;second counter register
N       equ     0x1C      ;general register
zeri    equ     0x20      ;number of cycles without signal
;
;***************************  MAIN PROGRAM 
   org     0
start       
        movlw   0x27
        option                  ;load 00100111 in option register
   movlw   0x10
        movwf   intcon          ;enable interrupts
   movlw   .20
        movwf   zeri             
   clrf    porta
        clrf    portb           
        bsf     status,5       
   movlw   0x10
        movwf   trisa           ;porta<0_3>=output, porta<4>=input
        clrf    trisb           ;potrb<0_7>=output
        bcf     status,5       
        movlw   0x08            ;all the segments are switched on
        movwf   unita           ;to test the displays
   movwf   decimi
   movwf   cents
   movwf   esp
        movlw   .20             ;test refresh (0.5sec wide)
        movwf   conta_r         
loop1   call    refresh         ;Refresh of the displays
   decfsz  conta_r
   goto    loop1
loop5   clrf    tmr             
        bsf     status,5
        movlw   0x01
        movwf   trisb           ;-
        bcf     status,5        ; |
        movlw   .99             ; |
   movwf   conta1          ; |
un_ms   nop                     ; |
   nop                     ; |
   nop                     ; |
   nop                     ; |
   nop                     ; |
        nop                     ; |-  1msec delay
   nop                     ; |
   decfsz  conta1          ; |
        goto    un_ms           ; |
        nop                     ; |
        nop                     ; |
   nop                     ; |
   nop                     ; |
   nop                     ; |
        bsf     status,5        ; |       
        clrf    trisb           ;-
        bcf     status,5           
        call    prescaler       ;put the counted number into H_byte-L_byte
        movf    H_byte         
   btfss   status,2        ;test: H_byte=0
        goto    cal1_ms         ;no
        btfsc   L_byte,7        ;yes, then test if L_byte<=128
        goto    cal1_ms         ;no
        clrf    tmr             ;yes
        bsf     status,5
   movlw   0x01
        movwf   trisb           ;-
        bcf     status,5        ; |
        movlw   .20             ; |
        movwf   conta_r         ; |
loopr   call    refresh         ; |
        decfsz  conta_r         ; |
        goto    loopr           ; |
        movlw   .4              ; |- 0.5 sec delay ("refresh" is called
        movwf   N               ; |                 20 times)
wait    decfsz  N               ; |
        goto    wait            ; |
        nop                     ; |
        nop                     ; |
        bsf     status,5        ; |
        clrf    trisb           ;-
        bcf     status,5        ;     
        call    prescaler       ;put the counted number into H_byte-L_byte
        movf    H_byte          ;
        btfss   status,2        ;test if H_byte=0
   goto    cal05           ;NO
        btfsc   L_byte,7        ;yes, then test if L_byte<=127
   goto    cal05           ;NO
   movf   L_byte      
   btfss   status,2   
   goto    lamp
        clrf    esp             ;no input signal is detected
        clrf    unita           ;clear all the displays and show
        clrf    decimi          ;zero without blinking for "zeri" times
   clrf   cents
   decfsz   zeri
   goto   loop5
   bcf   intcon,1
   sleep
   goto   loop1
lamp    movlw   0x14            ;blinking mode 
        movwf   N               
giro    call    ritardo         
   decfsz   N
   goto   giro   
   goto    cal05
;
cal1_ms clrf    U               ;put the right values into the 4 displays
        clrf    D               ;registers and add 3 to the exponent
        clrf    H               ;to multiply by one thousand
        clrf    M               
   clrf    DM
   clrf    CM
   movlw   0x03
   movwf   esp
   call    calcolo
   movlw   .20
   movwf   conta_r
   goto    loop1
;
cal05   clrf    U               ;multiply the number by 2 and put the
        clrf    D               ;right values into the 4 displays regs
        clrf    H               
   clrf    M
   clrf    DM
   clrf    CM
   btfsc   H_byte,7
   call    sessant
   bcf     status,0
   rlf     L_byte
   rlf     H_byte
        clrf    esp
        call    calcolo
   goto    loop5
;
;
; *****************************     Delay subroutine
ritardo movlw   .8              ; -     
        movwf   conta1          ;  |
        nop                     ;  |
beta    movlw   .0              ;  |
        movwf   conta2          ;  |_ 62.5 microsec delay
alfa    decfsz  conta2          ;  |
   goto    alfa            ;  |
        nop            ;  |
        decfsz  conta1          ;  |
   goto    beta            ;  |
   movlw   .14      ;  |
   movwf   conta2      ;  |
gamma   decfsz   conta2      ;  |
   goto   gamma      ;  |
   nop         ;  |
   nop              ;  |
        return                  ; -
; *****************************  choice of the right segments
segmenti   nop
        movf    cifra,0
        addwf   pc              ;return into W the right set of segments
        retlw   0x7E            ;to be ligthed for each digit
   retlw   0x0C
   retlw   0xB6
   retlw   0x9E
   retlw   0xCC
   retlw   0xDA             
   retlw   0xFA
   retlw   0x0E
   retlw   0xFE
   retlw   0xDE
;
; ***************************** refresh subroutine:  250 mSec
refresh movf    unita,0
        movwf   cifra         
   call    segmenti
   movwf   portb
        bsf     porta,0         
   call    ritardo
        bcf     porta,0       
   movf    decimi,0
        movwf   cifra           
   call    segmenti
   movwf   portb
        bsf     porta,1       
   call    ritardo
        bcf     porta,1         
   movf    cents,0
        movwf   cifra         
   call    segmenti
   movwf   portb
        bsf     porta,2       
   call    ritardo
        bcf     porta,2       
   movf    esp,0
        movwf   cifra         
   call    segmenti
   movwf   portb
        bsf     porta,3       
   call    ritardo
        bcf     porta,3       
   return
; ************** subroutine to extract the value contained in prescaler
prescaler       movf    tmr,0
        movwf   H_byte          ;make a copy of the counter into H_byte
        clrf    N               
ciclo   bcf     portb,0
        bsf     portb,0
        bcf     portb,0         ;give un edge to the input controller
        incf    N               
        movf    H_byte,0        ;make a copy of H_byte into W
        xorwf   tmr,0           ;control if tmr is changed (tmr=H_byte)
        btfsc   status,2       
        goto    ciclo
        movlw   0xFF
        movwf   L_byte         
   movf    N,0             
        subwf   L_byte          ;-|__ L_byte=256-N
   incf    L_byte          ;-|   
   return
; ****************************** frequency calculation subroutine
calcolo movlw   .20
   movwf   zeri
   rlf     H_byte
        btfss   status,0        ;check bit7 of H_byte
   goto    c_2
   movlw   0x03
   addwf   DM
   movlw   0x02
   addwf   M
   movlw   0x07
        addwf   H
   movlw   0x06
   addwf   D
   movlw   0x08
        addwf   U               ;if bit7=1 then add 32768
c_2     rlf     H_byte
        btfss   status,0        ;check bit6 of H_byte
   goto    c_3
   movlw   0x01
   addwf   DM
   movlw   0x06
   addwf   M
   movlw   0x03
        addwf   H
   movlw   0x08
   addwf   D
   movlw   0x04
        addwf   U               ;if bit6=1 then add 16384
c_3     rlf     H_byte
        btfss   status,0        ;check bit5 of H_byte
   goto    c_4
   movlw   0x08
   addwf   M
   movlw   0x01
        addwf   H
   movlw   0x09
   addwf   D
   movlw   0x02
        addwf   U               ;if bit5=1 then add 8192
c_4     rlf     H_byte
        btfss   status,0        ;check bit4 of H_byte
   goto    c_5
   movlw   0x04
   addwf   M
   movlw   0x09
   addwf   D
   movlw   0x06
        addwf   U               ;if bit4=1 then add 4096
c_5     rlf     H_byte
        btfss   status,0        ;check bit3 of H_byte
   goto    c_6
   movlw   0x02
   addwf   M
   movlw   0x04
   addwf   D
   movlw   0x08
        addwf   U               ;if bit3=1 then add 2048
c_6     rlf     H_byte
        btfss   status,0        ;check bit2 of H_byte
   goto    c_7
   movlw   0x01
   addwf   M
   movlw   0x02
   addwf   D
   movlw   0x04
        addwf   U               ;if bit2=1 then add 1024
c_7     rlf     H_byte
        btfss   status,0        ;check bit1 of H_byte
   goto    c_8
   movlw   0x05
        addwf   H
   movlw   0x01
   addwf   D
   movlw   0x02
        addwf   U               ;if bit1=1 then add 512
c_8     rlf     H_byte
        btfss   status,0        ;check bit0 of H_byte
   goto    c_9
   movlw   0x02
        addwf   H
   movlw   0x05
   addwf   D
   movlw   0x06
        addwf   U               ;if bit0=1 then add 256
c_9     rlf     L_byte
        btfss   status,0        ;check bit7 of L_byte
   goto    c_10
   movlw   0x01
        addwf   H
   movlw   0x02
   addwf   D
   movlw   0x08
        addwf   U               ;if bit7=1 then add 128
c_10    rlf     L_byte
        btfss   status,0        ;check bit6 of L_byte
   goto    c_11
   movlw   0x06
   addwf   D
   movlw   0x04
        addwf   U               ;if bit6=1 then add 64
c_11    rlf     L_byte
        btfss   status,0        ;check bit5 of L_byte
   goto    c_12
   movlw   0x03
   addwf   D
   movlw   0x02
        addwf   U               ;if bit5=1 then add 32
c_12    rlf     L_byte
        btfss   status,0        ;check bit4 of L_byte
   goto    c_13
   movlw   0x01
   addwf   D
   movlw   0x06
        addwf   U               ;if bit4=1 then add 16
c_13    rlf     L_byte
        btfss   status,0        ;check bit3 of L_byte
   goto    c_14
   movlw   0x08
        addwf   U               ;if bit3=1 then add 8
c_14    rlf     L_byte
        btfss   status,0        ;check bit2 of L_byte
   goto    c_15
   movlw   0x04
        addwf   U               ;if bit2=1 then add 4
c_15    rlf     L_byte
        btfss   status,0        ;check bit1 of L_byte
   goto    c_16
   movlw   0x02
        addwf   U               ;if bit1=1 then add 2
c_16    rlf     L_byte
        btfss   status,0        ;check bit0 of L_byte
   goto    c_17
   movlw   0x01
        addwf   U               ;if bit0=1 then add 1
c_17    call    riporti
        movf    CM,0            ;the 1st significant digit (MSD) is searched
        btfss   status,2        ;and a 4th significant digit approximation
        goto    appcmnz         ;is made
        movf    DM,0           
        btfss   status,2
        goto    appdmnz
        movf    M,0           
        btfsc   status,2
        goto    fuori           
        movf    U,0           
        movwf   N
        movlw   0x05
   subwf   N
        btfss   status,0
        goto    fuori
        incf    D
        goto    fuori
appdmnz movf    D,0             ; DM is the MSD
        movwf   N
        movlw   0x05
   subwf   N
        btfss   status,0
        goto    fuori
        incf    H
        goto    fuori
appcmnz movf    H,0             ;CM is the MSD
        movwf   N
        movlw   0x05
   subwf   N
        btfss   status,0
        goto    fuori
        incf    M
fuori   call    riporti
        movf    CM,0            ;put the 4th significant digit into
        btfss   status,2        ;the 4 display registers
        goto    cmnz            ;and put into esp the rigth value
        movf    DM,0           
   btfss   status,2
   goto    dmnz
   movf    M,0
   btfss   status,2
        goto    mnz             
        movlw   0x02            ;U is the MSD
   addwf   esp             
        movf    H,0
   movwf   unita
   movf    D,0
   movwf   decimi
   movf    U,0
   movwf   cents
        goto    esci
mnz     movlw   0x03            ;M is the MSD
   addwf   esp             
   movf    M,0
   movwf   unita
        movf    H,0
   movwf   decimi
   movf    D,0
   movwf   cents
        goto    esci
dmnz    movlw   0x04            ;DM is the MSD
   addwf   esp             
   movf    DM,0
   movwf   unita
   movf    M,0
   movwf   decimi
        movf    H,0
   movwf   cents
        goto    esci
cmnz    movlw   0x05            ;CM is the MSD
   addwf   esp             
   movf    CM,0
   movwf   unita
   movf    DM,0
   movwf   decimi
   movf    M,0
   movwf   cents
esci    return
; ****************************** carry subroutine
riporti movf    U,0
   movwf   N
ripu    movf    N,0             ;check if units>10
   movwf   U
   incf    D
   movlw   0x0A
   subwf   N
        btfsc   status,0
   goto    ripu
   decf    D
   movf    D,0
   movwf   N
ripd    movf    N,0             ;check if tens>10
   movwf   D
        incf    H
   movlw   0x0A
   subwf   N
        btfsc   status,0
   goto    ripd
        decf    H
        movf    H,0
   movwf   N
ripc    movf    N,0             ;check if hundreds>10
        movwf   H
   incf    M
   movlw   0x0A
   subwf   N
        btfsc   status,0
   goto    ripc
   decf    M
   movf    M,0
   movwf   N
ripm    movf    N,0             ;check if thousands>10
   movwf   M
   incf    DM
   movlw   0x0A
   subwf   N
        btfsc   status,0
   goto    ripm
   decf    DM
   movf    DM,0
   movwf   N
ripdm   movf    N,0             ;check if tens of thousands>10
   movwf   DM
   incf    CM
   movlw   0x0A
   subwf   N
        btfsc   status,0
   goto    ripdm
   decf    CM
   return
; ****************************** subroutine to add 64K
sessant movlw   0x06
   addwf   DM
   movlw   0x05
   addwf   M
   movlw   0x05
        addwf   H
   movlw   0x03
   addwf   D
   movlw   0x06
        addwf   U               ;add 65536
   return
     END
;----------------
[/spoiler]



Quote
Bom, os senhores se detiveram em atirar pedras, mas eu só vim sugerir uma alternativa pro problema do rapaz, hora nenhuma disse que ia competir com a rhodes nos geradores de rf de instrumentação.

Não pense assim Gustavo. Eu também não tenho gerador de RF, então qualquer sugestão de um instrumento fácil de implementar pode ser uma boa. Mas precisa ser utilizável e viável. Por isso eu testo as ideias pra poder usar um dia (é o caso desse frequencímetro com PIC, que descobri há 20 anos). Mas tem um monte de projeto furado na internet e precisam ser validados.

Quote
P.S. Pro Asim essa, um tx de fm em bit-banging com ARM de 3GHz:
https://github.com/markondej/fm_transmitter
Já testei, funciona liso

Lá vou eu testar outro projeto agora com o Raspberry Pi    :D
Que diabo Raspberry Pi é esse seu com 3 GHz ?  Os meus mais rápidos são o Pi3 (1.2 GHz) e o Pi4 (1.5 GHz).  Nem com overclock ...





-----

Código modificado para PIC 16F84 e displays de anodo comum:

[spoiler]
Quote


;*******************************************************************
;                          FMETER.ASM
;             4 digits auto-ranging frequency-meter 
;                Rewritten for 16F84A
;
;                        ________________
;             cents gnd -| RA2      RA1 |- tenths gnd       
;             esp   gnd  -| RA3      RA0 |- units gnd       
;   input -/\/\/\/\--+-----| RA4/TOCKI   |-                           ___a___
;         470ohm   |    -|                     |- 4 MHz cristal      |            |
;                     | gnd-|                     |- VDD 3..5 Volt     f|            |b
;   input control  +-----| RB0      Rb7 |- "g" segment      |     g    |
;          "a" segment  -| RB1      RB6 |- "f" segment      |------------|
;          "b" segment  -| RB2      RB5 |- "e" segment   e|            |c
;          "c" segment  -| RB3      RB4 |- "d" segment     |      d    |
;                                ----------------------                           -------------
;*******************************************************************
;
        LIST    p=16F84A ;wdte=0 ; PIC16F84A is the target processor
;
;status registers:
pc   equ   02   ;program counter
porta   equ     05      ;I/O register
portb   equ     06      ;I/O register
status  equ     03      ;status register
tmr     equ     01      ;8 bits counter
trisa   equ     0x5     ;port "a" direction register 
trisb   equ     0x6     ;port "b" direction register 
intcon  equ     0x0B    ;interrupt control register
;
;general registers:
unita   equ     0x0C      ;display units 
decimi  equ     0x1D      ;display tenths 
cents   equ     0x1E      ;display cents 
esp     equ     0x1F      ;display exponent 
H_byte  equ     0x10      ;high_byte of the read number (N)
L_byte  equ     0x11      ;low_byte of the read number (N)
conta_r equ     0x12      ;refresh counter
cifra   equ     0x13      ;parameter
U       equ     0x14      ;units
D       equ     0x15      ;tens
H       equ     0x16      ;hundreds
M       equ     0x17      ;thousands
DM      equ     0x18      ;tens of thousands
CM      equ     0x19      ;hundreds of thousands
conta1  equ     0x1A      ;first counter register
conta2  equ     0x1B      ;second counter register
N       equ     0x1C      ;general register
zeri    equ     0x20      ;number of cycles without signal
;
;***************************  MAIN PROGRAM 
   org     0
start       
           movlw   0x27
           option                  ;load 00100111 in option register
   movlw   0x10
           movwf   intcon          ;enable interrupts
   movlw   .20
           movwf   zeri             
   clrf    porta
           clrf    portb           
           bsf     status,5       
   movlw   0x10   ;trisa = 00010000
           movwf   trisa           ;porta<0_3>=output, porta<4>=input
           clrf    trisb              ;portb<0_7>=output    trisb = 00000000
           bcf     status,5       
           movlw   0x08            ;all the segments are switched on
           movwf   unita           ;to test the displays
   movwf   decimi
   movwf   cents
   movwf   esp
           movlw   .20             ;test refresh (0.5sec wide)
           movwf   conta_r         
loop1      call    refresh         ;Refresh of the displays
   decfsz  conta_r
   goto    loop1
loop5      clrf    tmr             
           bsf     status,5
           movlw   0x01
           movwf   trisb           ;-   portb0 = input
           bcf     status,5        ; |
           movlw   .99             ; |
   movwf   conta1          ; |
un_ms      nop                     ; |
   nop                     ; |
   nop                     ; |
   nop                     ; |
   nop                     ; |
           nop                     ; |-  1msec delay
   nop                     ; |
   decfsz  conta1          ; |
           goto    un_ms           ; |
           nop                     ; |
           nop                     ; |
   nop                     ; |
   nop                     ; |
   nop                     ; |
           bsf     status,5        ; |       
           clrf    trisb           ;-     portb0 = output
           bcf     status,5           
           call    prescaler       ;put the counted number into H_byte-L_byte
           movf    H_byte         
   btfss   status,2        ;test: H_byte=0
           goto    cal1_ms         ;no
           btfsc   L_byte,7        ;yes, then test if L_byte<=128
           goto    cal1_ms         ;no
           clrf    tmr             ;yes
           bsf     status,5
   movlw   0x01
           movwf   trisb           ;-
           bcf     status,5        ; |
           movlw   .20             ; |
           movwf   conta_r         ; |
loopr      call    refresh         ; |
           decfsz  conta_r         ; |
           goto    loopr           ; |
           movlw   .4              ; |- 0.5 sec delay ("refresh" is called
           movwf   N               ; |                 20 times)
wait       decfsz  N               ; |
           goto    wait            ; |
           nop                     ; |
           nop                     ; |
           bsf     status,5        ; |
          clrf    trisb           ;-
           bcf     status,5        ;     
           call    prescaler       ;put the counted number into H_byte-L_byte
           movf    H_byte          ;
           btfss   status,2        ;test if H_byte=0
   goto    cal05           ;NO
           btfsc   L_byte,7        ;yes, then test if L_byte<=127
   goto    cal05           ;NO
   movf   L_byte      
   btfss   status,2   
   goto    lamp
           clrf    esp             ;no input signal is detected
           clrf    unita           ;clear all the displays and show
           clrf    decimi          ;zero without blinking for "zeri" times
   clrf   cents
   decfsz   zeri
   goto   loop5
   bcf   intcon,1
   sleep
   goto   loop1
lamp       movlw   0x14            ;blinking mode 
           movwf   N               
giro       call    ritardo         
   decfsz   N
   goto   giro   
   goto    cal05
;
cal1_ms    clrf    U               ;put the right values into the 4 displays
           clrf    D               ;registers and add 3 to the exponent
           clrf    H               ;to multiply by one thousand
           clrf    M               
   clrf    DM
   clrf    CM
   movlw   0x03
   movwf   esp
   call    calcolo
   movlw   .20
   movwf   conta_r
   goto    loop1
;
cal05      clrf    U               ;multiply the number by 2 and put the
           clrf    D               ;right values into the 4 displays regs
           clrf    H               
   clrf    M
   clrf    DM
   clrf    CM
   btfsc   H_byte,7
   call    sessant
   bcf     status,0
   rlf     L_byte
   rlf     H_byte
           clrf    esp
           call    calcolo
   goto    loop5
;
;
; *****************************     Delay subroutine
ritardo    movlw   .8              ; -     
           movwf   conta1          ;  |
           nop                     ;  |
beta       movlw   .0              ;  |
           movwf   conta2          ;  |_ 62.5 microsec delay
alfa       decfsz  conta2          ;  |
   goto    alfa            ;  |
           nop            ;  |
           decfsz  conta1          ;  |
   goto    beta            ;  |
   movlw   .14      ;  |
   movwf   conta2      ;  |
gamma   decfsz   conta2      ;  |
   goto   gamma      ;  |
   nop         ;  |
   nop              ;  |
           return                  ; -
; *****************************  choice of the right segments
segmenti   nop
           movf    cifra,0
           addwf   pc              ;return into W the right set of segments to be lighted for each digit
           retlw 0x81   ;10000001         0x7E           ; 01111110  0  gfedcbap
   retlw 0xF3   ;11110011         0x0C   ; 00001100  1
   retlw 0x49   ;01001001         0xB6   ; 10110110  2
   retlw 0x61   ;01100001         0x9E   ; 10011110  3
   retlw 0x33   ;00110011         0xCC   ; 11001100  4
   retlw 0x25   ;00100101         0xDA   ; 11011010  5
   retlw 0x05   ;00000101         0xFA   ; 11111010  6
   retlw 0xF1   ;11110001         0x0E   ; 00001110  7
   retlw 0x01   ;00000001         0xFE   ; 11111110  8
   retlw 0x21   ;00100001         0xDE   ; 11011110  9
;
; ***************************** refresh subroutine:  250 mSec
refresh    movf    unita,0
           movwf   cifra         
   call    segmenti
   movwf   portb
   bcf     portb,0   ;liga ponto decimal
          bcf     porta,0   ;liga display unidades    anodo comum     
   call    ritardo
           bsf     porta,0   ;desliga display unidades       
   movf    decimi,0
           movwf   cifra           
   call    segmenti
   movwf   portb
           bcf     porta,1   ;liga display decimo       
   call    ritardo
          bsf     porta,1   ;desliga display decimos         
   movf    cents,0
           movwf   cifra         
   call    segmenti
   movwf   portb
           bcf     porta,2     ;liga display centesimos
   call    ritardo
           bsf     porta,2      ;desliga display centesimos   
   movf    esp,0
           movwf   cifra         
   call    segmenti
   movwf   portb
           bcf     porta,3   ;liga display expoente       
   call    ritardo
           bsf     porta,3   ;desliga display expoente       
   return
; ************** subroutine to extract the value contained in prescaler
prescaler       
   movf    tmr,0
           movwf   H_byte          ;make a copy of the counter into H_byte
           clrf    N               
ciclo      bcf     portb,0
           bsf     portb,0
           bcf     portb,0         ;give un edge to the input controller
          incf    N               
           movf    H_byte,0        ;make a copy of H_byte into W
           xorwf   tmr,0           ;control if tmr is changed (tmr=H_byte)
           btfsc   status,2       
           goto    ciclo
           movlw   0xFF
           movwf   L_byte         
   movf    N,0             
           subwf   L_byte          ;-|__ L_byte=256-N
   incf    L_byte          ;-|   
   return
; ****************************** frequency calculation subroutine
calcolo    movlw   .20
   movwf   zeri
   rlf     H_byte
           btfss   status,0        ;check bit7 of H_byte
   goto    c_2
   movlw   0x03
   addwf   DM
   movlw   0x02
   addwf   M
   movlw   0x07
           addwf   H
   movlw   0x06
   addwf   D
   movlw   0x08
           addwf   U               ;if bit7=1 then add 32768
c_2        rlf     H_byte
           btfss   status,0        ;check bit6 of H_byte
   goto    c_3
   movlw   0x01
   addwf   DM
   movlw   0x06
   addwf   M
   movlw   0x03
           addwf   H
   movlw   0x08
   addwf   D
   movlw   0x04
           addwf   U               ;if bit6=1 then add 16384
c_3        rlf     H_byte
           btfss   status,0        ;check bit5 of H_byte
   goto    c_4
   movlw   0x08
   addwf   M
   movlw   0x01
           addwf   H
   movlw   0x09
   addwf   D
   movlw   0x02
           addwf   U               ;if bit5=1 then add 8192
c_4        rlf     H_byte
           btfss   status,0        ;check bit4 of H_byte
   goto    c_5
   movlw   0x04
   addwf   M
   movlw   0x09
   addwf   D
   movlw   0x06
           addwf   U               ;if bit4=1 then add 4096
c_5        rlf     H_byte
           btfss   status,0        ;check bit3 of H_byte
   goto    c_6
   movlw   0x02
   addwf   M
   movlw   0x04
   addwf   D
   movlw   0x08
           addwf   U               ;if bit3=1 then add 2048
c_6        rlf     H_byte
           btfss   status,0        ;check bit2 of H_byte
   goto    c_7
   movlw   0x01
   addwf   M
   movlw   0x02
   addwf   D
   movlw   0x04
           addwf   U               ;if bit2=1 then add 1024
c_7        rlf     H_byte
           btfss   status,0        ;check bit1 of H_byte
   goto    c_8
   movlw   0x05
           addwf   H
   movlw   0x01
   addwf   D
   movlw   0x02
           addwf   U               ;if bit1=1 then add 512
c_8        rlf     H_byte
           btfss   status,0        ;check bit0 of H_byte
   goto    c_9
   movlw   0x02
           addwf   H
   movlw   0x05
   addwf   D
   movlw   0x06
           addwf   U               ;if bit0=1 then add 256
c_9        rlf     L_byte
           btfss   status,0        ;check bit7 of L_byte
   goto    c_10
   movlw   0x01
           addwf   H
   movlw   0x02
   addwf   D
   movlw   0x08
           addwf   U               ;if bit7=1 then add 128
c_10       rlf     L_byte
           btfss   status,0        ;check bit6 of L_byte
   goto    c_11
   movlw   0x06
   addwf   D
   movlw   0x04
           addwf   U               ;if bit6=1 then add 64
c_11       rlf     L_byte
           btfss   status,0        ;check bit5 of L_byte
   goto    c_12
   movlw   0x03
   addwf   D
   movlw   0x02
           addwf   U               ;if bit5=1 then add 32
c_12       rlf     L_byte
           btfss   status,0        ;check bit4 of L_byte
   goto    c_13
   movlw   0x01
   addwf   D
   movlw   0x06
           addwf   U               ;if bit4=1 then add 16
c_13       rlf     L_byte
           btfss   status,0        ;check bit3 of L_byte
   goto    c_14
   movlw   0x08
           addwf   U               ;if bit3=1 then add 8
c_14       rlf     L_byte
           btfss   status,0        ;check bit2 of L_byte
   goto    c_15
   movlw   0x04
           addwf   U               ;if bit2=1 then add 4
c_15       rlf     L_byte
           btfss   status,0        ;check bit1 of L_byte
   goto    c_16
   movlw   0x02
           addwf   U               ;if bit1=1 then add 2
c_16       rlf     L_byte
           btfss   status,0        ;check bit0 of L_byte
   goto    c_17
   movlw   0x01
           addwf   U               ;if bit0=1 then add 1
c_17       call    riporti
           movf    CM,0            ;the 1st significant digit (MSD) is searched
           btfss   status,2        ;and a 4th significant digit approximation
           goto    appcmnz         ;is made
           movf    DM,0           
           btfss   status,2
           goto    appdmnz
           movf    M,0           
           btfsc   status,2
           goto    fuori           
           movf    U,0           
           movwf   N
           movlw   0x05
   subwf   N
           btfss   status,0
           goto    fuori
           incf    D
           goto    fuori
appdmnz movf    D,0             ; DM is the MSD
           movwf   N
           movlw   0x05
   subwf   N
           btfss   status,0
           goto    fuori
           incf    H
           goto    fuori
appcmnz movf    H,0             ;CM is the MSD
           movwf   N
           movlw   0x05
   subwf   N
           btfss   status,0
           goto    fuori
           incf    M
fuori      call    riporti
           movf    CM,0            ;put the 4th significant digit into
           btfss   status,2        ;the 4 display registers
           goto    cmnz            ;and put into esp the rigth value
           movf    DM,0           
   btfss   status,2
   goto    dmnz
   movf    M,0
   btfss   status,2
           goto    mnz             
           movlw   0x02            ;U is the MSD
   addwf   esp             
           movf    H,0
   movwf   unita
   movf    D,0
   movwf   decimi
   movf    U,0
   movwf   cents
           goto    esci
mnz        movlw   0x03   
O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

Questão

Usuário suspenso
*
Iniciante
Posts: 118
Logged
Quote from: xformer on 07 de September de 2021, as 02:02:17
Você conseguiu enxergar meu oscilador a cristal ?  ???
Vi a latinha do cristal num amontoado de componente ali e já curti :P
Sou fã de uma gambiarra bem feita... Acho que vou copiar.

Quote from: xformer on 07 de September de 2021, as 02:02:17
Não pense assim Gustavo. Eu também não tenho gerador de RF, então qualquer sugestão de um instrumento fácil de implementar pode ser uma boa. Mas precisa ser utilizável e viável. Por isso eu testo as ideias pra poder usar um dia (é o caso desse frequencímetro com PIC, que descobri há 20 anos). Mas tem um monte de projeto furado na internet e precisam ser validados.
A qualidade vai da complexibilidade. Mais um buffer e uns filtrinhos de sexta ordem e daria pra transmitir AM profissionalmente por aí. Mas realmente não dá pra esperar muita coisa de uma montagem como essa. Ainda assim é um jeito bom de começar a brincar.

Quote from: xformer on 07 de September de 2021, as 02:02:17
Lá vou eu testar outro projeto agora com o Raspberry Pi    :D
Que diabo Raspberry Pi é esse seu com 3 GHz ?  Os meus mais rápidos são o Pi3 (1.2 GHz) e o Pi4 (1.5 GHz).  Nem com overclock ...

Realmente... Devo ter confundido com a spec outro sbc. Corrigindo pra 1.5GHz então.



xformer

Administrator
******
DIY Freak
Posts: 6,396
e^(i x pi)+1=0
Logged
#27
Quote from: Questão on 07 de September de 2021, as 20:02:00
Vi a latinha do cristal num amontoado de componente ali e já curti :P
Sou fã de uma gambiarra bem feita... Acho que vou copiar.

Você está falando de um oscilador dip metálico de 2048 kHz. Ele está ao lado do meu oscilador de 4 MHz feito com TTL.  Na protoboard eu deixo alguns osciladores para poder usar vários clocks dependendo do circuito que monto. Há ainda um oscilador astável com 555 com frequência de 30 Hz.  Eu deixo ainda alguns cis TTL contadores e flip-flops JK para dividir as frequências e conseguir outros valores de clock.
Na protoboard eu deixo pronto também uma fileira de leds com resistores e push buttons.  Isso agiliza a montagem e teste de cis, sem precisar partir do zero.
O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

Fauzi

*
Iniciante
Posts: 24
Logged
Vixe ... fiquei uns dias sem olhar o tópico e agora tem várias mensagens, cujo teor foge do meu pouco conhecimento.
O que tentei fazer foi um simples gerador de RF, usando um ressonador cerâmico e 2 CD4011, além de outros componentes. Esse circuito foi publicado na revista Saber Eletrônico do Newton Braga e revisto no canal EletroMakersBrasil nesse link, onde tem link para o circuito original e o modificado, que foi o que fiz.
Porém, não sei porque cargas d'águas não funcionou. Antes de ligar conferi várias vezes as ligações porque não montei num circuito impresso, mas numa plaquinha de fenolite lisa e com ligações fio a fio.

https://www.youtube.com/watch?v=pgA2BwpWOxg&t=528s

Escrevi um comentário no canal e o titular gentilmente informou que não entende porque não funcionou, dizendo que vários usuários construiram e funcionou.
Gastei apenas R$ 13,00 de componentes.

Não sei se vocês conhecem esse circuito mas penso que se funcionar deve ser minimamente suficiente para fazer o alinhamento dos FI da maioria dos rádios antigos, com baixíssimo custo. Se algum de vocês pudesse fazer e testar seria interessante.

Também estou procurando no Aliexpress alguma coisa parecida com isso, mas não achei ainda.



Matec

*****
Hand MasterMind
Posts: 2,939
Logged
Um circuito simples desses, é quase certo que funcione. Ou você utilizou algum componente ruim, ou ( mais comum) você errou na montagem. O pior é que não se sabe o que aconteceu. E sem equipamento mais específico (osciloscópio), você não vai descobrir muito fácil.

:)