Luego de charlar con el colega y amigo Willy LU7FIA, nos sugirió agregar la posibilidad de cortar la radiobaliza de forma remota con tonos DTMF. De este modo, si alguna estación local quisiera, podría escuchar una baliza sin ser interferida por la transmisión local.
Como nos pareció una muy buena idea fue que nos pusimos a trabajar y modificamos la actual radiobaliza agregando un circuito integrado HT9170 para la detección de los tonos.
Modificando la radiobaliza
Radiobaliza modificada con detección de tonos DTMF
Así que a partir de hoy la radiobaliza quedó funcionando de la siguiente manera, emite mensaje en telegrafía cada 60 segundos, si durante la pausa se emite el tono "1" (Uno) DTMF inmediatamente responde "QAP" y queda en pausa por 3 minutos.
Ultima edición 5/9/2011:
TX: Vertex 5 vatios FM
Altura: 45 metros
Antena: Ringo
Ubicación: FF97QB
Frecuencia: 144.055Mhz.
/////////////////////////////////////////////////////////////////////////////////
//
// BALIZA IDENTIFICADORA EN CODIGO MORSE LU6FPJ - LU4FHJ
//
// MICRO: 16F84A ROSARIO 01/09/11
//
// NUEVA VERSION + DTMF
//
/////////////////////////////////////////////////////////////////////////////////
// RB 0
// RB 1
// RB 2
// RB 3
// RB 4
// RB 5
// RB 6
// RB 7
// RA 0 TX
// RA 1 TONO
// RA 2
// RA 3
// RA 4
asm{__FUSES _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON}
#pragma CLOCK_FREQ 4000000
unsigned char morse;
unsigned char frec;
unsigned char wpm;
unsigned int gx; // variables globales multiproposito
unsigned char gbx;
unsigned char gbt;
unsigned int frecuencia=1000; // desde 400 HZ hasta 1000 HZ
unsigned const char palabrasxm=10; // desde 4 palabras por minuto
//---------------------------TABLA MORSE----------------------------------------
//
//El primer uno a la izquierda es un marcador que no se reproduce
//
//a partir del mismo de izquierda a derecha 1=raya(DA) 0=punto (DI)
const unsigned char Table[59]={
00000001b,//032 espacio interpalabra 7 units
01101011b,//033 ! -ú-ú--
01010010b,//034 " ú-úú-ú
00111011b,//035 # --ú-- para usar la ¥
10001001b,//036 $ úúú-úú-
00000001b,//037 % No usado
00101000b,//038 & ú-úúú Wait
01011110b,//039 ' ú----ú
00110110b,//040 ( -ú--ú
01101101b,//041 ) -ú--ú-
00000001b,//042 * No usado
00101010b,//043 + ú-ú-ú
01110011b,//044 , --úú--
01100001b,//045 - -úúúú-
01010101b,//046 . ú-ú-ú-
00110010b,//047 / -úú-ú
00111111b,//048 0 -----
00101111b,//049 1 ú----
00100111b,//050 2 úú---
00100011b,//051 3 úúú--
00100001b,//052 4 úúúú-
00100000b,//053 5 úúúúú
00110000b,//054 6 -úúúú
00111000b,//055 7 --úúú
00111100b,//056 8 ---úú
00111110b,//057 9 ----ú
01111000b,//058 : ---úúú
01101010b,//059 ; -ú-ú-ú
00000001b,//060 < No usado
00110001b,//061 = -úúú-
00000001b,//062 > No usado
01001100b,//063 ? úú--úú
01011010b,//064 @ ú--ú-ú
00000101b,//065 A ú-
00011000b,//066 B -úúú
00011010b,//067 C -ú-ú
00001100b,//068 D -úú
00000010b,//069 E ú
00010010b,//070 F úú-ú
00001110b,//071 G --ú
00010000b,//072 H úúúú
00000100b,//073 I úú
00010111b,//074 J ú---
00001101b,//075 K -ú-
00010100b,//076 L ú-úú
00000111b,//077 M --
00000110b,//078 N -ú
00001111b,//079 O ---
00010110b,//080 P ú--ú
00011101b,//081 Q --ú-
00001010b,//082 R ú-ú
00001000b,//083 S úúú
00000011b,//084 T -
00001001b,//085 U úú-
00010001b,//086 V úúú-
00001011b,//087 W ú--
00011001b,//088 X -úú-
00011011b,//089 Y -ú--
00011100b //090 Z --úú
};
//------------------------FIN TABLA MORSE---------------------------------------
unsigned char segundosr(unsigned int seg)
{
seg=seg*20;
for(gx=0;gx<seg;gx++){
clear_wdt();
delay_ms(50);
if((PORTB&10001111)==129){return 1;}
}
return 0;
}
void segundosf(unsigned int seg)
{
seg=seg*10;
for(gx=0;gx<seg;gx++){
clear_wdt();
delay_ms(100);
}
}
void micropausa(void)
{
delay_us(frec);
delay_us(frec);
delay_us(frec);
delay_us(frec);
delay_us(frec);
}
void pausa (unsigned char c)
{
gbt=wpm;
for(gbx=0;gbx<c;gbx++)
{
clear_wdt();
while(gbt>0){
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
gbt--;
asm{nop}
micropausa();
PORTA=1;
micropausa();
}
}
}
void punto()
{
gbt=wpm;
while(gbt>0){
PORTA=3;
PORTA=3;
PORTA=3;
PORTA=3;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=3;
PORTA=3;
PORTA=3;
PORTA=3;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=3;
PORTA=3;
PORTA=3;
PORTA=3;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=3;
PORTA=3;
PORTA=3;
gbt--;
asm{nop}
micropausa();
PORTA=1;
micropausa();
}
pausa(1);
}
void raya()
{
gbt=3*wpm;
while(gbt>0){
PORTA=3;
PORTA=3;
PORTA=3;
PORTA=3;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=3;
PORTA=3;
PORTA=3;
PORTA=3;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=3;
PORTA=3;
PORTA=3;
PORTA=3;
micropausa();
PORTA=1;
PORTA=1;
PORTA=1;
PORTA=1;
micropausa();
PORTA=3;
PORTA=3;
PORTA=3;
gbt--;
asm{nop}
micropausa();
PORTA=1;
micropausa();
}
pausa(1);
}
void codec(unsigned char letra)
{
unsigned char c=7,x;
letra=letra&0x7F;
morse=Table[letra-0x20];
if(morse==0){morse=1;}
while(morse<0x80){morse=morse<<1;c--;}
morse=morse<<1;
// ú 1 unidad de tiempo
// - 3 unidades de tiempo
// gap intra caracter 1 unidad de tiempo
// gap entre caracteres 3 unidades de tiempo
// gap entre palabras 7 unidades de tiempo
//
// cada punto o raya termina con un gap de 1 para encadenarlo
// con el siguiente simbolo del caracter
// por eso agrego un gap de 2 al final para completar los 3
// luego de cada caracter
//
// de la misma manera agrego 4 para completar los 7 entre palabras
//
if(c==0){pausa(4);} //3 del gap de la ultima letra mas 4 = 7
else {
for(x=0;x<c;x++){if(morse<0x80){punto();} else {raya();}
morse=morse<<1;
}
pausa(2);
}
}
void tx_morse(unsigned const char *texto)
{
unsigned char x=0;
while(texto[x]!=0){codec(texto[x]);x++;}
}
void inicio_var(void)
{
frec=20000/frecuencia;
frec=frec*5;
gx=frec*40/1000; //periodo del loop (T*4)
gx=palabrasxm*frec;
wpm=30000/gx;
if(wpm>85){wpm=85;}
if(frec<100){frec=100;}
}
void power_on(void)
{
PORTA=1;
clear_wdt();
delay_ms(250);
clear_wdt();
delay_ms(250);
clear_wdt();
}
void power_off(void)
{
clear_wdt();
delay_ms(250);
clear_wdt();
delay_ms(250);
clear_wdt();
PORTA=0;
}
//******************************************************************************
void main(void)
{
set_bit( STATUS, RP0 );
set_tris_a( 00000000b );
set_tris_b( 10001111b );
OPTION_REG= 11111111b;
clear_bit( STATUS, RP0 );
PORTA=0;
PORTB=0;
clear_wdt();
inicio_var();
segundosf(5);
while(1){
power_on();tx_morse(" VVV LU1FBT FF97QB ");power_off();
if(segundosr(60)==1)
{
power_on();
tx_morse(" QAP ");
power_off();
segundosf(180);
}
}
}






3 comentarios:
Saludos.
¿Con que programa puedo compilar el código?
Gracias.
EN QUE LENGUAJE ESTA EL .ASM ????? SALUDOS GRACIAS
Hola, está programado en C++.
Saludos.
Publicar un comentario