TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: AliYan en 02 de Noviembre de 2013, 18:36:41
-
Buenas tardes, tengo un problema con un proyecto de domotica, estoy manejando de manera remota las luces de una casa y todo lo remoto me funciona de maravilla, el problema es cuando lo quiero hacer de forma manual, tengo conectado al puertoD mis leds y al puertoB mis switches, cuando enciendo un led de forma remota no puedo apagarlo por medio del switch.
Mi codigo es en C lo estoy compilando en CCS, tal vez alguien puede ayudarme con ese problema. Gracias.
-
Pon el código, así te podremos guiar mejor
-
Pon el código, así te podremos guiar mejor
Gracias por responder.
#include <18F4550.h> //PIC
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000) //Frecuencia del cristal oscilador externo
#USE fast_IO (B)
#define USB_CON_SENSE_PIN PIN_B0 //Pin de detección conexión-desconexión dispositivo USB
#include <usb_cdc.h>//Librería de control USB
#byte TRISD = 0xf95
#byte PORTD = 0xf83
int PuertoD;
lectura_Leds() {
TRISD=0x00;
PuertoD= PORTD;
printf(usb_cdc_putc, "\%x", PuertoD);
}
void encender_manual(){
set_tris_b(0b00000010);
while(TRUE)
{
if (input(PIN_B1)==1)
{
output_high(PIN_D0);
}else if(input(PIN_B1)==0)
{
output_low(PIN_D0);
}
}
}
void encender_remoto(){
BYTE value;
SET_TRIS_D(0x00);
OUTPUT_D(0);
while(TRUE)
{
value = gethex_usb();
switch(value)
{
case 0x01: output_high(PIN_D0);
break;
case 0x02: output_low(PIN_D0);
break;
case 0x03: output_high(PIN_D1);
break;
case 0x04: output_low(PIN_D1);
break;
case 0x05: output_high(PIN_D2);
break;
case 0x06: output_low(PIN_D2);
break;
case 0x07: output_high(PIN_D3);
break;
case 0x08: output_low(PIN_D3);
break;
case 0x09: output_high(PIN_D4);
break;
case 0x10: output_low(PIN_D4);
break;
case 0x11: output_high(PIN_D5);
break;
case 0x12: output_low(PIN_D5);
break;
case 0x13: output_high(PIN_D6);
break;
case 0x14: output_low(PIN_D6);
break;
case 0x15: output_high(PIN_D7);
break;
case 0x16: output_low(PIN_D7);
break;
case 0x18: lectura_Leds();
break;
}
}
}
void main() {
usb_cdc_init();
usb_init();
delay_ms(300);
for(;;){
encender_manual();
encender_remoto();
}
}
En este codigo solo estoy manejando manualmente un led (en el pinD0)es solo de prueba....
-
Creo que el problema lo tienes en
for(;;){
encender_manual();
encender_remoto();
}
el estado de encender_remoto() te pisa cualquier estado que le cambies en encender_manual()
Quizás puedes hacer que en la función encender_manual() hagas que el dispositivo remoto se actualice y cambie su estado al que propone encender_manual()
Estas usando switches para establecer los estados, no?
Quizás puedes hacerlo con pulsadores que cuando lo presionas cambian de estado el dispositivo que quieres encender y apagar.
Pero tienes que enviar el dato de en que estado quedó al remoto.
-
No te servira usar la funcion output_toogle (pin_xx)?
Ademas veo que usas la funcion output_x() y le pones 0. Esto hace que apenas entra en esa funcion se te apagan todas las luces. Me parece que esa instruccion deberia ir en el main y afuera del ciclo infinito. Igual que las instrucciones set_tris_x
Y lo otro que se me ocurre para decirte es que pienses si no es mas fácil hacerlo con interrupciones
Y ahora veo que tenes un ciclo infinito en cada función. O sea. a la segunda no entra nunca el programa se queda siempre en la funcion manual
-
while(TRUE)
{
value = gethex_usb();
switch(value)
{
case 0x01: output_high(PIN_D0);
break;
case 0x02: output_low(PIN_D0);
break;
case 0x03: output_high(PIN_D1);
break;
case 0x04: output_low(PIN_D1);
break;
case 0x05: output_high(PIN_D2);
break;
case 0x06: output_low(PIN_D2);
break;
case 0x07: output_high(PIN_D3);
break;
case 0x08: output_low(PIN_D3);
break;
case 0x09: output_high(PIN_D4);
break;
case 0x10: output_low(PIN_D4);
break;
case 0x11: output_high(PIN_D5);
break;
case 0x12: output_low(PIN_D5);
break;
case 0x13: output_high(PIN_D6);
break;
case 0x14: output_low(PIN_D6);
break;
case 0x15: output_high(PIN_D7);
break;
case 0x16: output_low(PIN_D7);
break;
case 0x18: lectura_Leds();
break;
}
}
si en la funcion encender_manual y encender_auto hay metidos bucles infinitos, es normal que no funcione
-
Gracias por vuestras respuestas, y si.. en la recursividad tengo el problema he cambiado eso y ya anda "un poco mejor", creo que en una prueba real veré si va del todo bien! Gracias a todos.