Вы находитесь на странице: 1из 7

//************************************************************************//

//
// PROJETO COMUNICAO JOYSTICK PS2 WIRELESS COM PIC 16F877A
//
//************************************************************************//
//Configurao PIC //***************************************************************
*********//
#include <16F877A.h>
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES

NOWDT
HS
PUT
NOPROTECT
NOBROWNOUT
NOLVP
NOCPD
NOWRT

//Sem watch dog


//Cristal alta velocidade
//Timer de alimentao
//Cdigo desprotegido
//Sem reset de brown out
//Programao em alta voltagem
//Sem proteo de memria eeprom

#use delay(clock=20000000)
//Definio
#byte porta
#byte portb
#byte portc
#byte portd
#byte porte

// cristal de 20 Mhz

dos ports
= 0x05
= 0x06
= 0x07
= 0x08
= 0x09

//************************************************************************//
//CONTROLE PLAYSTATION
//************************************************************************//
//Definio de I/Os
//************************************************************************//
#define cmd
PIN_D6
#define att
PIN_D4
#define clk
PIN_D5
#define dado
PIN_D7
#define LED_STATUS

PIN_E0

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

PIN_A1
PIN_A0
PIN_D0
PIN_D1
PIN_D2
PIN_D3
PIN_B0
PIN_B1
PIN_B2
PIN_B3
PIN_B4
PIN_B5
PIN_B6
PIN_B7
PIN_C0
PIN_C1
PIN_C2
PIN_C3
PIN_C4
PIN_C5

start
select
servo_x_l
servo_y_l
servo_x_r
servo_y_r
sobe
desce
direita
esquerda
triangulo
bolinha
quadrado
xis
l1
l2
l3
r1
r2
r3

//Led indicador de status

//************************************************************************//
//Definio de parmetros de comunicao com o controle PS2
//************************************************************************//
//Tempos em micro-segundos (us)
#define tempoInicio
20
#define tempoClk
20
#define tempoEntreByte 20
#define tempoEntreCiclo 40 //ms
//************************************************************************//
//VARIAVEIS GERAIS
//************************************************************************//
int psxDado[6];
//Buffer do controle
int psxDadoAnt[6]; //Buffer do controle
int1 psxMudou;
//Botes do Controle
int1 bt_select = 0;
int1 bt_l3 = 0;
int1 bt_r3 = 0;
int1 bt_start = 0;
int1 bt_sobe = 0;
int1 bt_desce = 0;
int1 bt_esquerda = 0;
int1 bt_direita = 0;
int1
int1
int1
int1
int1
int1
int1
int1
int
int
int
int

bt_l1 = 0;
bt_l2 = 0;
bt_r1 = 0;
bt_r2 = 0;
bt_triangulo = 0;
bt_bolinha = 0;
bt_quadrado = 0;
bt_xis = 0;
X_Left=0;
Y_Left=0;
X_Right=0;
Y_Right=0;

int psxCont;

//contador genrico

int1 estado;

//estado do led

//************************************************************************//
//CONSTRUES DAS FUNES
//************************************************************************//
//************************************************************************//
//psxLeByte - Captura um byte, enviado pelo controle atravs do pino DADO
//************************************************************************//
int psxLeByte()
{
int aux=0;
int c;

for(c=0;c<=7;c++)

//Passa por todos os bits da varivel psxByte

output_bit(clk,false);

//baixa o clock, para que o controle


//disponibilize o dado no pino "dado"

{
delay_us(tempoClk);
if(INPUT(dado)==1)
bit_clear(aux, c);
else
bit_set(aux, c);
output_bit(clk,true); //Sobe o clock
}
delay_us(tempoEntreByte);
return (aux);
}
//************************************************************************//
//psxGravaByte - Escreve um byte, enviado pelo controle atravs do pino CMD
//************************************************************************//
void psxGravaByte(int byteDado)
{
int c;
for(c=0;c<=7;c++) //Passa por todos os bits da varivel psxByte
{
//Sobe ou desce o pino de acordo com cada bit da varivel psByte
//significa que estamos enviando o comando 0x01h para o controle
if(bit_test(byteDado,c))
output_bit(cmd,true);
else
output_bit(cmd,false);
output_bit(clk,false);
da um tempinho...
output_bit(clk,true);
}
output_bit(cmd,true);
delay_us(tempoEntreByte);

//depois de setar o pino, manda clock


//
delay_us(tempoClk);
//aguar
//up clock... NOTA: clock
//up comando para sinalizar
//espera um tempinho entre um byte e outro

}
//************************************************************************//
//psxCopiaDado - copia buffer atual para anterior
//************************************************************************//
void psxCopiaDado()
{
int i;
for(i=0;i<6;i++)
psxDadoAnt[i] = psxDado[i];
}
//*************************************************************************//
//psxComparaDado - Compara leitura anterior com a atual
//************************************************************************//
boolean psxComparaDado()

{
int j;
for(j=0;j<6;j++)
{
if(psxDadoAnt[j]!=psxDado[j])
return (1);
}
return (0);
}
//************************************************************************//
//psxAtualizaVariaveis - converte buffer de leitura para variaveis discretas
//***************************
*********************************************//
void psxAtualizaVariaveis()
{
if((psxDado[0] & 1) == 1)
bt_select = 1;
else
bt_select = 0;
if((psxDado[0] & 2) == 2)
bt_l3 = 1;
else
bt_l3 = 0;
if((psxDado[0] & 4) == 4)
bt_r3 = 1;
else
bt_r3 = 0;
if((psxDado[0] & 8) == 8)
bt_start = 1;
else
bt_start = 0;
if((psxDado[0] & 16) == 16)
bt_sobe
= 1;
else
bt_sobe
= 0;
if((psxDado[0] & 32) == 32)
bt_direita = 1;
else
bt_direita = 0;
if((psxDado[0] & 64) == 64)
bt_desce = 1;
else
bt_desce = 0;
if((psxDado[0] & 128) == 128)
bt_esquerda = 1;
else
bt_esquerda = 0;
if((psxDado[1] & 1) == 1)
bt_l2 = 1;

else
bt_l2 = 0;
if((psxDado[1] & 2) == 2)
bt_r2 = 1;
else
bt_r2 = 0;
if((psxDado[1] & 4) == 4)
bt_l1 = 1;
else
bt_l1 = 0;
if((psxDado[1] & 8) == 8)
bt_r1 = 1;
else
bt_r1 = 0;
if((psxDado[1] & 16) == 16)
bt_triangulo = 1;
else
bt_triangulo = 0;
if((psxDado[1] & 32) == 32)
bt_quadrado = 1;
else
bt_quadrado = 0;
if((psxDado[1] & 64) == 64)
bt_xis= 1;
else
bt_xis= 0;
if((psxDado[1] & 128) == 128)
bt_bolinha = 1;
else
bt_bolinha = 0;
x_right = psxDado[2];
y_right = psxDado[3];
x_Left = psxDado[4];
y_Left = psxDado[5];
}
//************************************************************************//
//psxLeControle - Executa a leitura do controle de playstation
//******************************************
******************************//
void psxLeControle()
{
int psxByte = 0;
output_bit(cmd,true);
output_bit(clk,true);
output_bit(att,false);
delay_us(tempoInicio);

//up comando
//up clock
//att em low - habilita o joystick
//aguarda o controle entender o att em low

//Envia o primeiro byte para o controle - 0x01


psxByte = 1;

psxGravaByte(psxByte);
//Envia o segundo byte para o controle - 0x42h
psxByte = 66;
psxGravaByte(psxByte);
//Envia o terceiro byte para o controle - 0x00
psxByte = 0;
psxGravaByte(psxByte);
//Recupera os 6 prximo bytes
for(psxCont=0; psxCont<6; psxCont++)
psxDado[psxCont] = psxLeByte();
//Volta o att para alto... libera o controle indicando que ele pode
//parar de enviar dados
output_bit(att,true);
//Compara com a varivel anterior e verifica se ser
//necessrio atualizar as variaveis discretas
if(psxComparaDado()==1)
{
psxAtualizaVariaveis();
psxMudou = true;
}
else
psxMudou = false;
psxCopiaDado();
}
//************************************************************************//
//atualizaSaidas - Atualiza o status de todas as sadas do PIC
//************************************************************************//
void atualizaSaidas()
{
output_bit(start,bt_start);
output_bit(select,bt_select);
output_bit(sobe,bt_sobe);
output_bit(desce,bt_desce);
output_bit(direita,bt_direita);
output_bit(esquerda,bt_esquerda);
output_bit(triangulo,bt_triangulo);
output_bit(bolinha,bt_bolinha);
output_bit(quadrado,bt_quadrado);
output_bit(xis,bt_xis);
output_bit(l1,bt_l1);
output_bit(l2,bt_l2);
output_bit(l3,bt_l3);
output_bit(r1,bt_r1);
output_bit(r2,bt_r2);
output_bit(r3,bt_r3);
}
//************************************************************************//
//PROGRAMA PRINCIPAL//**********************************************************

**************//
void main()
{
set_tris_a(0b00000100);
set_tris_b(0b00000000);
set_tris_c(0b00000000);
set_tris_d(0b00000001);
set_tris_e(0b00000000);
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(1)
{
psxLeControle();
delay_ms(20);
estado=!estado;
output_bit(LED_STATUS,estado);
atualizaSaidas();
} //Fim do lao principal
}//Fim do programa
//************************************************************************//
Referncias:

Вам также может понравиться