Autor Tema: Encendido/Apagado remoto y manual de leds, PIC 18f4550  (Leído 3386 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado AliYan

  • PIC10
  • *
  • Mensajes: 6
Encendido/Apagado remoto y manual de leds, PIC 18f4550
« 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.


Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
« Respuesta #1 en: 02 de Noviembre de 2013, 18:42:54 »
Pon el código, así te podremos guiar mejor
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado AliYan

  • PIC10
  • *
  • Mensajes: 6
Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
« Respuesta #2 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....
« Última modificación: 02 de Noviembre de 2013, 18:59:43 por AliYan »

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
« Respuesta #3 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.

Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado martin12as

  • PIC10
  • *
  • Mensajes: 36
Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
« Respuesta #4 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
« Última modificación: 03 de Noviembre de 2013, 15:04:37 por martin12as »

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
« Respuesta #5 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
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado AliYan

  • PIC10
  • *
  • Mensajes: 6
Re: Encendido/Apagado remoto y manual de leds, PIC 18f4550
« Respuesta #6 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.