Documentos de Académico
Documentos de Profesional
Documentos de Cultura
685pub PDF
685pub PDF
MEMORIA
Julio / 2006.
DISEÑO DE UN GENERADOR DE RF EN BANDA L
ÍNDICE
1
DISEÑO DE UN GENERADOR DE RF EN BANDA L
ÍNDICE
1 Memoria Descriptiva........................................................................ 5
1.1 Objeto del Proyecto ....................................................................................... 5
1.2 Posibles Soluciones y Solución Adoptada .................................................... 5
1.3 Descripción General del Equipo.................................................................... 7
1.4 Descripción General de la Solución Adoptada............................................ 10
1.4.1 Módulo 1, Sintetizador. ....................................................................... 10
1.4.2 Módulo 2, Programación mediante Microcontrolador. ....................... 25
1.4.3 Módulo 3, Vco..................................................................................... 33
1.5 Resultados y conclusiones ........................................................................... 34
1.5.1 Resultados............................................................................................ 34
1.5.2 Conclusiones........................................................................................ 38
2 Memoria de Cálculo ........................................................................ 40
2.1 Programa UMA v1.0 ................................................................................... 40
2.1.1 Algoritmo de programación por puerto paralelo ................................. 41
2.1.2 Algoritmo de programación por puerto serie ...................................... 44
2.2 Programa de gestión del Micro................................................................... 57
2.2.1 Recepción de los datos. ....................................................................... 57
2.2.2 Algoritmo de programación................................................................. 58
2.2.3 Rutinas auxiliares ................................................................................ 59
2.2.4 Función Main....................................................................................... 60
3 Planos................................................................................................ 64
3.1 Placa del circuito impreso 1......................................................................... 64
3.1.1 Situación de los componentes en placa 1 ............................................ 64
3.1.2 Mascara de cara soldadura, placa 1 ( Bottom ).................................... 65
3.2 Placa del circuito impreso 2......................................................................... 66
3.2.1 Situación de los componentes en placa 2 ............................................ 66
3.2.2 Mascara de cara soldadura placa 2 ( Top ) .......................................... 67
3.2.3 Mascara de cara soldadura placa 2 ( Bottom )..................................... 68
3.3 Placa del circuito impreso 3......................................................................... 69
3.3.1 Situación de los componentes en placa 3 ............................................ 69
3.3.2 Mascara de cara soldadura placa 3 ( Top ) .......................................... 70
3.3.3 Mascara de cara soldadura placa 3 ( Bottom )..................................... 71
2
DISEÑO DE UN GENERADOR DE RF EN BANDA L
3
DISEÑO DE UN GENERADOR DE RF EN BANDA L
MEMORIA DESCRIPTIVA
4
DISEÑO DE UN GENERADOR DE RF EN BANDA L
1 Memoria Descriptiva
1.1 Objeto del Proyecto
Para buscar una solución al problema planteado es necesario tener claro el concepto
de PLL, por eso se va a dar una pequeña explicación a modo de apunte.
5
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Fref
Fcomp = [1]
M
N
Fout = N ∗ Fcomp = ∗ Fref [2]
M
La señal de salida del comparador de fase se filtra con un filtro pasa bajos
denominado filtro de lazo, la salida del cual modifica la tensión de control de VCO y por
tanto la frecuencia del VCO. El objetivo de este filtro es solo dejar pasar variaciones lentas
de la señal de error, por tanto, idealmente, cuando las frecuencias de las dos señales de
entrada al comparador de fase son idénticas, la salida del comparador es nula, y la tensión
de control del VCO se mantiene constante.
Si por cualquier razón, por ejemplo cuando se conecta la alimentación, las
frecuencias de las dos señales no son iguales, la señal de salida del comparador no es cero,
y el filtro de lazo actúa intentando reducir la señal de salida del comparador y por tanto
intentado igualar las frecuencias, hasta llegar al estado de locking o PLL enganchado. Bajo
estas condiciones la señal de salida sigue las variaciones de la señal de referencia. Esta
propiedad se utiliza en moduladores de frecuencia, FM.
Los PLL’s modernos utilizan detectores de fase denominados charge pump, que
bombean pulsos de corriente de duración proporcional al error de fase, de manera, que el
filtro de lazo integra estos pulsos y los convierte en una señal de control para el VCO.
Normalmente se utilizan filtros pasivos para realizar el filtro de lazo.
La amplitud de los pulsos de corriente se puede programar, de manera que puedan
modificar por configuración del ancho del filtro del lazo. Normalmente, disponemos de dos
bombas una normal y otra llamada FAST. Esta segunda bomba, en determinadas
aplicaciones se utiliza con un filtro de lazo adicional que sólo actúa durante la adquisición
de frecuencias (por ejemplo cuando se cambia de canal en un móvil), ya que aumenta la
corriente, el ancho de lazo aumenta, y el tiempo de adquisición disminuye, una vez
enganchado a la nueva frecuencia se desactiva, utilizando solo la bomba normal. En otras
ocasiones, se conecta en paralelo con la normal, para dar más flexibilidad cuando se
selecciona al ancho de banda del lazo.
Los PLL`s modernos, como el UMA1021, disponen de un indicador de lock rápido,
de manera que se puede utilizar para indicar a un microprocesador si el PLL está
enganchado.
Teniendo claro el concepto de PLL y los bloques que lo componen, nos vemos
capaces de dar una solución al problema propuesto.
Hoy en día el mercado ofrece cantidad de productos similares con prestaciones muy
6
DISEÑO DE UN GENERADOR DE RF EN BANDA L
parecidas y a veces resulta difícil declinarnos por un dispositivo u otro. Nosotros nos
hemos fijado en un sintetizador de frecuencias denominado UMA1021M BICMOS de la
casa Phillips (UMA1021M Data Sheet. Low-voltage frequency synthesizer for radio telephones. Philips
Semiconductors. 1999), el datasheet de este sintetizador lo podemos encontrar en el apartado 6
de esta memoria, Anexos. Este sintetizador esta formado por dos divisores de frecuencia
(uno para la referencia y otro para la frecuencia de entrada), un comparador de fase, 1
bomba charge-pump, otra Fast y un módulo que nos permite la programación de este
sintetizador.
Una vez elegido el sintetizador nos queda por definir el oscilador que vamos a
utilizar para la frecuencia de referencia y el VCO que vamos a utilizar para corregir el error
de fase.
Para la referencia utilizaremos un cristal de cuarzo de unos 12 MHz, el cristal elegido
pertenece a la casa AEL (9710 Series Oscilador). En cuanto al VCO elegido pertenece a la
casa Mini-Circuits y es el modelo POS2000 capaz de trabajar con frecuencias de entre
1260 MHz (para V=0V) y 2000 MHz (para V=15V). Dado que utilizaremos alimentación
de 5V, el margen de sintonía se reducirá hasta unos 1450 MHz, dado que la tensión de
control no puede superar la alimentación.
Una vez determinados los componentes esenciales para la realización del PLL, sólo
nos queda especificar como vamos a programar el sintetizador.
Para programar el sintetizador, podemos utilizar el puerto paralelo del PC. A través
de este puerto se puede diseñar un programa en lenguaje C++ capaz de llevar acabo esa
gestión. Del puerto paralelo deben salir 3 líneas que vayan conectadas directamente al bus
del sintetizador sin necesidad de ningún dispositivo adicional.
Como alternativa también programaremos el sintetizador por medio de un
microcontrolador también controlado por el mismo programa de gestión antes comentado.
El microcontrolador recibirá consignas a través del puerto serie del PC. El micro será
capaz de reconocer una serie de consignas provenientes del software de gestión y de esa
forma podrá programar el sintetizador.
El equipo esta formado por una serie de bloques conectados entre sí, y a su vez estos
se dividen en subbloques dando forma y sentido al proyecto. Podríamos decir que el
equipo se divide en 3 módulos principales:
Módulo 1, Sintetizador:
• Sintetizador UMA1021M.
• Alimentación del circuito.
• Filtro de 4º Orden.
• Bus 3-wire.
• Frecuencia de referencia.
7
DISEÑO DE UN GENERADOR DE RF EN BANDA L
• Microcontrolador PIC16F876A
• Alimentación del circuito.
• Oscilador XT.
• Circuito Mclr.
• Circuito MAX232.
• Bus 3-wire.
Módulo 3, Vco
• Vco POS-2000
El equipo está diseñado para ser utilizado por usuarios del laboratorio de
comunicaciones. Dichos usuarios deberán conectar los diferentes módulos para su
posterior utilización dependiendo del tipo de programación elegida para programar el
sintetizador, siempre y cuando se utilicen los módulos por separado ya que se han hecho
diferentes diseños PCB, todos ellos igual de válidos. En el caso de elegir que la
programación sea de forma serial, se deberán conectar todos los módulos, mientras que
para una programación vía puerto paralelo se podrá prescindir del módulo 2, o sea, el
módulo que lleva el microcontrolador Pic, siempre y cuando se hallan decidido utilizar las
tres placas por separado (para mas información sobre los diseños ir a apartado 3, planos).
8
DISEÑO DE UN GENERADOR DE RF EN BANDA L
PC
MICRO
PIC16F876A
SINTETIZADOR
UMA1021M
VCO
POS-2000
9
DISEÑO DE UN GENERADOR DE RF EN BANDA L
10
DISEÑO DE UN GENERADOR DE RF EN BANDA L
11
DISEÑO DE UN GENERADOR DE RF EN BANDA L
cortocircuitemos las masas para que el integrado no sufra ningún tipo de daño. De otra
forma se nos sugiere que a la entrada de los 3 pines de alimentación incluyamos un par de
capacidades para estabilizar la entrada.
VCC
FAST LOCK
CP VCC
100nF 100pF
VDD2 GND 100nF
VSS3 XTALA
12 RFI XTALB
100nF 100pF
VSS2 VDD1
POL E_NOT
12
VCC PON DATA
VSS1 CLK
VCC
12
DISEÑO DE UN GENERADOR DE RF EN BANDA L
1,2
Iset = [3]
Rset
FAST LOCK
5k6
CPF ISET
CP VCC
VDD2 GND
VSS3 XTALA
RFI XTALB
VSS2 VDD1
POL E_NOT
PON DATA
VSS1 CLK
13
DISEÑO DE UN GENERADOR DE RF EN BANDA L
En el pin 1 nos encontramos con el modo Fast que sirve para activar el modo rápido
del módulo charge pump.
VCC
100k
FAST LOCK
CPF ISET
CP VCC
VDD2 GND
VSS3 XTALA
RFI XTALB
VSS2 VDD1
POL E_NOT
PON DATA
VSS1 CLK
14
DISEÑO DE UN GENERADOR DE RF EN BANDA L
El pin 6 como podemos ver, se usa para la recepción de la frecuencia de entrada RFI
FAST LOCK
CPF ISET
CP VCC
VDD2 GND
VSS3 XTALA
18 18 56pF
RFI XTALB
OUT VCO
VSS2 VDD1
18 56
POL E_NOT
PON DATA
RFI
15
DISEÑO DE UN GENERADOR DE RF EN BANDA L
La patilla POL sirve para indicarle a la patilla PON como se va a activar, con un “1”
o con un “0”. Nosotros hemos decidido que se active mediante un “1” con lo cual POL va
a ir conectado a Vcc. Se le pone una resistencia de 100k para limitar la corriente.
FAST LOCK
CPF ISET
CP VCC
VDD2 GND
VSS3 XTALA
RFI XTALB
1nF
VSS2 VDD1
100
POL E_NOT
VCC
PON DATA
1nF
16
DISEÑO DE UN GENERADOR DE RF EN BANDA L
100k
FAST LOCK
VCC
CPF ISET
CP VCC
VDD2 GND
VSS3 XTALA
RFI XTALB
VSS2 VDD1
POL E_NOT
PON DATA
VSS1 CLK
17
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Por lo que respecta al resto del circuito, los dos condensadores implementan polos
dominantes necesarios para estabilizar el regulador, dado que en base es un circuito
realimentado.
IN LM7805 OUT
GND
100nF
100nF
Normalmente con un filtro de tercer orden bastaría y sería suficiente (para según que
aplicaciones), pero si se quieren eliminar los espurios producidos por la frecuencia de
comparación es conveniente introducir otra red RC al filtro, pasando a ser de 4 orden. El
cálculo del filtro se ha calculado como sigue:
18
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Teniendo esto podemos empezar con el cálculo del filtro. Primero haremos
el cálculo de un filtro de tercer orden y posteriormente le aplicaremos una nueva red RC
para que se convierta en uno de cuarto orden:
Main capacitor
Kvco ∗ Icp
C2 = [6]
Wn 2 ∗ N
30 MHz ∗ 3,6mA
C2 = = 20nF
Wn 2 ∗ 7000
Damping resistor
N
R2 = 2 ∗ ζ ∗ [7]
Kvco ∗ Icp ∗ C 2
7000
R2 = 2 ∗ 0,9 ∗ = 3k 6Ω
30 MHz ∗ 3,6mA ∗ 20nF
19
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Filter capacitor
C2 C
≤ C1 ≤ 2 [8]
15 10
C1 = 2nF
R3 ≥ 2 ∗ R 2 [9]
R3 = 2 ∗ 3k 6Ω = 7 k 2Ω
R2 ∗ C 2
C3 ≤ [10]
20 ∗ R3
3k 6Ω ∗ 20nF
C3 = = 500 pF
20 ∗ 7 k 2Ω
20
DISEÑO DE UN GENERADOR DE RF EN BANDA L
C2 20nF
C1 2nF
R2 3K6
C3 500pF
FAST LOCK
CPF ISET
CP VCC
VCO IN
R3 7K2 VDD2 GND
VSS3 XTALA
RFI XTALB
VSS2 VDD1
POL E_NOT
PON DATA
VSS1 CLK
21
DISEÑO DE UN GENERADOR DE RF EN BANDA L
FAST LOCK
CPF ISET
CP VCC
VDD2 GND
VSS3 XTALA
RFI XTALB
VSS2 VDD1
POL E_NOT
PON DATA
VSS1 CLK
12 12 12
22
DISEÑO DE UN GENERADOR DE RF EN BANDA L
23
DISEÑO DE UN GENERADOR DE RF EN BANDA L
FAST LOCK
CPF ISET
CP VCC
12 Mhz VCC
VDD2 GND 1nF 10k
RFI XTALB
POL E_NOT
PON DATA
VSS1 CLK
24
DISEÑO DE UN GENERADOR DE RF EN BANDA L
25
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Los pines de los puertos pueden ser programados como pines de entrada y salida
respectivamente, cada uno independiente de los demás. La configuración de los pines que
hemos utilizado para nuestra aplicación es la siguiente: El puerto A al no utilizarlo nos es
indiferente a la hora de programarlo, mientras que el puerto B, en concreto los pines RB7,
RB6 y RB5 se han programado como salidas ya que serán los elegidos para configurar el
bus 3-wire para este módulo. Respecto al puerto C utilizado para la transmisión/recepción
de datos se comenta en el siguiente punto.
26
DISEÑO DE UN GENERADOR DE RF EN BANDA L
1N4004
Led
IN OUT
LM7805
GND
100nF 1k
47uF 100nF
27
DISEÑO DE UN GENERADOR DE RF EN BANDA L
MCLR RB7
RA0 RB6
RA1 RB5
RA2 RB4
VCC
RA3 RB3
RA4 RB2
RA5 RB1
VSS RB0
OSC1 VDD
100nF
OSC2 VSS
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
Sabiendo el valor del cristal de cuarzo requerido, para nuestro proposito de 4MHz, se
ha extraído el valor de los condensadores (15pF) necesarios de tablas de las hojas de
características del propio microcontrolador (pag. 122 del datasheet).
El microcontrolador puede trabajar a una frecuencia máxima de 20 MHz. Es
desaconsejable utilizar un cristal de esa frecuencia. Una de las razones es que hacer
trabajar a esa frecuencia al micro lo haría mucho mas sensible al ruido. Por otro lado, a
20MHz se limita el rango de voltaje de entrada entre 4,5-5,5V; mientras que para 4MHz
sería de 4,0-5,5V. Finalmente y como razón fundamental, remarcaremos que no es
necesaria ni mucho menos una frecuencia similar. Con un valor de 4MHz como el
utilizado tendremos margen temporal suficiente para el manejo de la información
manteniendo una disciplina de envío constante mediante el trabajo de USART a 9600 bps.
28
DISEÑO DE UN GENERADOR DE RF EN BANDA L
MCLR RB7
RA0 RB6
RA1 RB5
RA2 RB4
RA3 RB3
RA4 RB2
RA5 RB1
OSC1 VDD
4 Mhz
OSC2 VSS
RC0 RC7
15pF
RC1 RC6
RC2 RC5
RC3 RC4
29
DISEÑO DE UN GENERADOR DE RF EN BANDA L
VCC
10k
MCLR RB7
2
RA0 RB6
RA1 RB5
1
RA2 RB4
4,7uF
RA3 RB3
RA5 RB1
VSS RB0
OSC1 VDD
OSC2 VSS
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
El MAX232 dispone de dos canales de entrada para niveles TTL, que son el T1IN y
el T2IN, con sus correspondientes salidas: T1OUT y T2OUT. También posee dos canales
de entrada para niveles RS-232 R1IN y R2IN y sus correspondientes salidas, R1OUT y
R2OUT. Se alimenta con +5 V.
30
DISEÑO DE UN GENERADOR DE RF EN BANDA L
C1+ VCC
VCC
1uF
1uF VS+ GND
5
C1- T1OUT 9
4
C2+ R1IN 8
1uF 3
C2- R1OUT 7
2
VS- T1IN 6
1
1uF T2OUT T2IN
RX PIC
R2IN R2OUT
TX PIC
31
DISEÑO DE UN GENERADOR DE RF EN BANDA L
MCLR RB7
CLK
RA0 RB6
DATA
RA1 RB5
E_NOT
RA2 RB4
RA3 RB3
RA4 RB2
RA5 RB1
VSS RB0
OSC1 VDD
OSC2 VSS
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
32
DISEÑO DE UN GENERADOR DE RF EN BANDA L
POS2000 VCO
TUNE GND
IN VCO
GND GND
GND GND
OUT VCC
OUT VCO VCC
IN LM7812 OUT
GND
100nF
100nF
33
DISEÑO DE UN GENERADOR DE RF EN BANDA L
1.5.1 Resultados
Los resultados obtenidos son óptimos. Por eso nos damos por satisfechos viendo los
resultados obtenidos en el laboratorio.
Como ejemplo de estos resultados hemos hecho medidas tales como: el tiempo de
commutación entre frecuencias y la obtención del ruido de fase. Un ejemplo de estas
medidas son comentadas a continuación:
En la figura 26, podemos apreciar el tiempo que pasa a la hora de cambiar de una
frecuencia baja a una mas alta, que es del orden de unos 300 µS , y la inyección de pulsos
que hacen posible el enganche de la nueva frecuencia.
100
Figura 26. Tiempo de commutación.
34
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Para apreciar el ruido de fase hemos aplicado el criterio mostrado en la figura 27.
RBW
L( f )dBc / Hz = −( Ps − Pssb ) − 10 log10 ( ) [11]
1Hz
3KHz
L( f )dBc / Hz = −61,1 − 10 log10 ( )
1Hz
L( f )dBc / Hz = −61,1 − 34,77 = − 95,87 dBc / Hz
35
DISEÑO DE UN GENERADOR DE RF EN BANDA L
En la figura 29, repetimos la medida pero en este caso a − 100 KHz de la frecuencia
de enganche 1,399GHz , resultando el siguiente ruido de fase:
RBW
L( f )dBc / Hz = −( Ps − Pssb ) − 10 log10 ( ) [11]
1Hz
3KHz
L( f )dBc / Hz = −66,2 − 10 log10 ( )
1Hz
L( f )dBc / Hz = −66,2 − 34,77 = − 100,97 dBc / Hz
36
DISEÑO DE UN GENERADOR DE RF EN BANDA L
RBW
L( f )dBc / Hz = −( Ps − Pssb ) − 10 log10 ( ) [11]
1Hz
1KHz
L( f )dBc / Hz = −44,9 − 10 log10 ( )
1Hz
L( f )dBc / Hz = −44,9 − 30 = − 74,9dBc / Hz
37
DISEÑO DE UN GENERADOR DE RF EN BANDA L
1.5.2 Conclusiones
Otra posible mejora está relacionada con la sensibilidad del sistema y el alcance del
mismo. Se podría mejorar el diseño del filtro para poder trabajar con todo el ancho de
banda que nos es capaz de proporcionar el VCO. De otra forma también se podría trabajar
para reducir el ruido de fase e incluir un atenuador variable para poder modificar la
potencia de salida, ya que ahora es fija.
38
DISEÑO DE UN GENERADOR DE RF EN BANDA L
MEMORIA DE CÁLCULO
39
DISEÑO DE UN GENERADOR DE RF EN BANDA L
2 Memoria de Cálculo
40
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función que genera la señal de nivel bajo del clk
//---------------------------------------------------------------------//
void clockd()
{
int x;
x=PortIn(LPT1i);
x=x&254;
PortOut(LPT1o,x);
}
Esta función nos sirve para generar el nivel bajo de la señal de reloj. Como se
puede observar es realmente sencillo. Únicamente hemos de saber la dirección del puerto
paralelo y el pin exacto donde queremos generar la señal de nivel bajo. Nosotros hemos
elegido el pin D0 para generar la señal de clk.
//---------------------------------------------------------------------//
// Función que genera la señal de nivel alto del clk
//---------------------------------------------------------------------//
void clockup()
{
int x,i;
x=PortIn(LPT1i);
x=x|1;
PortOut(LPT1o,x);
}
Esta función al igual que la anterior, sirve para generar la señal de clk, aunque esta
a diferencia de la otra genera el nivel alto.
41
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función que genera la señal de habilitación del sintetizador
//---------------------------------------------------------------------//
void endown()
{
int x;
x=PortIn(LPT1i);
x=x&251;
PortOut(LPT1o,x);
}
//---------------------------------------------------------------------//
// Función que genera la señal de inhabilitación del sintetizador
//---------------------------------------------------------------------//
void enup()
{
int x;
x=PortIn(LPT1i);
x=x|4;
PortOut(LPT1o,x);
}
Estas dos funciones sirven para generar tanto la señal de habilitación como la de
inhabilitación de escritura en los registros del sintetizador. Funciona de igual forma que la
señal de reloj con la única diferencia que esta señal se escribe en el pin D2 del puerto
paralelo.
La señal de datos se explicará mas adelante. La función que nos ocupa en estos
momentos se denomina db(int decimal). Esta función sirve para convertir un número
entero en una secuencia binaria, o para ser mas claros convierte un número de notación
decimal a binario.
42
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función que convierte un entero en una secuencia binaria
//---------------------------------------------------------------------//
db(int decimal)
{
int dummy=decimal,i=0;
while (i<17)
{
data[i]= fmod(dummy,2);
dummy = dummy/2;
i++;
}
return (0);
}
Ya que la señal de datos es una señal que se propaga de forma serie por el pin D1
del puerto paralelo, de ahí la necesidad de convertir enteros en secuencias binarias.
La siguiente y última función sirve tanto como para generar la señal de datos, como
para programar y utilizar todas las funciones antes comentadas. De echo esta función es la
que programa al sintetizador.
//---------------------------------------------------------------------//
// Función que programa al sintetizador utilizando el puerto paralelo
//---------------------------------------------------------------------//
void latch (int *addr, int *data)
{
int x,i;
clockup();
endown();
ctr.cont=0;
for (i=16;i>=0;i--)
{
x=PortIn(LPT1i);
if (data[i]==1){ x=x|2;}
if (data[i]==0){ x=x&253;}
PortOut(LPT1o,x);
clockd();
x=PortIn(LPT1i);
clockup();
ctr.cont=ctr.cont+1;
}
43
DISEÑO DE UN GENERADOR DE RF EN BANDA L
for (i=3;i>=0;i--)
{
x=PortIn(LPT1i);
if (addr[i]==1){ x=x|2;}
if (addr[i]==0){x=x&253;}
PortOut(LPT1o,x);
clockd();
x=PortIn(LPT1i);
clockup();
ctr.cont=ctr.cont+1;
}
enup();
}
Con esto, queda claro como programamos el sintetizador por medio del puerto
paralelo. Hay que decir, que el código completo, está en el apartado de Anexos, pues se ha
creído únicamente comentar la generación de las señales que hacen posible la
programación del dispositivo.
44
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función de Borland que nos permite enviar toda información al micro
// para que este programe con la información recibida el sintetizador
//---------------------------------------------------------------------//
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
int j;
charA="a";
if((RadioButton5->Checked==true))
{
/----------------------------------------------------------------------/
/ Aquí va la rutina/s de programación por puerto paralelo (…..)
/ no las comentamos ya que se trataron en el apartado anterior
/----------------------------------------------------------------------/
}
/-----------------------------------------------------------------------/
/ Programación Por el Puerto Serie
/-----------------------------------------------------------------------/
// seleccionamos programación por puerto serie
if((RadioButton6->Checked==true))
{
if(ctr.tmp)
{
// variable que tiene que estar a uno para que
// podamos entrar, de esta manera
// se evita que el usuario le de a la tecla
// grabar dispositivo, reiteradamente.
// Se podría decir que es una protección
45
DISEÑO DE UN GENERADOR DE RF EN BANDA L
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00; // Limpiamos nuestro buffer de información
} // de entrada al Pc
ccc=0;
do{
Sleep(100); // Retardo de 100 ms
// Esperamos que el micro nos envie ‘g’
// que no es mas, que el eco del carácter
// enviado previamente
flagm=1;
ccc=6;
}
ccc++;
}while(ccc<6);
46
DISEÑO DE UN GENERADOR DE RF EN BANDA L
if(flagm==0)
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Micro NO Conectado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
Memo1->Clear();
}
47
DISEÑO DE UN GENERADOR DE RF EN BANDA L
}
if(data[j]==0)
{
tramaA[j]='0';
}
}
strrev(tramaA); // Esta función invierte la tramaA
48
DISEÑO DE UN GENERADOR DE RF EN BANDA L
for(j=0;j<17;j++)
{
if(data[j]==1)
{
tramaC[j]='1';
}
if(data[j]==0)
{
tramaC[j]='0';
}
}
strrev(tramaC); // Invertimos la tramaC
49
DISEÑO DE UN GENERADOR DE RF EN BANDA L
do{
Sleep(100); // Retardo de 100 ms
// Leo el Puerto serie
ReadFile(hcomPort, acBuf, dwlen, &dwBytRea, 0);
// Empieza la comparación
if(acBuf[21]=='a')
{
for(ii=0;ii<22;ii++)
{
// En el caso que las tramas recibidas sean diferentes
// se nos informa de ello
50
DISEÑO DE UN GENERADOR DE RF EN BANDA L
if(tramaA[ii]!=acBuf[ii])
{
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < -ERROR- TramaA incorrecta >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
flagError=1;
}
}
flag=1;
}
}while(flag==0);
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flag=0;
do{
ReadFile(hcomPort, acBuf, dwlen, &dwBytRea, 0);
if(acBuf[21]=='b')
{
for(ii=0;ii<22;ii++)
{
if(tramaB[ii]!=acBuf[ii])
{
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < -ERROR- TramaB incorrecta >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
51
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Sleep(2000);
flagError=1;
}
}
flag=1;
}
}while(flag==0);
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flag=0;
do{
ReadFile(hcomPort, acBuf, dwlen, &dwBytRea, 0);
if(acBuf[21]=='c')
{
for(ii=0;ii<22;ii++)
{
if(tramaC[ii]!=acBuf[ii])
{
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < -ERROR- TramaC incorrecta >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
flagError=1;
}
}
flag=1;
}
}while(flag==0);
} // Fin del if en el caso de haber elegido verificación
52
DISEÑO DE UN GENERADOR DE RF EN BANDA L
// Una vez sabemos que las tramas están bien le digo al micro
// que empiece a programar el
// sintetizador. En el caso de no elegir la verificación de las
// tramas entraríamos en esta
// rutina directamente
if(flagError==0)
{
Sleep(1000);
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" <...en programación>");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
do{
53
DISEÑO DE UN GENERADOR DE RF EN BANDA L
ccb=0;
Sleep(100);
54
DISEÑO DE UN GENERADOR DE RF EN BANDA L
do{
// Esperamos la llega del commando ‘l’
if(acBuf[0]=='l') {
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < PLL Enganchado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo2->Color = clRed;
Sleep(2000);
Memo2->Color = clLime;
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flagp=0;
ccb=1;
ccc=0;
}
if((ccc==1500)&&(flagp==1)&&(ccb==0))// si no se cumple informamos
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < No Engancha o Out of Lock >");
Memo1->Lines->Add(" < no está habilitado >");
55
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Memo1->Lines->Add("");
Memo2->Color = clLime;
ccc=0;
flagp=0;
}
}while(flagp==1);
flagp=0;
}
else
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Vuelve a intentarlo >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
}
flagm=0;
}
}//fin if ctr.tmp
ctr.tmp=0;
}//fin if serie
}
56
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Rutina de servicio a la interrupción
//---------------------------------------------------------------------//
#int_rda
void serial_isr()
{
if(kbhit()) // Si llega algo
{
cc=0x00; // Inicializamos la variable
cc=getc();// La función getc() nos da el dato capatado del exterior
if((cc!='a')&&(cc!='b')&&(cc!='c')&&(cc!='d')&&(cc!='e'))
{ Add_buffrec(cc);} // Acumulamos los datos que no son consignas
if(cc=='a'){flaga=1;} // Flag que nos indica fin de la 1ª trama
if(cc=='b'){flagb=1;} // Flag que nos indica fin de la 2ª trama
57
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Cuando llega un dato que no es de información se activa una bandera o flag que nos
servirá o no, para ejecutar una acción mientras que si el dato recibido es una dato de
información se acumula en un buffer para su posterior tratado.
Una vez llegada toda la información necesaria para programar el sintetizador, solo
queda generar las señales adecuadas y el sintetizador recibirá toda la información que le
hará ser funcional.
//---------------------------------------------------------------------//
// Esta función hace los pasos para meter los datos en el registro del
// sintetizador del chip, en su dirección addr y con datos data
//---------------------------------------------------------------------//
void latch (char *data)
{
int i;
output_high(PIN_B7); // Señal de clk a nivel alto
output_low(PIN_B5); // Señal de habilitación a nivel bajo
for (i=0;i<21;i++) // Introducción de # y @
{
if (data[i]=='1')
{
output_high(PIN_B6); // Señal de datos equivalente a un 1 lógico
}
if (data[i]=='0')
{
output_low(PIN_B6); // Señal de datos equivalente a un 0 lógico
}
output_low(PIN_B7); // Señal de clk a nivel bajo
output_high(PIN_B7); // Señal de clk a nivel alto
58
DISEÑO DE UN GENERADOR DE RF EN BANDA L
}
output_high(PIN_B5); // Señal de habilitación a nivel alto
}
A lo largo del programa se utilizan una serie de rutinas que aunque no son la piedra
angular del código, sin ellas no podríamos trabajar. Las rutinas son las siguientes:
//---------------------------------------------------------------------//
// Inicialización del Buffer de recepción y tramas
//---------------------------------------------------------------------//
void Ini_buff_rec(void)
{
int i;
for(i=0;i<MAXLENBUFF;i++)
{
buffrec[i]=0x00;
}
if(flagr==1)
{
for(i=0;i<MAXLENBUFF;i++)
{
tramaA[i]=0x00;
tramaB[i]=0x00;
tramaC[i]=0x00;
}
flagr=0;
}
xbuffrec=0x00;
}
59
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Acumula los datos de información que entran por la USART
//---------------------------------------------------------------------//
void Add_buffrec(char c)
{
buffrec[xbuffrec++]=c;
}
//---------------------------------------------------------------------//
// Inicialización tras Reset del Micro
//---------------------------------------------------------------------//
void On_reset(void)
{
flagr=1;
output_low(PIN_B7);
output_low(PIN_B6);
output_high(PIN_B5);
disable_interrupts(GLOBAL);
delay_ms(100);
Ini_buff_rec();
enable_interrupts(int_rda);
enable_interrupts(global);
}
//---------------------------------------------------------------------//
// Copia de las tramas recibidas.
//---------------------------------------------------------------------//
if(flaga==1)
{
strcpy(tramaA,buffrec);// Función que copia el string buffrec en tramaA
Ini_buff_rec();
flaga=0;
}
60
DISEÑO DE UN GENERADOR DE RF EN BANDA L
if(flagb==1)
{
strcpy(tramaB,buffrec);// Función que copia el string buffrec en tramaB
Ini_buff_rec();
flagb=0;
}
if(flagc==1)
{
strcpy(tramaC,buffrec);// Función que copia el string buffrec en tramaC
Ini_buff_rec();
flagc=0;
}
//---------------------------------------------------------------------//
// Verifica las trama recibidas
//---------------------------------------------------------------------//
if(flagd==1)
{
for(j=0;j<21;j++){ // Enviamos la tramaA al PC para que la compare
putc(tramaA[j]);} // de esta forma sabemos si es corrupta
putc(cc='a');
delay_ms(10);
for(j=0;j<21;j++){ // Enviamos la tramaB al PC para que la compare
putc(tramaB[j]);}
putc(cc='b');
delay_ms(10);
for(j=0;j<21;j++){ // Enviamos la tramaC al PC para que la compare
putc(tramaC[j]);}
putc(cc='c');
flagd=0;
}
61
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Programación del sintetizador
//---------------------------------------------------------------------//
if(flage==1)
{
cont=0;
latch(tramaA); // Función que genera las señales de programación
latch(tramaB); // Función que genera las señales de programación
latch(tramaC); // Función que genera las señales de programación
putc(cc='f'); // Envío por Tx a PC... dispositivo programado
On_reset();
flage=0;
flagl=1;
}
//---------------------------------------------------------------------//
// Detecta el “enganche” o estado de “locking” del sintetizador.
//---------------------------------------------------------------------//
if((input(PIN_B4)==0)&&(flagl==1))
{
putc(cc='l');// Si en el pin B4 leemos un ‘0’ el programa envia por
// TX un comando
flagl=0; // que nos indica que el sintetizador esta enganchado
On_reset();
}
62
DISEÑO DE UN GENERADOR DE RF EN BANDA L
PLANOS
63
DISEÑO DE UN GENERADOR DE RF EN BANDA L
3 Planos
64
DISEÑO DE UN GENERADOR DE RF EN BANDA L
65
DISEÑO DE UN GENERADOR DE RF EN BANDA L
66
DISEÑO DE UN GENERADOR DE RF EN BANDA L
67
DISEÑO DE UN GENERADOR DE RF EN BANDA L
68
DISEÑO DE UN GENERADOR DE RF EN BANDA L
69
DISEÑO DE UN GENERADOR DE RF EN BANDA L
70
DISEÑO DE UN GENERADOR DE RF EN BANDA L
71
DISEÑO DE UN GENERADOR DE RF EN BANDA L
72
DISEÑO DE UN GENERADOR DE RF EN BANDA L
73
DISEÑO DE UN GENERADOR DE RF EN BANDA L
74
DISEÑO DE UN GENERADOR DE RF EN BANDA L
75
DISEÑO DE UN GENERADOR DE RF EN BANDA L
76
DISEÑO DE UN GENERADOR DE RF EN BANDA L
77
DISEÑO DE UN GENERADOR DE RF EN BANDA L
PRESUPUESTO
78
DISEÑO DE UN GENERADOR DE RF EN BANDA L
4 Presupuesto
4.1 Mediciones
PIC 16F876A
2.3 U MICROCONTROLADOR PIC 16F876A 1 1
DE 28 PINES 1
VCO POS2000
2.4 U VCO POS2000 CON UN RANGO DE 1 1
FRECUENCIAS DE 1370 A 2000 MHz 1
CONDENSADOR 1uf
2.5 U 4 4
CONDENSADOR ELETROLÍTCO 1uf 4
CONDENSADOR 100nf
2.6 U 4 4
CONDENSADOR CERÁMICO 100nf 4
CONDENSADOR 47uf
2.7 U 1 1
CONDENSADOR ELECTROLÍTCO 1
47uf
CONDENSADOR 4,7uf
2.8 U 1 1
CONDENSADOR ELECTROLÍTCO 1
4,7uf
79
DISEÑO DE UN GENERADOR DE RF EN BANDA L
CONDENSADOR 15pf
2.9 U 2 2
CONDENSADOR CERÁMICO 15pf 2
DIODO
2.17 U 1 1
DIODO MODELO 1N4004 1
LED VERDE
2.18 U 1 1
DIODO EMISOR DE LUZ 3mm COLOR 1
VERDE
LM7805
2.19 U 2 2
REGULADOR DE TENSIÓN MODELO 2
LM7805
LM7812
2.19 U 1 1
REGULADOR DE TENSIÓN MODELO 1
LM7812
OSCILADOR 4MHz
2.20 U 1 1
CRISTAL DE CUARZO DE 4MHz 1
OSCILADOR 12MHz
2.21 U 1 1
OSCILADOR XTAL 12MHz 1
RESISTENCIA 10K
2.22 U 1 1
RESISTENCIA DE 10K ¼ W 1
RESISTENCIA 1K
2.23 U 1 1
RESISTENCIA DE 1K ¼ W 1
RESISTENCIA 100
2.24 U 1 1
RESISTENCIA DE 100 ¼ W 1
80
DISEÑO DE UN GENERADOR DE RF EN BANDA L
81
DISEÑO DE UN GENERADOR DE RF EN BANDA L
CABLE ALIMENTACIÓN
4.7 U CABLE ALIMENTACIÓN 3 3
3
ROJO/NEGRO
CABLE PLANO
4.8 U CABLE PLANO BUS 5 HILOS 1 1
1
Capítulo 5: Varios.
82
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Nº Ud Descripción Precio ( € )
HORAS DE DISEÑO PROTOTIPO
1.1 H HORAS DE DISEÑO Y DESARROLLO 40 CUARENTA EUROS
DEL PROTOTIPO
Nº Ud Descripción Precio ( € )
MAX232
UMA1021M
CUATRO EUROS CON
2.2 U C.I. UMA1021M SSOP20 4,40 CUARENTA CÉNTIMOS
SINTETIZADOR DE FRECUENCIAS
PIC 16F876A
NUEVE EUROS CON
2.3 U 9,7
MICROCONTROLADOR PIC 16F876A SETENTA CÉNTIMOS
DE 28 PINES
VCO POS2000
CUATRO EUROS CON 12
2.4 U VCO POS2000 CON UN RANGO DE 4,12 CÉNTIMOS
FRECUENCIAS DE 1370 A 2000 MHz
CONDENSADOR 1uf
2.5 U 0,13 TRECE CÉNTIMOS
CONDENSADOR ELETROLÍTCO 1uf
CONDENSADOR 100nf
2.6 U 0,12 DOCE CÉNTIMOS
CONDENSADOR CERÁMICO 100nf
CONDENSADOR 47uf
2.7 U 0,13 TRECE CÉNTIMOS
CONDENSADOR ELECTROLÍTCO
47uf
CONDENSADOR 4,7uf
2.8 U 0,13 TRECE CÉNTIMOS
CONDENSADOR ELECTROLÍTCO
4,7uf
CONDENSADOR 15pf
2.9 U 0,10 DIEZ CÉNTIMOS
CONDENSADOR CERÁMICO 15pf
CONDENSADOR SMD 100pf
2.10 U 0,10 DIEZ CÉNTIMOS
CONDENSADOR SMD 1206 100pf
83
DISEÑO DE UN GENERADOR DE RF EN BANDA L
OSCILADOR 12MHz
OCHENTA Y CUATRO
2.21 U 0,84
OSCILADOR XTAL 12MHz CÉNTIMOS
RESISTENCIA 10K
2.22 U 0,10 DIEZ CÉNTIMOS
RESISTENCIA DE 10K ¼ W
RESISTENCIA 1K
2.23 U 0,10 DIEZ CÉNTIMOS
RESISTENCIA DE 1K ¼ W
RESISTENCIA 100
2.24 U 0,08 OCHO CÉNTIMOS
RESISTENCIA DE 100 ¼ W
84
DISEÑO DE UN GENERADOR DE RF EN BANDA L
RESISTENCIA SMD 18
2.27 U 0,08 OCHO CÉNTIMOS
RESISTENCIA SMD 1206 DE 18 ¼ W
RESISTENCIA SMD 56
2.28 U 0,08 OCHO CÉNTIMOS
RESISTENCIA SMD 1206 DE 56 ¼ W
RESISTENCIA SMD 5K6
2.29 U 0,10 DIEZ CÉNTIMOS
RESISTENCIA SMD 1206 DE 5K6 ¼ W
MICRO PULSADOR
OCHENTA Y SIETE
2.34 U 0,87 CÉNTIMOS
MICRO PULSADOR 4 CONTACTOS
Nº Ud Descripción Precio ( € )
CIRCUITO IMPRESO
DOS EUROS CON
3.1 U PLACA CIRCUITO IMPRESO DOBLE 2,15 QUINCE CÉNTIMOS
CARA 50x100 mm
CIRCUITO IMPRESO
DOS EUROS CON
3.2 U PLACA CIRCUITO IMPRESO UNA 2,60 SESENTA CÉNTIMOS
CARA 80x90 mm
CIRCUITO IMPRESO
UN EURO CON
3.3 U PLACA CIRCUITO IMPRESO DOBLE 1,80 OCHENTA CENTIMOS
CARA 30x40 mm
85
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Nº Ud Descripción Precio ( € )
CONECTOR DB9
UN EURO CON ONCE
4.1 U CONECTOR PARA PCB DB9 HEMBRA 1,11 CÉNTIMOS
ACODADO
Capítulo 5: Varios.
Nº Ud Descripción Precio ( € )
SOPORTE METACRILATO
TRES EUROS CON
5.1 U SOPORTE PARA PCB’S DE 3,21 VEINTIÚN CÉNTIMOS
METACRILATO
86
DISEÑO DE UN GENERADOR DE RF EN BANDA L
CONDENSADOR 100nf
2.6 U 4 0,12 0,48
CONDENSADOR CERÁMICO 100nf
CONDENSADOR 47uf
2.7 U 1 0,13 0,13
CONDENSADOR ELECTROLÍTCO 47uf
CONDENSADOR 4,7uf
2.8 U 1 0,13 0,13
CONDENSADOR ELECTROLÍTCO 4,7uf
CONDENSADOR 15pf
2.9 U 2 0,10 0,20
CONDENSADOR CERÁMICO 15pf
87
DISEÑO DE UN GENERADOR DE RF EN BANDA L
DIODO
2.17 U 1 0,21 0,21
DIODO MODELO 1N4004
LED VERDE
2.18 U 1 0,11 0,11
DIODO EMISOR DE LUZ 3mm COLOR
VERDE
LM7805
2.19 U 2 0,43 0,86
REGULADOR DE TENSIÓN MODELO
LM7805
LM7812
2.19 U 1 0,52 0,52
REGULADOR DE TENSIÓN MODELO
LM7812
OSCILADOR 4MHz
2.20 U 1 0,70 0,70
CRISTAL DE CUARZO DE 4MHz
OSCILADOR 12MHz
2.21 U 1 0,84 0,84
OSCILADOR XTAL 12MHz
RESISTENCIA 10K
2.22 U 1 0,10 0,10
RESISTENCIA DE 10K ¼ W
RESISTENCIA 1K
2.23 U 1 0,10 0,10
RESISTENCIA DE 1K ¼ W
RESISTENCIA 100
2.24 U 1 0,08 0,08
RESISTENCIA DE 100 ¼ W
88
DISEÑO DE UN GENERADOR DE RF EN BANDA L
RESISTENCIA SMD 12
2.26 U 7 0,08 0,56
RESISTENCIA SMD 1206 DE 12 ¼ W
RESISTENCIA SMD 18
2.27 U 3 0,08 0,24
RESISTENCIA SMD 1206 DE 18 ¼ W
RESISTENCIA SMD 56
2.28 U 1 0,08 0,08
RESISTENCIA SMD 1206 DE 56 ¼ W
MICRO PULSADOR
2.34 U 1 0,87 0,87
MICRO PULSADOR 4 CONTACTOS
89
DISEÑO DE UN GENERADOR DE RF EN BANDA L
CABLE SMA
4.5 U CABLE CONEXION SMA MACHO- 3 1,98 5,94
MACHO
CONECTOR 5x1 SMD
4.6 U CONECTOR 5x1 SMD TIPO REGLETA 1 0,24 0,24
CABLE ALIMENTACIÓN
4.7 U CABLE ALIMENTACIÓN ROJO/NEGRO 3 0,97 2,91
90
DISEÑO DE UN GENERADOR DE RF EN BANDA L
CABLE PLANO
4.8 U CABLE PLANO BUS 5 HILOS 1 0,54 0,54
Capítulo 5: Varios.
91
DISEÑO DE UN GENERADOR DE RF EN BANDA L
• Osciloscopio digital.
• Espectómetro.
• Grabador depurador de PIC´s ICD.
• PC.
• Software de generación y depuración del código del Micro, MPLAB.
• Software de generación y depuración del código del programa UMA, Borland
Builder C++.
• Software para el diseño de los circuitos, Orcad.
• Soldador.
• Taladro.
TOTAL 16063,11€
BIBLIOGRAFÍA
93
DISEÑO DE UN GENERADOR DE RF EN BANDA L
5 Bibliografía
[1] UMA1021M DataSheet. Low-voltage frequency synthesizer for radio telephones. Philips
Semiconductors. 1999.
[3] Mª Auxilio Recasens Bellver, José González Calabuig. “Diseño de Circuitos Impresos con OrCad
Capture y Layout v.9.2”. Ed: Thomson. ISBN: 84-9732-071-9.
[4] Ángulo Usategui, J. M. Angulo Martínez, I. Romero Yesa, S. “Microcontroladores Pic. Diseño
Práctico de Aplicaciones. Segunda Parte: Pic 16F87X”. Ed: Mc Graw-Hill, 2000. ISBN: 84-841-
2858-3.
[5] Esteban del Castillo.”Apuntes de Informática Industrial II”. Departament d´Enginyeria Electrònica
Elèctrica i Automàtica. 2003-2004.
[6] Marcos Faúndez Zanvy. “Circuitos electrónicos para sistemas de comunicaciones”. Ed: CEYSA .
[7] Keliu Shu, Edgar Sánchez-Sinencio. “CMOS PLL Synthesizers Análisis and Design”. Ed: Springer.
[8] Venceslao F.Kroupa.”Phase Lock Loops And Frequency Synthesis”. Ed: WILEY.
[9] Antonio Ramón Lázaro.”Apuntes de Laboratorio de Comunicaciones, Phase lock Loop (Tema 6)”.
94
DISEÑO DE UN GENERADOR DE RF EN BANDA L
[2] http://www.amidata.es [Rs online es una página web dedicada a la venta de componentes
electrónicos y eléctricos de entre sus productos mas destacados].
[4] http://www.functionx.com [Web que dedica todos sus recursos al lenguaje de programacion C++ en
diferentes plataformas].
95
DISEÑO DE UN GENERADOR DE RF EN BANDA L
ANEXOS
96
DISEÑO DE UN GENERADOR DE RF EN BANDA L
6 Anexos
El software de gestión UMA v1.0 está diseñado en una plataforma visual. El objeto
de este entorno visual se debe a una mejora en la compresión del programa por parte del
usuario.
Aunque a simple vista no presenta ningún tipo de dificultad y resulta muy intuitivo,
se dará una explicación de las partes que componen este programa.
97
DISEÑO DE UN GENERADOR DE RF EN BANDA L
• Selección de Frecuencias
98
DISEÑO DE UN GENERADOR DE RF EN BANDA L
99
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Una vez seleccionadas y configuradas las posibles opciones, sólo nos queda
programar el sintetizador. Para dar la orden de programación únicamente se ha de hacer un
“click” en el siguiente botón:
100
DISEÑO DE UN GENERADOR DE RF EN BANDA L
GLOSARIO
101
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Proyecto Final de Carrera - Generador Rf en Banda L.
// Programación del sintetizador de frecuencias UMA1021M
// Código fuente del programa residente en el microcontrolador
// Autor: Jose A. García-Uceda Calvo
//---------------------------------------------------------------------//
#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <stdlib.h>
#include <string.h>
//---------------------------------------------------------------------//
// Constantes, definiciones y variables
//---------------------------------------------------------------------//
char buffrec[MAXLENBUFF];
char tramaA[MAXLENBUFF];
char tramaB[MAXLENBUFF];
char tramaC[MAXLENBUFF];
//---------------------------------------------------------------------//
// Declaración de Funciones
//---------------------------------------------------------------------//
void On_reset(void);
void Ini_buffrec(void);
102
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Interrupción RDA - Recepción USART -
//---------------------------------------------------------------------//
#int_rda
void serial_isr()
{
if(kbhit())
{
cc=0x00;
cc=getc();
if((cc!='a')&&(cc!='b')&&(cc!='c')&&(cc!='d')&&(cc!='e'))
{ Add_buffrec(cc);}
if(cc=='a'){flaga=1;}
if(cc=='b'){flagb=1;}
if(cc=='c'){flagc=1;}
if(cc=='d'){flagd=1;}
if(cc=='e'){flage=1;}
if(cc=='g'){flagg=1;}
}
}
//---------------------------------------------------------------------//
//Rutinas de programación del sintetizador
//---------------------------------------------------------------------//
//---------------------------------------------------------------------//
// Esta función hace los pasos para meter los datos en el registro del
// sintetizador del chip, en su dirección addr y con datos data
//---------------------------------------------------------------------//
void latch (char *data)
{
int i;
output_high(PIN_B7); // CLK
output_low(PIN_B5); // ENOT
// Introduccion de # y @
103
DISEÑO DE UN GENERADOR DE RF EN BANDA L
for (i=0;i<21;i++)
{
if (data[i]=='1')
{
output_high(PIN_B6); // DATA
}
if (data[i]=='0')
{
output_low(PIN_B6);
}
output_low(PIN_B7); // CLK
output_high(PIN_B7); // CLK
}
output_high(PIN_B5); // ENOT
}
//---------------------------------------------------------------------//
// Inicialización del buffer de Recepción y las Tramas
//---------------------------------------------------------------------//
void Ini_buff_rec(void)
{
int i;
for(i=0;i<MAXLENBUFF;i++)
{
buffrec[i]=0x00;
}
if(flagr==1)
{
for(i=0;i<MAXLENBUFF;i++)
{
tramaA[i]=0x00;
tramaB[i]=0x00;
tramaC[i]=0x00;
}
flagr=0;
}
xbuffrec=0x00;
}
104
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Acumula los datos de información que entran por la USART
//---------------------------------------------------------------------//
void Add_buffrec(char c)
{
buffrec[xbuffrec++]=c;
}
//---------------------------------------------------------------------//
// Inicialización tras Reset del Micro
//---------------------------------------------------------------------//
void On_reset(void)
{
flagr=1;
output_low(PIN_B7);
output_low(PIN_B6);
output_high(PIN_B5);
disable_interrupts(GLOBAL);
delay_ms(100);
Ini_buff_rec();
enable_interrupts(int_rda);
enable_interrupts(global);
}
//---------------------------------------------------------------------//
// Función principal Main
//---------------------------------------------------------------------//
main()
{
On_reset();
do {
if(flaga==1)
{
strcpy(tramaA,buffrec);
Ini_buff_rec();
105
DISEÑO DE UN GENERADOR DE RF EN BANDA L
flaga=0;
}
if(flagb==1)
{
strcpy(tramaB,buffrec);
Ini_buff_rec();
flagb=0;
}
if(flagc==1)
{
strcpy(tramaC,buffrec);
Ini_buff_rec();
flagc=0;
}
if(flagd==1)
{
//Verificar las tramas enviadas envio hacia el PC de las 3 tramas
for(j=0;j<21;j++){
putc(tramaA[j]);}
putc(cc='a');
delay_ms(10);
for(j=0;j<21;j++){
putc(tramaB[j]);}
putc(cc='b');
delay_ms(10);
for(j=0;j<21;j++){
putc(tramaC[j]);}
putc(cc='c');
flagd=0;
}
if(flage==1)
{
cont=0;
latch(tramaA);
latch(tramaB);
latch(tramaC);
putc(cc='f');
On_reset();
flage=0;
106
DISEÑO DE UN GENERADOR DE RF EN BANDA L
flagl=1;
}
if(flagg==1)
{
putc(cc='g');
On_reset();
flagg=0;
}
if((input(PIN_B4)==0)&&(flagl==1))
{
putc(cc='l');
flagl=0;
On_reset();
}
}while(True);
return(0);
}
107
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Proyecto Final de Carrera - Generador Rf en Banda L.
// Software Para la programación del sintetizador de frecuencias UMA1021M
// A través del puerto paralelo o puerto serie
// Autor: Jose A. García-Uceda Calvo
//---------------------------------------------------------------------//
#include <vcl.h>
#include <windows.h>
#include <mmsystem.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------//
#include "Unit1.h"
#include "io.h"
//---------------------------------------------------------------------//
#pragma resource "*.dfm"
//---------------------------------------------------------------------//
#define LPT1o 0x378
#define LPT1i 0x378
//---------------------------------------------------------------------//
TForm1 *Form1;
//---------------------------------------------------------------------//
HANDLE hcomPort = NULL;
//---------------------------------------------------------------------//
int data [17],resultado=0,flagp=0,flagm=0;
int addr[3],ii,flag=0,flagError=0,flagd=0;
int x=0,ccc=0,ccb=0,flagA=0,flagL=1;
//---------------------------------------------------------------------//
struct uma
{
int tmp,puerto,e;
unsigned long mdr,rdr;
double xtal,rf,fc,clk;
unsigned int ool,pd,cp,cr0,cr1,cont;
108
DISEÑO DE UN GENERADOR DE RF EN BANDA L
const char* a;
};
struct uma ctr;
//---------------------------------------------------------------------//
void clockup(void); // Genera la señal de clk a nivel alto
void clockd(void); // Genera la señal de clk a nivel bajo
void endown(void); // Genera la señal de habilitación
void enup(void); // Genera la señal de inhabilitación
int db(int decimal); // Convierte un numero entero en binario
void latch (int *addr, int *data); // Aplica las funciones anteriores
para programar el
// sintetizador
//---------------------------------------------------------------------//
AnsiString Cola;
//---------------------------------------------------------------------//
typedef void (WINAPI *PORTOUT) (short int Port, char Data);
typedef char (WINAPI *PORTIN) (short int Port);
//---------------------------------------------------------------------//
extern PORTOUT PortOut;
extern PORTIN PortIn;
extern int LoadIODLL();
//---------------------------------------------------------------------//
PORTOUT PortOut;
PORTIN PortIn;
//---------------------------------------------------------------------//
HMODULE hio;
//---------------------------------------------------------------------//
// Función que libera el archivo DLL cargado
//---------------------------------------------------------------------//
void UnloadIODLL()
{
FreeLibrary(hio);
}
//---------------------------------------------------------------------//
// Función que carga el archivo DLL a utilizar
//---------------------------------------------------------------------//
int LoadIODLL()
{
hio = LoadLibrary("io");
109
DISEÑO DE UN GENERADOR DE RF EN BANDA L
110
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función que genera la señal de inhabilitación del sintetizador
//---------------------------------------------------------------------//
void enup()
{
int x;
x=PortIn(LPT1i);
x=x|4;
PortOut(LPT1o,x);
}
//---------------------------------------------------------------------//
// Función que convierte un entero en una secuencia binaria
//---------------------------------------------------------------------//
db(int decimal)
{
int dummy=decimal,i=0;
while (i<17)
{
data[i]= fmod(dummy,2);
dummy = dummy/2;
i++;
}
return (0);
}
//---------------------------------------------------------------------//
// Función que programa el sintetizador utilizando el puerto paralelo
//---------------------------------------------------------------------//
void latch (int *addr, int *data)
{
int x,i;
clockup();
endown();
ctr.cont=0;
/* Introduciendo los datos */
for (i=16;i>=0;i--)
{
x=PortIn(LPT1i);
if (data[i]==1){ x=x|2;}
if (data[i]==0){ x=x&253;}
111
DISEÑO DE UN GENERADOR DE RF EN BANDA L
PortOut(LPT1o,x);
clockd();
x=PortIn(LPT1i);
clockup();
ctr.cont=ctr.cont+1;
}
/* Metemos la direcci¢n */
for (i=3;i>=0;i--)
{
x=PortIn(LPT1i);
if (addr[i]==1){ x=x|2;}
if (addr[i]==0){x=x&253;}
PortOut(LPT1o,x);
clockd();
x=PortIn(LPT1i);
clockup();
ctr.cont=ctr.cont+1;
}
enup();
}
//---------------------------------------------------------------------//
// Función de Borland, cargamos DLL y ocultamos barra
//---------------------------------------------------------------------//
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
LoadIODLL();
ProgressBar1->Visible=False;
}
//---------------------------------------------------------------------//
// Función de Borland, editamos la ventana de trabajo: color, bmp’s,
//---------------------------------------------------------------------//
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Picture->LoadFromFile("urv.bmp");
Image2->Picture->LoadFromFile("pll.bmp");
Memo1->Color = clMenu;
Edit1->Color = clMenu;
Edit2->Color = clMenu;
112
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Edit3->Color = clMenu;
Memo2->Color = clLime;
}
//---------------------------------------------------------------------//
// Función de Borland para la adquisición de datos, prohíbe la escritura
// de cualquier carácter que no sea un entero
//---------------------------------------------------------------------//
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if(Key==8)return;
if ((Key < '0') || (Key > '9'))
{
Key='\0';
}
}
//---------------------------------------------------------------------//
// Función de Borland que deshabilita la escritura en el puerto serie
//---------------------------------------------------------------------//
void __fastcall TForm1::Button5Click(TObject *Sender)
{
if((RadioButton6->Checked==true)&&(flagA==1))
{
if(hcomPort!=INVALID_HANDLE_VALUE)
{
CloseHandle(hcomPort);
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Puerto Desabilitado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Lines->Clear();
}
flagA=0;
}
}
113
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función de Borland que hace posible escribir en el puerto serie como
// si fuera un fichero
//---------------------------------------------------------------------//
void __fastcall TForm1::OpenClick(TObject *Sender)
{
if((RadioButton6->Checked==true)&&(flagA==0))
{
hcomPort=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if( hcomPort==INVALID_HANDLE_VALUE)
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < No se puede abrir el puerto COM >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
}
else
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Puerto Abilitado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
}
GetCommState(hcomPort, &sComCfg);
114
DISEÑO DE UN GENERADOR DE RF EN BANDA L
sComCfg.BaudRate=CBR_9600;
sComCfg.ByteSize=8;
sComCfg.Parity=NOPARITY;
sComCfg.StopBits=ONESTOPBIT;
sComCfg.fRtsControl=RTS_CONTROL_ENABLE;
sComCfg.fDtrControl=DTR_CONTROL_ENABLE;
SetCommState(hcomPort, &sComCfg);
sTimOut.ReadIntervalTimeout=MAXDWORD;
sTimOut.ReadTotalTimeoutMultiplier=0;
sTimOut.ReadTotalTimeoutConstant=0;
sTimOut.WriteTotalTimeoutMultiplier=0;
sTimOut.WriteTotalTimeoutConstant=0;
sTimOut.WriteTotalTimeoutConstant=0;
SetCommTimeouts(hcomPort, &sTimOut);
flagA=1;
}
}
//---------------------------------------------------------------------//
// Función de Borland que carga las frecuencias introducidas por el
// usuario y nos comunica si los valores se ajustan al rango de trabajo
// del sintetizador
//---------------------------------------------------------------------//
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
int a=0,b=0,c=0;
ctr.tmp=0;
Memo1->Clear();
Memo1->Lines->Add("");
if(Edit1->Text=="" || Edit1->Text=="0")
{
ctr.xtal=13;
Memo1->Lines->Add("->F.R programada a "+String(ctr.xtal)+String("
MHz"));
}
115
DISEÑO DE UN GENERADOR DE RF EN BANDA L
else
{
ctr.xtal=Edit1->Text.ToDouble();
Memo1->Lines->Add(" ->F.R programada a " +String(ctr.xtal) +String("
MHz"));
}
if(Edit2->Text=="" || Edit2->Text=="0")
{
ctr.rf=902;
Memo1->Lines->Add(" ->F.E programada a " +String(ctr.rf) +String("
MHz"));
}
else
{
ctr.rf=Edit2->Text.ToDouble();
Memo1->Lines->Add(" ->F.E programada a " +String(ctr.rf) +String("
MHz"));
}
if(Edit3->Text=="" || Edit3->Text=="0")
{
ctr.fc=0.2;
Memo1->Lines->Add(" ->F.C programada a " +String(ctr.fc) +String("
MHz"));
}
else
{
ctr.fc=Edit3->Text.ToDouble();
Memo1->Lines->Add(" ->F.C programada a " +String(ctr.fc) +String("
MHz"));
}
Sleep(3000);
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" ...Comprobando valores...");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
116
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Sleep(1000);
Memo1->Clear();
ctr.mdr= ctr.rf/ctr.fc+1;
if ((ctr.mdr>131071) || (ctr.mdr<512))
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" ->Main Divider fuera de rango");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
a=0;
}
else {a=1;}
ctr.rdr=ctr.xtal/ctr.fc+1;
if ((ctr.rdr>2047) || (ctr.rdr<8))
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" ->Reference Divider fuera de rango");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
b=0;
}
else {b=1;}
if ((ctr.clk>100) || (ctr.clk<0))
{
Memo1->Clear();
Memo1->Lines->Add("");
117
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Memo1->Lines->Add("");
Memo1->Lines->Add(" ->Clk fuera de rango");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
c=0;
}
else {c=1;}
if (a&&b&&c)
{
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Frecuencias Correctas >");
Memo1->Lines->Add("");
Memo1->Lines->Add(" ->Main Divider a " +String(ctr.mdr));
Memo1->Lines->Add(" ->Reference Divider a " +String(ctr.rdr));
ctr.tmp=1;
}
}
//---------------------------------------------------------------------//
// Función de Borland que nos permite grabar toda información en el
// sintetizador. Es la función mas importante
//---------------------------------------------------------------------//
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
int j;
charA="a";
if((RadioButton5->Checked==true))
{
if(ctr.tmp)
{
ProgressBar1->Min=0;
ProgressBar1->Max=120;
ProgressBar1->Position=0;
118
DISEÑO DE UN GENERADOR DE RF EN BANDA L
ProgressBar1->Visible=True;
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < ...en programación >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
db(ctr.mdr);
addr[0]=0; addr[1]=0; addr[2]=1; addr[3]=0;
latch (addr,data);
ProgressBar1->StepBy(ctr.cont*2);
db(ctr.rdr);
addr[0]=1; addr[1]=0; addr[2]=1; addr[3]=0;
latch (addr,data);
ProgressBar1->StepBy(ctr.cont*2);
for (j=0;j<17;j++){data[j]=0;}
data[6]=ctr.pd;
data[9]=ctr.cr0;
data[10]=ctr.cr1;
data[12]=ctr.ool;
addr[0]=1; addr[1]=0; addr[2]=0; addr[3]=0;
latch (addr, data);
ProgressBar1->StepBy(ctr.cont*2);
119
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Sleep(500);
ProgressBar1->Position=0;
ProgressBar1->Visible=False;
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Dispositivo programado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(1500);
Memo1->Clear();
}
ctr.tmp=0;
}
if((RadioButton6->Checked==true))
{
if(ctr.tmp)
{
ccc=0;
120
DISEÑO DE UN GENERADOR DE RF EN BANDA L
do{
Sleep(100);
ReadFile(hcomPort, acBuf, 1, &dwBytRea, 0);
if(acBuf[0]=='g')
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Micro Conectado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flagm=1;
ccc=6;
}
ccc++;
}while(ccc<6);
if(flagm==0)
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Micro NO Conectado >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
Memo1->Clear();
}
if(flagm==1)
{
Sleep(1000);
121
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Enviando Consignas...>");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
tramaA[ii]=0x00;
tramaB[ii]=0x00;
tramaC[ii]=0x00;
}
122
DISEÑO DE UN GENERADOR DE RF EN BANDA L
db(ctr.rdr);
for(j=0;j<17;j++)
{
if(data[j]==1)
{
tramaB[j]='1';
}
if(data[j]==0)
{
tramaB[j]='0';
}
}
strrev(tramaB);
tramaB[17]='0'; tramaB[18]='1'; tramaB[19]='0'; tramaB[20]='1';
charA="b";
strcat(tramaB,charA);
dwlen=strlen(tramaB);
WriteFile(hcomPort, tramaB, dwlen, &dwBytWri, 0);
for (j=0;j<17;j++)
{
data[j]=0;
}
data[6]=ctr.pd;
data[9]=ctr.cr0;
data[10]=ctr.cr1;
data[12]=ctr.ool;
for(j=0;j<17;j++)
{
if(data[j]==1)
{
tramaC[j]='1';
}
if(data[j]==0)
123
DISEÑO DE UN GENERADOR DE RF EN BANDA L
{
tramaC[j]='0';
}
}
strrev(tramaC);
tramaC[17]='0'; tramaC[18]='0'; tramaC[19]='0'; tramaC[20]='1';
charA="c";
strcat(tramaC,charA);
dwlen=strlen(tramaC);
WriteFile(hcomPort, tramaC, dwlen, &dwBytWri, 0);
if(CheckBox4->Checked==true)
{
Sleep(1000);
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Verificando...>");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
124
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
flagError=1;
}
}
flag=1;
}
}while(flag==0);
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flag=0;
do{
ReadFile(hcomPort, acBuf, dwlen, &dwBytRea, 0);
if(acBuf[21]=='b')
{
for(ii=0;ii<22;ii++)
{
if(tramaB[ii]!=acBuf[ii])
{
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < -ERROR- TramaB incorrecta >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
flagError=1;
}
}
flag=1;
}
125
DISEÑO DE UN GENERADOR DE RF EN BANDA L
}while(flag==0);
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flag=0;
do{
ReadFile(hcomPort, acBuf, dwlen, &dwBytRea, 0);
if(acBuf[21]=='c')
{
for(ii=0;ii<22;ii++)
{
if(tramaC[ii]!=acBuf[ii])
{
Memo1->Lines->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < -ERROR- TramaC incorrecta >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Sleep(2000);
flagError=1;
}
}
flag=1;
}
}while(flag==0);
}
//le digo al micro q empiece a programar el sintetizador
if(flagError==0)
{
Sleep(1000);
Memo1->Lines->Clear();
126
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" <...en programación>");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
do{
127
DISEÑO DE UN GENERADOR DE RF EN BANDA L
if((ccc==1500)&&(flagp==0)&&(ccb==0))
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < El Micro No Responde >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
ccc=0;
flagp=1;
}
}while(flagp==0);
ccb=0;
Sleep(100);
do{
Memo2->Color = clRed;
Sleep(2000);
Memo2->Color = clLime;
128
DISEÑO DE UN GENERADOR DE RF EN BANDA L
for(ii=0;ii<22;ii++)
{
acBuf[ii]=0x00;
}
flagp=0;
ccb=1;
ccc=0;
}
if((ccc==1500)&&(flagp==1)&&(ccb==0))
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < No Engancha o Out of Lock >");
Memo1->Lines->Add(" < no está habilitado >");
Memo1->Lines->Add("");
Memo2->Color = clLime;
ccc=0;
flagp=0;
}
}while(flagp==1);
flagp=0;
}
else
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Vuelve a intentarlo >");
Memo1->Lines->Add("");
Memo1->Lines->Add("");
}
flagm=0;
129
DISEÑO DE UN GENERADOR DE RF EN BANDA L
}
}//fin if ctr.tmp
ctr.tmp=0;
}//fin if serie
//---------------------------------------------------------------------//
// Función de Borland para grabar al configuración de la palabra de
// control
//---------------------------------------------------------------------//
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
Memo1->Clear();
Memo1->Lines->Add(" < Registro de Control >");
Memo1->Lines->Add("");
if(CheckBox1->Checked==false)
{
Memo1->Lines->Add(" ->Out of Lock a 0");
ctr.ool=0;
}
else
{
Memo1->Lines->Add(" ->Out of Lock a 1");
ctr.ool=1;
}
if(CheckBox2->Checked==false)
{
Memo1->Lines->Add(" ->Power Down a 0");
ctr.pd=0;
}
else
{
Memo1->Lines->Add(" ->Power Down a 1");
ctr.pd=1;
}
130
DISEÑO DE UN GENERADOR DE RF EN BANDA L
if(CheckBox3->Checked==false)
{
Memo1->Lines->Add(" ->Charge Pump a 00");
ctr.cr0=0;
ctr.cr1=0;
}
else
{
if((RadioButton1->Checked==true)&(CheckBox3->Checked==true))
{
Memo1->Lines->Add(" ->IcpF=16Iset, Icp=Iset");
ctr.cr0=1;
ctr.cr1=1;
}
if((RadioButton2->Checked==true)&(CheckBox3->Checked==true))
{
Memo1->Lines->Add(" ->IcpF=12Iset, Icp=Iset");
ctr.cr0=0;
ctr.cr1=1;
}
if((RadioButton3->Checked==true)&(CheckBox3->Checked==true))
{
Memo1->Lines->Add(" ->IcpF=16Iset, Icp=2Iset");
ctr.cr0=1;
ctr.cr1=0;
}
if((RadioButton4->Checked==true)&(CheckBox3->Checked==true))
{
Memo1->Lines->Add(" ->IcpF=8Iset, Icp=2Iset");
ctr.cr0=0;
ctr.cr1=0;
}
}
}
131
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función de Borland para la adquisición de datos, prohíbe la escritura
// de cualquier carácter que no sea un entero
//---------------------------------------------------------------------//
void __fastcall TForm1::Edit4KeyPress(TObject *Sender, char &Key)
{
if(Key==8)return;
if ((Key < '0') || (Key > '9'))
{
Key='\0';
}
}
//---------------------------------------------------------------------//
// Función de Borland para la adquisición de datos, prohíbe la escritura
// de cualquier carácter que no sea un entero
//---------------------------------------------------------------------//
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{
if(Key==8)return;
if(Key==',')return;
if ((Key < '0') || (Key > '9'))
{
Key='\0';
}
}
//---------------------------------------------------------------------//
// Función de Borland para la adquisición de datos, prohíbe la escritura
// de cualquier carácter que no sea un entero
//---------------------------------------------------------------------//
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
if(Key==8)return;
if ((Key < '0') || (Key > '9'))
{
Key='\0';
}
}
132
DISEÑO DE UN GENERADOR DE RF EN BANDA L
//---------------------------------------------------------------------//
// Función de Borland, selección de verificación de tramas por puerto
// serie
//---------------------------------------------------------------------//
void __fastcall TForm1::CheckBox4Click(TObject *Sender)
{
if((RadioButton6->Checked==true))
{
if(CheckBox4->Checked==false)
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Verificación Desactivada >");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
}
else
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Verificación Activada >");
Memo1->Lines->Add("");
Sleep(1000);
Memo1->Clear();
}
}
}
//---------------------------------------------------------------------//
// Función de Borland, selección de programación por puerto paralelo
//---------------------------------------------------------------------//
void __fastcall TForm1::RadioButton5Click(TObject *Sender)
{
if((RadioButton5->Checked==true))
{
Memo1->Clear();
133
DISEÑO DE UN GENERADOR DE RF EN BANDA L
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add("< Comunicación por Puerto Paralelo >");
Memo1->Lines->Add("");
Memo1->Lines->Add(" ->Conexión directa desde el ");
Memo1->Lines->Add(" puerto paralelo al conector ");
Memo1->Lines->Add(" 3-wire del Sintetizador ");
clockd();
enup();
x=PortIn(LPT1i);
x=x&253;
PortOut(LPT1o,x);
}
}
//---------------------------------------------------------------------//
// Función de Borland, selección de programación por puerto serie
//---------------------------------------------------------------------//
void __fastcall TForm1::RadioButton6Click(TObject *Sender)
{
if((RadioButton6->Checked==true))
{
Memo1->Clear();
Memo1->Lines->Add("");
Memo1->Lines->Add("");
Memo1->Lines->Add(" < Comunicación por Puerto Serie >");
Memo1->Lines->Add("");
Memo1->Lines->Add(" ->Conexión directa desde el ");
Memo1->Lines->Add(" puerto serie al conector ");
Memo1->Lines->Add(" 3-wire del MicroControlador ");
}
}
134