TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: atomizador en 10 de Enero de 2011, 05:04:10
-
hola, necesito un poco de ayuda para un programa, necesito hacer funcionar un joystick por medio de un pic 12f683.
alguien q me pueda ayudar??
-
el joystick es de una imitacion al mando de la playstation.
-
hola, necesito un poco de ayuda para un programa, necesito hacer funcionar un joystick por medio de un pic 12f683.
alguien q me pueda ayudar??
Pero que deseas hacer? Donde va conectado el mando? Que funcion quieres que haga el pic? Tienes algo de proyecto hecho?
-
lo que yo quiero que aga el joystick es accionar 2 reles. y tengo todo el programa hecho lo unico que me falta es el adc para e joystick, que nunca lo e hecho y no se exactamente.
este es el programa:
#include <12f683.h>
#device ADC=8
#fuses NOWDT // SIN WATCH DOG TIMER
#fuses INTRC_IO // OSCILADOR INTERNO SIN CLKOUT
#fuses NOCPD // NO EE PROTECTION
#fuses NOPROTECT // NO SE PUEDE LEER EL CODIGO DEL PIC
#fuses NOMCLR // PIN_A3 USADA PARA ENTRADA Y NO PARA RESET
#fuses NOPUT // SIN POWER UP TIMER
#fuses NOBROWNOUT // SIN BROWNOUT RESET
#use delay (clock=8000000) //CONFIGURACION DEL RELOJ
void main()
{
int estado=0, esta_activo1=0,esta_activo2=0;
int16 tiempo=0, t1=0, t2=0;
setup_oscillator(OSC_8MHZ); //CONFIGURA EL OSCILADOR A 8 MHZ
setup_adc_ports(sAN0|VSS_VDD); //ADC 0 ACTIVADO - REF 5V
setup_adc(ADC_CLOCK_INTERNAL); //ADC POR EL PIN 0
setup_comparator(NC_NC_NC_NC); //COMPARADOR DESACTIVADO
setup_vref(FALSE); //SIN TENSION DE REFERENCIA
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); //CONFIRACION TIMER0
setup_timer_1(T1_DISABLED); //TIMER1 DESACTIVADO
setup_timer_2(T2_DISABLED,0X3F,1); //TIMER2 DESACTIVADO
//**********CONFIGURACIONES DE LAS ENTRADAS Y SALIDAS
//**********GP0 ENTRADA ADC
//**********GP1 ENTRADA 1
//**********GP2 ENTRADA 2
//**********GP3 ENTRADA SELECTOR MODO AUTO.
set_tris_a(0b00001111);
//**********INICIALIZAMOS LA PUERTA A. APAGAMOS TODO***
output_low(PIN_A4);
output_low(PIN_A5);
//**********ACTIVAMOS EL CANAL 0 ADC*******************
set_adc_channel(0);
delay_ms(10);
while(true){
estado=INPUT(PIN_A3);
//************ACTIVAMOS EL ESTADO AUTO.****************
if(estado==1){
output_low(PIN_A4);
output_low(PIN_A5);
esta_activo1=esta_activo2=0;
t1=t2=0;
while(estado==1){
tiempo=read_adc();
tiempo=tiempo*20;
if(input(PIN_A1)&&(esta_activo1==0)){
output_high(PIN_A4);
esta_activo1=1;
t1=tiempo;
}
if(input(PIN_A2)&&(esta_activo2==0)){
output_high(PIN_A5);
esta_activo2=1;
t2=tiempo;
}
if(t1>0){t1--;}
if(t1<=0){
output_low(PIN_A4);
esta_activo1=0;
}
if(t2>0){t2--;}
if(t2<=0){
output_low(PIN_A5);
esta_activo2=0;
}
if((t1!=0)||(t2!=0))delay_ms(1);
estado=input(PIN_A3);
}
}
//********************MANUAL****************
else{ //Estado manual activado
output_low(PIN_A4);
output_low(PIN_A5);
esta_activo1=esta_activo2=0;
while(estado==0){
if(input(PIN_A1)&&(t1==0))
{
if(esta_activo1==0){
output_high(PIN_A4);
esta_activo1=1;}
else{
output_low(PIN_A4);
esta_activo1=0;}
t1=500;
}
if(input(PIN_A2)&&(t2==0)){
if(esta_activo2==0){
output_high(PIN_A5);
esta_activo2=1;}
else{
output_low(PIN_A5);
esta_activo2=0;}
t2=500;
}
if(t1!=0)t1--;
if(t2!=0)t2--;
if((t1!=0)||(t2!=0))delay_ms(1);
estado=input(PIN_A3);
}}}}
-
prueba asi,
while(estado==1){
tiempo=read_adc(ADC_START_AND_READ);
delay_ms(10); //si te parece mucho retardo puedes bajarlo hasta 1ms
tiempo=tiempo*20;
y aqui el resto....
se me olvido decirte.. elimina esta linea.... set_adc_channel(0);
-
ok gracias probare aver que tal me va con eso, ya te digo algo.gracias.
-
hola e probado y no va, pero una cosa que te voy a decir que no te dije al principio, aora mismo activo los reles con 2 pulsadores, pero eso ya lo abras visto ay, y lo q kiero es sustituir los pulsadores por el joystick, esto es solo para ver si puedo mejorar este mando. me seria mas facil manejarlo.
-
hola e probado y no va, pero una cosa que te voy a decir que no te dije al principio, aora mismo activo los reles con 2 pulsadores, pero eso ya lo abras visto ay, y lo q kiero es sustituir los pulsadores por el joystick, esto es solo para ver si puedo mejorar este mando. me seria mas facil manejarlo.
Entonces... Quieres activar los reles con 2 pulsadores del mando? O lo que deseas es leer el valor del jostick analogico para encender los reles?
Es que no te entiendo... podrias poner un pequeñe esquema para hacernos una idea de lo que deseas hacer... asi entenderiamos mejor tu proyecto..
-
claro claro lo que kiero es el valor analogico del joystick de izquierda-derecha, para cuando el joystick vaya a izquierda se active el relé izquierdo, y a la derecha igual.
-
que valores de tension tienes poniendo el analogico a tope a la derecha y a la izquierda?
mira que valores sacas...
lo mejor para hacerlo es como te dije...
int valor=0;
while(true){
valor=read_adc(ADC_START_AND_READ);
delay_ms(10); //si te parece mucho retardo puedes bajarlo hasta 1ms
if(valor>130) una instruccion para habilitar salida
if(valor<124) una instruccion para habilitar salida
if((valor>=124)&&(valor<=130)) una instruccion para deshabilitar salidas...
}
rapido y facil