Programación Específica > Microcontroladores

 Pic Y Trf2.4 Ghz Marca Laipac

<< < (4/4)

alcidesramos:
El codigo esta hecho en micropascal pero anexo declaraciones y funciones psra que analicen es facil de interpretar.
La instruccion shl rota a la izquierda  ejemplo shl 2 rota dos casillas: creo que es lo unico a aclarar lo otro se puede deducir analizando elcodigo.

las declaraciones para el programa son:
const
//pines en el micro
cs=0;
ce=1;
ck1=2;
dato1=3;
dr1=5;
ck2=2;
dato2=6;
dr2=7;


//para la configuracion trf

nbyte_1=2;  // numero de bytes canal 1
nbyte_2=2;  // numero de bytes canal 2
nbytedir=2; // numero de byte de las dirreciones a usar

// para crc
l_crc=1
e_crc=0;
crc_8=1 shl 1;
crc_16=0 shl 1;
crc_on=1;
crc_off=0;
// para la potencia

rf_20=0;
rf_10=1;
rf_5=2;
rf0=3;
// para el cristal
cristal_4=0 shl 2;
cristal_8=1 shl 2;
cristal_12=2 shl 2;
cristal_16=3 shl 2;
cristal_20 =4 shl 2;
// la velocidad
rata_250k=0 shl  5;
rata_1m=1 shl  5;
// el modo
modo_direct=0 shl 6;
modo_burst=1 shl 6;
//recibe 2 o un canal
rx_2=1 shl 7;
rx_1=0 shl 7;

//trasmite o recibe
txmodo=0;
rxmodo=1;
// canal deseado
canal=16 shl 1;   //2464GHz
// bit superios de configuracion
test_1=%10001110;
test_2=%00001000;
test_3=%00011100;
// pin recibe datos 2 porque sera el puero c,2
DATO1IN=2;

var
dir1_1,dir1_2,dir1_3,dir1_4,dir1_5:byte;
dir2_1,dir2_2,dir2_3,dir2_4,dir2_5:byte;
trf : byte; absolute $08; volatile;   //defino trf en el puerto d;
trfin : byte; absolute $07; volatile;   //defino trfin en el puerto c;
nbit_1,nbit_2:byte;
nbitdir:byte;
byte_c1,byte_c2,byte_c3:byte;
datos1:array[nbyte_1] of byte;
var
 txt:string[5];

Los procedimientos y funciones implemantadas son:

procedure delay_ck();//
begin
delay_us(1);
end;

procedure delay_cs();
begin
delay_us(4);
end;

procedure delay_setup();
begin
delay_ms(4);
end;

procedure envia_spi(b:byte);
var
i:byte;
begin

   for i:=7  downto 0 do
   begin
   trf.ck1:=0;
    if testbit(b,i) then trf.dato1:=1
    else trf.dato1:=0;
    delay_ck();
    trf.ck1:=1;
    delay_ck();
   end; // for
    trf.ck1:=0;
end;

function recibe_spi :byte;
var i ,buffer: byte;
begin
    result:=0;
//    result := Soft_Spi_Read(buffer);
      for i:=7 downto 0 do
   begin
   trf.ck1:=0;
delay_ck();
  trf.ck1:=1;
delay_ck();
   if testbit(trfin,dato1in) then result.i:=0
   else result.i:=1;
   end;//for
      trf.ck1:=0;
end;


function recibe_spi2 :byte;
var i ,buffer: byte;
begin
    result:=0;
//    result := Soft_Spi_Read(buffer);
      for i:=7 downto 0 do
   begin
   trf.ck2:=0;
delay_ck();
  trf.ck2:=1;
delay_ck();
   if testbit(trf,dato2) then result.i:=0
   else result.i:=1;
   end;//for
      trf.ck2:=0;
end;


procedure configrtf();
begin
   trisd.dato1:=0;
   nbit_1:=nbyte_1 shl 3;
   nbit_2:=nbyte_2 shl 3;
   dir1_1:=17;
   dir1_2:=21;
   dir1_3:=0;
   dir1_4:=0;

   dir2_1:=17;
   dir2_2:=21;
   dir2_3:=0;
   dir2_4:=0;
   nbitdir:=nbytedir shl 5;
   byte_c1:=nbitdir or crc_8 or crc_on;   // primer byte configuracion
   byte_c2:=rx_2 or modo_burst or rata_250k or cristal_16 or rf0;// segundo byte de configuracion
   byte_c3:=canal or rxmodo;  // tercer byte de configuracion  para transmision sera: or txmodo

 // comienza a enviar informacion
    trf.ce:=0;
   trf.cs:=0;
   trf.ck1:=0;
    trf.dato1:=0;
   delay_setup();
   trf.cs:=1;
   delay_cs();
   envia_spi(test_1);
   envia_spi(test_2);
   envia_spi(test_3);
   envia_spi(nbit_2);
   envia_spi(nbit_1);
   envia_spi(dir2_5);
   envia_spi(dir2_4);
   envia_spi(dir2_3);
   envia_spi(dir2_2);
   envia_spi(dir2_1);
   envia_spi(dir1_5);
   envia_spi(dir1_4);
   envia_spi(dir1_3);
   envia_spi(dir1_2);
   envia_spi(dir1_1);
   envia_spi(byte_c1);
   envia_spi(byte_c2);
   envia_spi(byte_c3);
   trisd.dato1:=1;  // debe pasar a entrada aunque el dato se lee por el portc,2
   trf.cs:=0;
   trf.ck1:=0;
   trf.ce:=1;
end;

procedure tx_modo;
begin
trisd.dato1:=0;
trf.ck1:=0;// puede ser opcional
trf.ce:=0;
trf.cs:=1;
delay_cs();
trf.dato1:=1;
trf.ck1:=1;
delay_ck();
trf.ck1:=0;
delay_ck();
trf.cs:=0;

end;

procedure rx_modo;
begin
trisd.dato1:=0;
trf.ck1:=0;// puede ser opcional
trf.ce:=0;
trf.cs:=1;
delay_cs();
trf.dato1:=0;
trf.ck1:=1;
delay_ck();
trf.ck1:=0;
delay_ck();
trf.cs:=0;
trisd.dato1:=1;  // muerto
trf.ce:=1;
end;

procedure tx_modocanal(c:byte);
begin
trisd.dato1:=0;
trf.ck1:=0;// puede ser opcional
trf.ce:=0;
trf.cs:=1;
delay_cs();
envia_spi((c shl 1)or 0) ;
trf.cs:=0;
trf.ck1:=0;
end;


procedure rx_modocanal(c:byte);
begin
trisd.dato1:=0;
trf.ck1:=0;// puede ser opcional
trf.ce:=0;
trf.cs:=1;
delay_cs();
envia_spi((c shl 1)or 1) ;
trf.cs:=0;
trisd.dato1:=1;
trf.ck1:=0;
trisd.dato1:=1;  // muerto
trf.ce:=1;
end;

procedure enviatrf(var b:array[nbyte_1] of byte);
var
i:byte;
begin
   trf.ce:=1;
   delay_cs;
    envia_spi(dir1_2);
    envia_spi(dir1_1);
   for i:=0 to nbyte_1-1 do
   begin
   envia_spi(b);
   end;// for
   trf.ce:=0;
   trf.ck1:=0;
end;

procedure recibetrf();
var
i:byte;
begin
   for i:= 0 to  nbyte_1-1 do
   begin
   datos1:=recibe_spi;
  end;
   trf.ck1:=0;
   end;

procedure recibetrf2();
var
i:byte;
begin
   for i:= 0 to  nbyte_2-1 do
   begin
   datos1:=recibe_spi2;
   end;
   trf.ck2:=0;
   end;

* el procedimiento principal  para trasmitir implementado en un 16f919 es utilizando puerto b:


begin
OSCTUNE:=0;
OSCCON.IRCF2:=1;
OSCCON.IRCF1:=1;
OSCCON.IRCF0:=1;
PIE1:=0;
PIR1:=0;
PIE2:=0;
PIR2:=0;
PCON:=0;

 OPTION_REG := $0;
 intcon:=0;
  ADCON1     := $06;
  TRISA      := $00;
  trisb.cs:=0;
  trisb.ce:=0;
  trisb.ck1:=0;
  trisb.dato1:=0;
  trisb.dr1:=1;
  trisb.ck2:=0;
  trisb.dato2:=1;
  trisb.dr2:=1;
   portb:=0;
   porta:=0;
    configrtf();
    txmodo();
    repeat
     datos1[0]:=31;   // primer dato a trasmitir
     datos1[1]:=33;   // segundo dato a trasmitir
     enviatrf(datos1);
      porta:=not(porta); // indica que se estan enviando datos
      delay_ms(300);
     
    until 0=1;// pincipal

* el codigo para recibir los datos en este caso solo es una prueba y se recibenn el dato 31 y 33 y se muestran en un display si no hay señal se vera el mensaje ayudame dios mio (este mensaje lo vei todo un dia de verdad que me ayudo y ya no salen sino los datos) si si hay enlace los datos enviados, utilizo un pic16f877a.


begin
 OPTION_REG := $80;
  ADCON1     := $06;                // configure VDD as Vref, and analog channels
  TRISA      := $FF;                // designate porta as input
PIE1:=0;
PIR1:=0;
PIE2:=0;
PIR2:=0;
PCON:=0;
OPTION_REG := $0;
intcon:=0;
trise:=0;
trisd:=0;
trisb:=0;
TRISC.DATO1IN:=1;

  trisd.cs:=0;
  trisd.ce:=0;
  trisd.ck1:=0;
  trisd.dato1:=0;
  trisd.dr1:=1;
  trisd.ck2:=0;
  trisd.dato2:=1;
  trisd.dr2:=1;

   portd:=0;
   portb:=0;
   delay_ms(1000);
   configrtf();
    rx_modo();
   

Lcd_Config(PORTb,7,6,5,4,PORTb,3,2,1);
Lcd_Cmd(LCD_CLEAR);                //  send command to LCD "clear display"
 Lcd_Cmd(LCD_CURSOR_OFF);           //  send command cursor off
Lcd_Out(1, 1, 'AYUDAME DIOS MIO'); // Si no hay datos solo se pide ayuda
delay_ms(5);
    repeat
     if trf.dr1=1 then
     begin

              datos1[0]:=0;
              datos1[1]:=0;

              recibetrf(); // recibe el dato y queda guardado en el buffer datos1
               Lcd_Out(1, 4, 'Datos enviados'); // Wr
                  wordToStr(datos1[0], txt);   //convierte a cadena eldato
                      Lcd_Out(2, 1, txt  ); // Wr     // lo muestra en display linea 2
                          wordToStr(datos1[1], txt);
                              Lcd_Out(3, 1, txt  ); // Wr  line 3´
                               delay_ms(500);
                                Lcd_Cmd(LCD_CLEAR); // limpia el display

        end;//dr1=1;
until 0=1;// pincipal



* es todo espero que sea de su ayuda y les ayude aclarar dudas y solucionar algun problema.

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa