Programación Específica > Microcontroladores
Pic Y Trf2.4 Ghz Marca Laipac
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
[*] Página Anterior
Ir a la versión completa