RSS

Radiobaliza novedades:

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);
                                 }
         }
}




  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

3 comentarios:

Anónimo dijo...

Saludos.
¿Con que programa puedo compilar el código?
Gracias.

yo dijo...

EN QUE LENGUAJE ESTA EL .ASM ????? SALUDOS GRACIAS

Facundo A. Fernández dijo...

Hola, está programado en C++.

Saludos.

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.