TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dr cerebro 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:
setup_adc_ports(ALL_ANALOG);
por:
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:
#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:
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.
-
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.
-
Prueba modificando en el 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
Como verás he comentado una línea de tu código .
En proteus trabaja bien.
-
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
-
Prueba modificando en el 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
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.