Autor Tema: Leds encienden sin razón aparente.  (Leído 2045 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Leds encienden sin razón aparente.
« en: 05 de Julio de 2015, 03:17:59 »
Hola a todos.

Estoy tratando desarrollar en C con Css, un pequeño programa para un pic 16f690 montado en una placa de desarrollo PicKit2 Rev 2.

El programa debe encender o apagar de 1 a 4 leds de forma seudoaleatoria. A veces un led enciende, otras 2, 3 o los 4 leds. Lo importante es que aparente que no hay una secuencia predecible.

En el proceso de desarrollo, el programa inicialmente solo encendía uno de los cuatro leds. Problema que solucione cambiando la linea:

Código: [Seleccionar]
setup_adc_ports(ALL_ANALOG);
por:

Código: [Seleccionar]
setup_adc_ports(PIN_A0);
Lo cual soluciono en parte el problema. Ahora puede encender 1, 2, 3 o los 4 leds. Pero se alcanza a ver que a veces los leds apagados titilan un tris.

El código actual es el siguiente:

Código: [Seleccionar]
#include "C:\Users\Root\Desktop\Picc\blink\blink.h"
#include <STDLIB.H>

void main()
{
   setup_adc_ports(sAN0|VSS_VREF);
   setup_adc_ports(PIN_A0);
   setup_adc(ADC_CLOCK_DIV_2);
   
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   setup_oscillator(OSC_8MHZ);

   long value1 = 0;
   
   while(1){
      // read in value on AN0
      set_adc_channel(0);
      value1 = read_adc();
     
      if (((rand() % 2) + 1)== 1){ //range 1-6
         output_high(PIN_C0);
      } else {
         output_low(PIN_C0);
      }     
     
      if (((rand() % 2) + 1)== 1){ //range 1-6
         output_high(PIN_C1);
      } else {
         output_low(PIN_C1);
      }
     
      if (((rand() % 2) + 1)== 1){ //range 1-6
         output_high(PIN_C2);
      } else {
         output_low(PIN_C2);
      }
     
      if (((rand() % 2) + 1)== 1){ //range 1-6
         output_high(PIN_C3);
      } else {
         output_low(PIN_C3);
      }           
     
      delay_ms(value1);
   } 
}

Pueden ver un vídeo, desde este link:  https://www.dropbox.com/s/kumjfi0el25xs4i/20150705_005611_Calle%2065b.mp4?dl=0 Luego subo uno a Youtube de mejor calidad. La placa de desarrollo se ve una placa arduino con leds verdes funcionando correctamente. La diferencia es que el la placa arduino no he colocado un potenciometro para modificar la velocidad de parpadeo de los leds.

El código de la arduino, aunque no sea relevante, lo adjunto. es el siguiente:

Código: [Seleccionar]
int Led1 = A0;
int Led2 = A1;
int Led3 = A2;
int Led4 = A3;

void setup() {
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Led3, OUTPUT);
  pinMode(Led4, OUTPUT);
}

void loop() {
  if (random(0, 2) == 1){
    digitalWrite(Led1, HIGH);
  }else{
    digitalWrite(Led1, LOW);
  }
  if (random(0, 2) == 1){
    digitalWrite(Led2, HIGH);
  }else{
    digitalWrite(Led2, LOW);
  }
  if (random(0, 2) == 1){
    digitalWrite(Led3, HIGH);
  }else{
    digitalWrite(Led3, LOW);
  }
  if (random(0, 2) == 1){
    digitalWrite(Led4, HIGH);
  }else{
    digitalWrite(Led4, LOW);
  }
  delay(1000);
}

Saludos.

Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Leds encienden sin razón aparente.
« Respuesta #1 en: 05 de Julio de 2015, 05:06:04 »
Preguntonta.... tenes habilitado el WDT ?, si es asi deshabilitalo, es lo unico que se me ocurre que pueda hacer eso, como que llega un punto que se resetea tal ves, el programa esta bien. No veo error alguno.


PD una curiosidad.. me preguntaba si tardaba mas en realizar un

rand() % 2

que un

rand() & 0x3 + un if sobre si es mayor a 2
o hacer un
(rand() & 0x3) % 2

... solo por curiosidad xD.
« Última modificación: 05 de Julio de 2015, 14:36:09 por KILLERJC »

Desconectado JORGE 500000

  • PIC10
  • *
  • Mensajes: 7
Re: Leds encienden sin razón aparente.
« Respuesta #2 en: 10 de Julio de 2015, 01:01:36 »
Prueba modificando en el main:
Código: [Seleccionar]

setup_adc_ports(sAN0|VSS_VREF);
  // setup_adc_ports(PIN_A0);
   setup_adc(ADC_CLOCK_DIV_2); 
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   

Como verás he comentado una línea de tu código .
En proteus trabaja bien.

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Re: Leds encienden sin razón aparente.
« Respuesta #3 en: 10 de Julio de 2015, 16:20:53 »
Preguntonta.... tenes habilitado el WDT ?, si es asi deshabilitalo, es lo unico que se me ocurre que pueda hacer eso, como que llega un punto que se resetea tal ves, el programa esta bien. No veo error alguno.


PD una curiosidad.. me preguntaba si tardaba mas en realizar un

rand() % 2

que un

rand() & 0x3 + un if sobre si es mayor a 2
o hacer un
(rand() & 0x3) % 2

... solo por curiosidad xD.

Hola.

No sé. No conozco la respuesta a su pregunta.

Muchas gracias por su respuesta.

Saludos
Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio

Desconectado dr cerebro

  • PIC10
  • *
  • Mensajes: 42
    • Solo para la Gloria de Dios
Re: Leds encienden sin razón aparente.
« Respuesta #4 en: 10 de Julio de 2015, 16:22:17 »
Prueba modificando en el main:
Código: [Seleccionar]

setup_adc_ports(sAN0|VSS_VREF);
  // setup_adc_ports(PIN_A0);
   setup_adc(ADC_CLOCK_DIV_2); 
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   

Como verás he comentado una línea de tu código .
En proteus trabaja bien.

Hola.

Lo acabo de probar y funciona correctamente.

¿Me podría explicar la solución?

Saludos.
Inicio:
    Lcdcmdout LcdLine1Clear
    WaitMs 1000
    Lcdout "Hogar, dulce hogar."
    WaitMs 1000
goto inicio