TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: AliYan en 02 de Noviembre de 2013, 18:36:41

Título: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado 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.

Título: Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado por: ppyote en 02 de Noviembre de 2013, 18:42:54
Pon el código, así te podremos guiar mejor
Título: Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado por: AliYan en 02 de Noviembre de 2013, 18:55:46
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....
Título: Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado por: willynovi en 02 de Noviembre de 2013, 21:22:04
Creo que el problema lo tienes en

Código: [Seleccionar]
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.

Título: Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado por: martin12as en 03 de Noviembre de 2013, 14:49:56
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
Título: Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado por: ppyote en 03 de Noviembre de 2013, 19:14:21
Código: [Seleccionar]
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
Título: Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
Publicado por: AliYan en 04 de Noviembre de 2013, 03:18:58

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.