Bueno, configurando las interrupciones y haciendo pruebas queria simplemente que cuando le diera al quinto boton comenzara a contar el timer a un ciclo de tiempo lento y que se me parase y volviera a la seleccion de tiempo al llegar a un numero de ticks X (en el ejemplo del codigo mostrado es 21). Pues bueno, esto no me sale, usando el cli(); el timer sigue contando y no vuelve a nada... he probado mil cosas y no se que hacer.
Os dejo el código a ver si podeis ayudarme, lo agradeceria mucho!!
un saludo
Código:
//------------------------------------------------------------------------
/*
* Codigo de control para insoladora con lcd y programacion de tiempo
* Autor: Gabriel Garcia Garrido
* Fecha: Noviembre 2015
*/
//------------------------------------------------------------------------
// (Conexiones)
/*
* RS: pin 7
* EN: pin 8
* D4: pin 9
* D5: pin 10
* D6: pin 11
* D7: pin 12
*/
//incluir la libreria LiquidCrystal
#include <LiquidCrystal.h>
#include <avr/io.h>
#include <avr/interrupt.h>
LiquidCrystal lcd(7,8,9,10,11,12);
//Creacion de los caracteres para la cuenta atras
byte p20[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
byte p40[8] = {
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
};
byte p60[8] = {
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
};
byte p80[8] = {
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
};
byte p100[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
int SegProg=0;
int MinProg=0;
int SegProgAnt=0;
int MinProgAnt=0;
int estadoactual=0;
int estadoanterior=0;
int estadoactual1=0;
int estadoanterior1=0;
int estadoactual2=0;
int estadoanterior2=0;
int estadoactual3=0;
int estadoanterior3=0;
int estadoactual4=0;
int estadoanterior4=0;
int pulsador1=3;
int pulsador2=4;
int pulsador3=5;
int pulsador4=6;
int pulsador5=13;
int ticks=0;
void setup(){
Serial.begin(9600);
pinMode(pulsador1,INPUT);
pinMode(pulsador2,INPUT);
pinMode(pulsador3,INPUT);
pinMode(pulsador4,INPUT);
pinMode(pulsador5,INPUT);
lcd.begin(16,2);
MostrarMensageInicio();
InterruptConfig();
ImpIniSet();
}
void loop(){
SeleccionDeTiempo();
ImprSetTime();
estadoactual4=digitalRead(pulsador5);
if(estadoanterior4==LOW && estadoactual4==HIGH){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
sei();
}
if(estadoanterior==HIGH && estadoactual==LOW){
estadoanterior=estadoactual;
}
}
void MostrarMensageInicio(){
lcd.setCursor(0,0);
lcd.print(" Firmware v1.0 ");
lcd.setCursor(0,1);
lcd.print(" Starting up ");
delay(3000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
}
//----------------------------funcion de configuracion de tiempo-----------------------
void SeleccionDeTiempo(){
//lectura del flanco del pulsador de seg ascendente
estadoactual=digitalRead(pulsador1);
if(estadoanterior==LOW && estadoactual==HIGH){
SegProg=SegProg+5;
if(SegProg==60){
SegProg=0;
MinProg+=1;
}
lcd.print(" ");
estadoanterior=estadoactual;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior==HIGH && estadoactual==LOW){
estadoanterior=estadoactual;
}
//lectura del flanco del pulsador de seg descendente
estadoactual1=digitalRead(pulsador2);
if(estadoanterior1==LOW && estadoactual1==HIGH){
SegProg-=5;
if(SegProg==-5){
if(MinProg==0){
SegProg=0;
MinProg=0;
}
else{
SegProg=55;
MinProg-=1;
}
}
lcd.print(" ");
estadoanterior1=estadoactual1;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior1==HIGH && estadoactual1==LOW){
estadoanterior1=estadoactual1;
}
//lectura del flanco del pulsador de min ascendente
estadoactual2=digitalRead(pulsador3);
if(estadoanterior2==LOW && estadoactual2==HIGH){
MinProg+=1;
lcd.print(" ");
estadoanterior2=estadoactual2;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior2==HIGH && estadoactual2==LOW){
estadoanterior2=estadoactual2;
}
//lectura del flanco del pulsador de min descendente
estadoactual3=digitalRead(pulsador4);
if(estadoanterior3==LOW && estadoactual3==HIGH){
MinProg-=1;
lcd.print(" ");
estadoanterior3=estadoactual3;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior3==HIGH && estadoactual3==LOW){
estadoanterior3=estadoactual3;
}
// Imposicion para tiempos negativos o mayor de 100
if (SegProg<0)
{
SegProg =0;
}
if (MinProg<0)
{
MinProg =0;
}
if(MinProg>99){
MinProg=99;
}
}
//------------------ Instrucciones de LCD ----------------------------------
void ImpIniSet(){
lcd.setCursor(0,0);
lcd.print(" Set Time: ");
lcd.setCursor(0,1);
lcd.print(" 00:00 ");
}
void ImprSetTime(){
if(MinProg!=MinProgAnt || SegProg!=SegProgAnt){
lcd.setCursor(0,0);
lcd.print(" Set Time: ");
lcd.setCursor(5,1);
if(MinProg<10){
lcd.print("0");
lcd.print(MinProg);
if(SegProg<10){
lcd.print(":0");
lcd.print(SegProg);
}
else{
lcd.print(":");
lcd.print(SegProg);
}
}
else{
lcd.print(MinProg);
if(SegProg<10){
lcd.print(":0");
lcd.print(SegProg);
}
else{
lcd.print(":");
lcd.print(SegProg);
}
}
MinProgAnt=MinProg;
SegProgAnt=SegProg;
}
}
//-------------------- Instrucciones de interrupciones -----------------------
void InterruptConfig(){
cli();
TCCR1A=0;
TCCR1B=0;
// para lo s 62,5 ms OCR1A=975;
OCR1A=15675;
TCCR1B |= (1<<WGM12);
TCCR1B |= (1<<CS10);
TCCR1B |= (1<<CS12);
TIMSK1=(1<<OCIE1A);
}
ISR(TIMER1_COMPA_vect){
ticks++;
Serial.print(ticks);
if(ticks==21){
ticks=0;
cli();
}
}