hace 11 años
hola, estoy haciendo un control con arduino, para controlar tres salidas con tres pulsadores, dos de los cuales controlan las salidad on/off, osea, cada vez q preciono el pulsador, cambia de estado la salida y la tercer salida es controlada por la accion de un pulsador, que activa un timer (timer 1), que despues de 6 segundo apaga la salida, el problema es q no hace muy bien lo que quiero, sobre todo el timer, ya q el primer pulso es de 1 segundo menos, los demas pulsos si son de 6 segundos, aki dejo el programa que hice
#include <avr/io.h>
#include <avr/interrupt.h>
#include <EEPROM.h>
volatile byte segundos;
long time = 0; //
long debounce = 500;
//////////////////////////////RUTINA ON/OFF/////////////////////////////////
void antirebote_on_off(int *lect_de_pinE, int *lec_de_pinS, int *pin_salida){
int previous = LOW;
if (*lect_de_pinE == HIGH && previous == LOW && millis()+100 - time > debounce) {
if (*lec_de_pinS == HIGH) {
*lec_de_pinS = LOW;
time = millis();
}
else {
*lec_de_pinS = HIGH;
time = millis();
}
}
digitalWrite(*pin_salida, *lec_de_pinS);
previous = *lect_de_pinE;
}
//////////////////////////////RUTINA TIMER/////////////////////////////////
void antirebote_timer(int *lect_de_pinEnt){
int lddpE=*lect_de_pinEnt;
if (lddpE == HIGH && millis()+100 - time > debounce) {
cli();
TCCR1A=0;
TCCR1B=0;
TCCR1B |= (1<<WGM12);//resetea el contador a 0 cuando termina la comparacion
TCCR1B |= (1<<CS10);//prescaler 1024
TCCR1B |= (1<<CS12);//prescaler 1024
OCR1A=15625;
TIMSK1|=(1<<OCIE1A);//habilita la interrupcion por comapracion de igualdad
digitalWrite(9, HIGH);
sei();
time = millis();
}
}
//////////////////////////////RUTINA CONTROL DE TIEMPO/////////////////////////////////
//////////////////////////////RUTINA DE CONTROL ON/OFF LLENAVASO///////////////////////
void control(int *pin){
int pE=*pin;
if (pE == HIGH && millis()+100 - time > debounce) {
digitalWrite(13, LOW);
time = millis();
}
}
//////////////////////////////ATENSION DE INTERRUPCION/////////////////////////////////
ISR(TIMER1_COMPA_vect){
segundos++;
if(segundos==2){
digitalWrite(9, LOW);
cli();
TCCR1A=0;
TCCR1B=0;
segundos=0;
cli();
}
}
//////////////////////////////////////////////////////////////////////////////////////
void setup()
{
pinMode(11, OUTPUT);//SALIDA DE CONTROL PARA LA BACHA
pinMode(5, INPUT); //ENTRADA DE CONTROL DE LA BACHA
digitalWrite(11, LOW);
pinMode(10, OUTPUT);//SALIDA DE CONTROL DE GIRO Y CONTRAGIRO
pinMode(6, INPUT); //ENTRADA DE CONTROL DE GIRO Y CONTRAGIRO
digitalWrite(10, LOW);
pinMode(9, OUTPUT);//SALIDA DE CONTROL DE LLENAVASO
pinMode(8, INPUT);//ENTRADA DE CONTROL DE LLENAVASO
digitalWrite(9, LOW);
}
void loop()
{
int a=digitalRead(5);
int b=digitalRead(11);
int c=11;
antirebote_on_off(&a, &b, &c);//CONTROL DE BACHA
int d=digitalRead(6);
int e=digitalRead(10);
int f=10;
antirebote_on_off(&d, &e, &f);//GIRO Y CONTRA GIRO
int g=digitalRead(8);
antirebote_timer(&g);//CONTROL DE LLENA VASO
if(digitalRead(9)==HIGH){control(&g);}
}
¿Realmente quieres cerrar esta reparación?
Sí
No
¿Realmente quieres reabrir esta reparación?
Sí
No
¿Realmente quieres borrar este post?
Sí
No