desktop

Construir receptor de enlace para FM desde cero (UHF 300 Mhz)

FREKANS_Tam = (FREKANS_step*10/2)/100
se puede escribir así:
FREKANS_Tam = (FREKANS_step*5)/100
Del mismo modo:
FREKANS_Onda = (FREKANS_step*10/2)//100
sería:
FREKANS_Onda = (FREKANS_step*5)//100
Hice el cambio y no hay diferencia del menu para cambiar frecuencia ni tampoco hay cambio en el resultado al memorizar. Todo tal cual


Print At 1,1, "Ste: ", Dec FREKANS_step, " Frec: ", Dec FREKANS_Tam, ".", Dec FREKANS_Onda," MHz "
Hice esos cambios y pasa lo siguiente (acorté al siguiente código:
Código:
Print At 1,1, "Ste:", Dec FREKANS_step, "-", Dec FREKANS_Tam, ".", Dec FREKANS_Onda," MHz "
):

Mínima frecuencia seleccionada de 300 MHZ
20230814_234154.jpg
20230814_234143.jpg
PNG25.png

Ahoraseleccionando máxima frecuencia y el resultado:

20230814_234203.jpg20230814_234213.jpgPNG26.png

El cambio de frecuencia esta bien reflejada en el analizador, pero es al elegir la frecuencia y el resultado en pantalla sobre los 327.(algo que ya no recuerdo) que no se visualiza bien.

Ya usándolo a 6.4MHz se esta lejos de esta especificaciones pero habría que probar hasta donde "funciona de forma segura" el conjunto oscilador/divisor fijo.
Puse un oscilador de 6.4MHz y resultó esto después de bajar el mínimo de frecuencia en el programa a 150 MHZ y máximo 180 MHZ


Es correcto esto que entiendo ????
Tal como se ve en el video, pero solo es lo que se ve en pantalla, no lo que se refleja en el analizador.

Aun no sigo experimentando sumar la frecuencia de 10,7MHZ del filtro mientras no avance en este detalle de lo que se visualiza en pantalla.


Aquí unas cámaras del equipo en pruebas
CAM1 CAM2
 
Última edición:
Aclaración: en mi anterior intervención en este tema, creo haber dicho que con el cristal de 6.4Mhz el step pasa a 100KHz y esto no es así, pasa a 25KHz.

Sin revisar demasiado, me parece que el programa presentado esta para un cristal de 3.2MHz por lo que el step estaría en 50KHz y seguramente es solo para un emisor de 87.5 a 108MHz por los topes y no para un receptor porque no contempla el desplazamiento del oscilador VCO mas o menos la FI del mismo.

Lamentablemente la versión que tengo instalada de Proton es mucho mas nueva y cambia la sintaxis de los comandos sobre todo los del I2C y no lo compila.
 
FREKANS_Tam = (FREKANS_step*10/2)/100
se puede escribir así:
FREKANS_Tam = (FREKANS_step*5)/100
Del mismo modo:
FREKANS_Onda = (FREKANS_step*10/2)//100
sería:
FREKANS_Onda = (FREKANS_step*5)//100
Hice el cambio y no hay diferencia del menu para cambiar frecuencia ni tampoco hay cambio en el resultado al memorizar. Todo tal cual
Y así debe de ser. Sólo era una optimización del código. 5 = 10/2
No hagas más caso, eso está correcto así.
‐----------
El cambio de frecuencia esta bien reflejada en el analizador, pero es al elegir la frecuencia y el resultado en pantalla sobre los 327.(algo que ya no recuerdo) que no se visualiza bien.
Por eso hice que el display mostrara el valor REAL con el que trabaja, la variable FREKANS_step, para saber si había problemas con ella.
Y no los hay. El error viene por otro lado. Explico:
En el video se ve que el display no muestra bien cuando pasa de 327,65 a 327,70 MHz.

Haz la prueba de nuevo: Sintoniza 327,65 y mostrará:
6553-327,65
Ahora avanza 1 y mostrará
6554-0.7

¿A qué se debe esto?
Recordemos la operación que muestra en el display la parte entera de la frecuencia:
FREKANS_Tam = (FREKANS_step*5)/100
Es decir, multiplica FREKANS_step por 5 y divide el resultado por 100
Cuando es 327,65 tenemos:
6553*5=32765
32765/100=327,65

Pero cuando es 327,70 tenemos:
6554*5=32770, que es mayor que 32768, que es el valor máximo de las variables tipo WORD.
Por lo tanto, overflow de la variable y puesta a 0 de la misma.

Solución que quiero que pruebes:
Ya que la variable obtenida de la multiplicación por 5 no puede superar 32768... vamos a engañarla.
Sustituye:
FREKANS_Tam = (FREKANS_step*5)/100
por:
FREKANS_Tam = (FREKANS_step*0.5)/10
y me cuentas.
 
.


@jogyweb ahora con tu post #81 esta todo muy claro. El PLL enclava bien y el problema es solo lo que visualiza el display.


En un rato me pongo a ver si en algún punto separa los valores que envía al TSA5511 y al LCD, ya que con los cambios momentáneos que sugirió @Nlrvana se aprecia un poco más de información.



Estoy totalmente de acuerdo contigo cuando dices:
.........

Aun no sigo experimentando sumar la frecuencia de 10,7MHZ del filtro mientras no avance en este detalle de lo que se visualiza en pantalla.

........

Es mejor dejar eso para después de solucionar el tema visualizar frecuencia correctamente.




Salu2.-
 
Y así debe de ser. Sólo era una optimización del código. 5 = 10/2
No hagas más caso, eso está correcto así.
‐----------

Por eso hice que el display mostrara el valor REAL con el que trabaja, la variable FREKANS_step, para saber si había problemas con ella.
Y no los hay. El error viene por otro lado. Explico:
En el video se ve que el display no muestra bien cuando pasa de 327,65 a 327,70 MHz.

Haz la prueba de nuevo: Sintoniza 327,65 y mostrará:
6553-327,65
Ahora avanza 1 y mostrará
6554-0.7

¿A qué se debe esto?
Recordemos la operación que muestra en el display la parte entera de la frecuencia:
FREKANS_Tam = (FREKANS_step*5)/100
Es decir, multiplica FREKANS_step por 5 y divide el resultado por 100
Cuando es 327,65 tenemos:
6553*5=32765
32765/100=327,65

Pero cuando es 327,70 tenemos:
6554*5=32770, que es mayor que 32768, que es el valor máximo de las variables tipo WORD.
Por lo tanto, overflow de la variable y puesta a 0 de la misma.

Solución que quiero que pruebes:
Ya que la variable obtenida de la multiplicación por 5 no puede superar 32768... vamos a engañarla.
Sustituye:
FREKANS_Tam = (FREKANS_step*5)/100
por:
FREKANS_Tam = (FREKANS_step*0.5)/10
y me cuentas.
Las variables tipo Word van de 0-65535 no a 32768, son de 16bit. El único que es de 15bit es el divisor pero no creo que sea el problema.
 
y si cambias esta parte del código:
"Dim FREKANS_Onda As Word"
por:
"Dim FREKANS_Onda As DWord" ( hacerla de 32 bits)
Cuando se separe en LOW y HI va a tener variables de 16bit(Word)

que pruebe con el adjunto a ver que pasa...reforme las instrucciones para que las acepte mi versión de Proton pero no se si esta todo bien.
 

Adjuntos

  • Jorge.zip
    2.5 KB · Visitas: 14
Última edición:
que pruebe con el adjunto a ver que pasa...reforme las instrucciones para que las acepte mi versión de Proton pero no se si esta todo bien.
Probé el archivo y trabaja como corresponde con la reforma que hizo.
Se visualiza correctamente al elegir la frecuencia y la programada en todo el rango de frecuencia seleccionado, en este caso 300 MHZ a 360 MHZ.


Ahora si se pudiera llegar a vizualizar la suma de 10.7 MHz despues la ayuda del amigo ricbevi en el receptor para cincronizar ambos equipos indicando la misma frecuencia


Gracias ricbevi, espero que con este gran aporte se puedan veneficiar todos los amigos del foro interesados en la actualización del proyecto
 
Probé el archivo y trabaja como corresponde con la reforma que hizo.
Se visualiza correctamente al elegir la frecuencia y la programada en todo el rango de frecuencia seleccionado, en este caso 300 MHZ a 360 MHZ.


Ahora si se pudiera llegar a vizualizar la suma de 10.7 MHz despues la ayuda del amigo ricbevi en el receptor para cincronizar ambos equipos indicando la misma frecuencia


Gracias ricbevi, espero que con este gran aporte se puedan veneficiar todos los amigos del foro interesados en la actualización del proyecto
¿Cómo lo quieres VCO mas FI de 10.7 o VCO menos FI de 10.7?
 
Que tal si en una posición de la EEPROM colocas un bit, si es cero suma, y si es uno resta la FI 10,7MHz (y)
Si, pero forzaría a que o se pre-programe dicha dirección con el valor previamente(de fabrica viene con 255 en decimal o $FF en Hexa como mas prefieran) o hacer una rutina previa que si ya no se definió porque esta en ese estado, realizar una configuración inicial.

El programa es bastante "troglodita" sin depuraciones y optimizaciones ya que involucra cálculos idénticos en reiteradas oportunidades en vez de apuntar a una subrutina así como la falta de simplificación en las operaciones, etc.

No tengo ganas de trabajar por demás en un proyecto que seguramente jamás realizare/usare.

Obviamente como generalmente lo hago, compartiré el código fuente para que sea modificado a "piacere".

Subo una versión para VCO mas FI, espero que funcione.
 

Adjuntos

  • Jorge_RX.zip
    2.4 KB · Visitas: 12
Última edición:
Este cambia la coma decimal por el punto y ajusta lo mostrado en la primer pantalla que al traducir desbordaba la primer lineal del display.

Código:
'****************************************************************
'*  Author  : [Hüseyin GÜNER - ViProje]                         *
'*  Notice  : Copyright (c) 2010                                *
'*  Date    : 16.08.2023                                        *
'*  Version : 3.0 By RicBevi                                    *
'*  Receptor Enlace 300MHz Frecuencia mas FI 10.7MHz
'****************************************************************
Device = 16F628A 'PIC'i tanýtýyoruz.
Config INTRC_OSC_CLKOUT, MCLRE_OFF, LVP_OFF, WDT_OFF, PWRTE_OFF, CP_OFF, BODEN_OFF
Declare I2C_Bus_SCL On'Declare I2C_SCLOUT On elimina la necesidad de resistencia PullUp en el Clok
Declare All_Digital = 1
Declare Xtal = 4
'---------------------------LCD--------------------------------    
   Declare LCD_DTPin = PORTB.0
   Declare LCD_RSPin = PORTB.4
   Declare LCD_ENPin = PORTA.3
   Declare LCD_Interface = 4    ' 4-bit Interface
   Declare LCD_Lines = 2
   Declare LCD_Type = 0
        CMCON = 7
'---------------------------Adresler----------------------------
Dim FREKANS_step As Word     'Frekans Onda sayý/ Parte decimal frecuencia
Dim FREKANS_Tam As Word      'Frekans Tam sayý/ Parte entera frecuencia
Dim FREKANS_Onda As Word     'Frekans stepi/ Paso de frecuencia PLL
Dim FREKANS As Word          'Frekans bilgisi deðiþkeni/ Variable con la FRECUENCIA
Dim Mostrar As Float         'Frecuencia a mostar en el display VCO menos FI (10.7MHz...214)  
Dim F_KONTROL As Word        'KONTROL deðikenini tanýmladýk/ No reconocimos la palabra CONTROL

Dim LO As FREKANS.LowByte    'Frekans deðiþkeninin düþük byte'ý/ Byte bajo de variable de la FRECUENCIA
Dim HI As FREKANS.HighByte   'Frekans deðiþkeninin yüksek byte'ý/ Byte Alto de Variable de la FRECUENCIA

'--------------------------Portlar------------------------------
Symbol SDA = PORTA.1         'I2C'nin SDA'sý PORTA.1'ya baðlý    
Symbol SCL = PORTA.0         'I2C'nin Scl'si PORTA.0'ya baðlý
Symbol LED = PORTA.2         'LED PORTA.2'e baðlý
Symbol FI = 214              '10.7Mhz / step de 50Khz

PORTA = 0
PORTB = 0     'PORTA ve PORTB sýfýrlandý
'------------------------Eepromdan OKu--------------------------

bas:
    High LED
    Print At 1,1, " TRANSMISORES FM "
    Print At 2,1, "    JOGYWEB "
    DelayMS 3000
    FREKANS_step = ERead 02 'Frekans Deyerini EData dan okuyor/ Lectura del valor de FRECUENCIA de EData
    If  FREKANS_step > 0   Then  TsaYaz 'Frekans Bilgisi 0 Dan Büyük ise Tsa yaza gidiyor/ Si la información de FRECUENCIA es mayor que 0, Tsa ya fue programado
'----------------------Frekans Deðiþtir/Cambiar la frecuencia-------------------------
Frekans_set:
            'FREKANS_Onda = (FREKANS_step*10/2)//100
            'FREKANS_Tam =  (FREKANS_step*10/2)/100
            GoSub Operaciones
            'Print  At 1,1, "Frec: ", Dec FREKANS_Tam, ".", Dec FREKANS_Onda," MHz " 'LCD Yaz
            Print  At 1,1, "Frec: ", Dec2 Mostrar, " MHz   " 'LCD Yaz
            Print  At 2,1, " Cambiar Frecuencia " 'LCD Yaz
            DelayMS 100
            If  PORTB.5 = 1   Then  Artir_frekans 'Subir Frecuencia
            If  PORTB.7 = 1   Then  Azalt_frekans ' Bajar Frecuencia
            If  PORTB.6 = 1   Then  Kaydet_frekans' Guardar Frecuencia
           
'----------------------- Tsa5511 e yaz/Escribe a tsa5511--------------------------

            FREKANS = FREKANS_step
            I2COut SDA,SCL,$C2, [HI,LO,$8E,$10] ' I2CWRITE SDA,SCL,$C2, [HI,LO,$8E,$10]
            GoTo Frekans_set

Artir_frekans: 'Incrementa_Frecuencia
                Inc FREKANS_step' = FREKANS_step + 1                  'içeriði 5 artir/ el contenido aumenta en 5
                If FREKANS_step > 7414 Then FREKANS_step = 6214 'içerik 10800 dan büyük ise 8750 yap/ Si el contenido es mayor a 10800, lo hace 8750
                GoTo Frekans_set
           
Azalt_frekans: ' Decrementa_Frecuencia
                Dec FREKANS_step' = FREKANS_step - 1                    'içeriði 5 azalt/ reducir el contenido en 5
                If FREKANS_step < 6214 Then FREKANS_step = 7414 'içerik 8750 den küçük ise 10800 yap/ si el contenido es menor a 8750 lo hace 10800
                GoTo Frekans_set
           
'--------------------------Edataya yaz/escribir la data en la EEPROM---------------------------
Kaydet_frekans:
                EWrite 02 ,[FREKANS_step] 'Frekans Bilgisini Edataya yazýyor/ Escribe la información de FRECUENCIA en el EEPROM
                DelayMS 500
'----------------------- Tsa5511 e yaz/ Escribe el TSA5511--------------------------
TsaYaz: ' escribe el TSA
        'FREKANS_Onda = (FREKANS_step*10/2)//100
        'FREKANS_Tam = (FREKANS_step*10/2)/100
        GoSub Operaciones
        'Print  At 1,1, "Ajustando Frec.     ", Dec FREKANS_Tam, ".", Dec FREKANS_Onda, " MHz " 'lcd yaz/ escribe el LCD
        Print  At 1,1, "AjuFc. ", Dec2 Mostrar, "MHz  " 'lcd yaz/ escribe el LCD
        Print At 1,11,"."
        Print  At 2,1, " TRANSMISOR  FM " 'LCD Yaz/ Escrie el LCD
        FREKANS = FREKANS_step
        I2COut SDA,SCL,$C2, [HI,LO,$8E,$00]'I2CWRITE SDA,SCL,$C2, [HI,LO,$8E,$00]
        DelayMS 1000

'----------------------Tsa5511i Kontrol et----------------------
        If  PORTB.6 = 1 Then  Frekans_set
        I2CIn SDA,SCL,$C2,[F_KONTROL]'I2CREAD SDA,SCL,$C2,[F_KONTROL]
        If F_KONTROL.6 = 1 Then Kitli '
        GoTo TsaYaz
Kitli:                                                  
        I2COut SDA,SCL,$C2, [HI,LO,$8E,$24]'I2CWRITE SDA,SCL,$C2, [HI,LO,$8E,$24]
        'FREKANS_Onda = (FREKANS_step*10/2)//100
        'FREKANS_Tam =  (FREKANS_step*10/2)/100
        GoSub Operaciones
        'Print  At 1,1, "Frec: ", Dec FREKANS_Tam, ".", Dec FREKANS_Onda, " ", "MHz " 'lcd Yaz
        Print  At 1,1, "Frec: ", Dec2 Mostrar, "MHz   " 'lcd Yaz
        Print At 1,10,"."
        Print  At 2,1, " TRANSMISOR  FM " 'LCD Yaz
K_buton:
        DelayMS 100
        If  PORTB.5 = 1  Then  LCD_Led_Off
        If  PORTB.7 = 1  Then  LCD_Led_On
        If  PORTB.6 = 1  Then  Frekans_set
        GoTo K_buton
       
LCD_Led_On:
            High LED
            GoTo K_buton
           
LCD_Led_Off:
            Low LED
            GoTo K_buton
           

Operaciones:
            Mostrar = (FREKANS_step - FI) * 0.05
            FREKANS_Onda = (FREKANS_step * 5)//100  'FREKANS_Onda = (FREKANS_step*10/2)//100
            FREKANS_Tam = FREKANS_step * 0.05   'FREKANS_Tam = (FREKANS_step*10/2)/100
            Return          
           
End

Solo comente las líneas que daban error por la sintaxis o deje las que reforme de tal forma que se pueda apreciar las diferencias entre lo aportado y esta forma de "solución".

Como aclare, trate de solucionar tocando lo menos posible el programa original ya que si me pongo a reformar, me es mas fácil hacerlo íntegramente de nuevo a "mi gusto" y no ponerme a analizar que quiso hacer alguien.

He de aclarar que en el compilador Proton el símbolo " ' " marca el comienzo de un comentario...como el Rem del basic "tradicional" o " // " en Arduino, etc.
 

Adjuntos

  • Jorge_RX1.zip
    5.3 KB · Visitas: 15
Última edición:
.....
El programa es bastante "troglodita" sin depuraciones y optimizaciones ya que involucra cálculos idénticos en reiteradas oportunidades en vez de apuntar a una subrutina así como la falta de simplificación en las operaciones, etc.
..........

Más que troglodita fue tecleado con los muñones !!!!




.....
No tengo ganas de trabajar por demás en un proyecto que seguramente jamás realizare/usare.
..........

Y me parece muy bien, quien lo quiera que se ponga las pilas y lo haga que con esto se han aclarado muchas cosas.



Salu2.-
 
Muy buena, @ricbevi (y)

El programa es bastante "troglodita" sin depuraciones y optimizaciones ya que involucra cálculos idénticos en reiteradas oportunidades en vez de apuntar a una subrutina así como la falta de simplificación en las operaciones, etc.

Pero eso es porque las subrutinas y el código simplificado exigen usar más neuronas y obligan a una programación más estructurada.
Se asusta uno de la cantidad de código que ve así todos los días:

FREKANS_Tam = (FREKANS_step*10/2)/100
‐---------------------
Symbol FI = 214 '10.7Mhz / step de 50Khz
Acerté en el post #80. Eran 214.
‐---------------------
...es mayor que 32768, que es el valor máximo de las variables tipo WORD.
Efectivamente, falso.
Pero me dio la pista de porqué ocurria al pasar de 327,60 MHz.
Jaaaaaaa!!!!!! Eso si que es viejo!!!!
Todo trabaja en complemento a 2:
Justo lo que pensé cuando daba error en 327,70.
‐---------------------
Ya que la variable obtenida de la multiplicación por 5 no puede superar 32768... vamos a engañarla.
Sustituye:
FREKANS_Tam = (FREKANS_step*5)/100
por:
FREKANS_Tam = (FREKANS_step*0.5)/10
y me cuentas.
Luego me di cuenta de que la operación genera decimales... que no son admitidos por la variable FREKANS_Tam, de tipo WORD.
Pero no hace falta cambiar el tipo de variable a Float, Dword o SDword y liarse.
Basta con que no le lleguen los decimales:

FREKANS_Tam = INT (FREKANS_step*0.5)/10

‐------------------

Esto de los tipos de variables son sólo moderneces innecesarias.:p
Que nos lo digan a los que lidiamos en los 80 con procesadores de 8 bits (cuyos registros sólo admitían variables de tipo Byte y Word).
 
Última edición:
Hola amigos, aprecio el tiempo de ustedes respondiendo inquetudes en este tema.
Hice pruebas con el último archivo de ricbevi con respecto a la modificación en la suma de frecuencia y quedó muy bien.
Solo un detalle que no pareciera ser importante pero quise mencionarlo a modo de conocimiento es el salto de frecuencia al cambiarla. Hay momentos que es de 40 KHZ, 50 KHz y 60 KHz que si coinciden con el corrimiento en frecuencia de lo que se muestra en pantalla, quiere decir que si existen tales saltos de frecuencia en el analizador.
Podria ser la "calidad de compilación" de Proton IDE?
Hay un patron de saltos de freucencias que es este y luego se repite
300.00
300.04 40K
300.09 50K
300.14 50K
300.20 60K
300.25 50K

300.29 40K
300.34 50K
300.39 50K
300.45 60K
300.50 50K
y se repite la secuencia ... 4-5-5-6-5

 
Atrás
Arriba