Interrupts with analog values
okay. so, i'm kind of stuck. i need able generate interrupt , go isr when value on analog input changes. i have signal tied analog pin 0 which, depending on value of it, sends commands usb keyboard controller chip. my problem way have program set now, i'm having poll analog value @ beginning of loop function. this causes me have push , hold various buttons generate analog value program picks up. i need program detect when value changes , start handling it. the analog value stays @ 0~1 until button pushed. below code have...hopefully question makes sense....
int presscount = 0;
int analogval = 0;
int val = 0;
void setup()
{
pinmode(1, output); // output clock
pinmode(2, output); // output character pins
pinmode(3, output);
pinmode(4, output);
pinmode(5, output);
pinmode(6, output);
pinmode(7, output);
pinmode(8, output);
pinmode(9, output);
digitalwrite(2, high); // make sure no characters sent on usb bus when program begins
}
void loop()
{
val = analogread(0);
if(val > 2 && val < 50)
{
delay(500);
val = analogread(0);
if(val > 2 && val < 50)
{
printchar(4);
clocksingle();
}
}
else
{
printchar(0);
while(val > 50)
{
clockmult();
val = analogread(0);
}
presscount = 0;
}
}
void clockmult()
{
digitalwrite(1,low);
delay(.128);
digitalwrite(1,high);
if(presscount < 3)
{
++presscount;
delay(200);
}
else if(presscount < 10)
{
++presscount;
delay(100);
}
else
{
delay(.128);
}
}
void clocksingle()
{
digitalwrite(1,low);
delay(.128);
digitalwrite(1,high);
delay(500);
}
void printchar(int x)
{
if(x == 0) // down
{
digitalwrite(2, high);
digitalwrite(3, low);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 1) // up
{
digitalwrite(2, low);
digitalwrite(3, low);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 2) // enter
{
digitalwrite(2, high);
digitalwrite(3, low);
digitalwrite(4, high);
digitalwrite(5, high);
digitalwrite(6, low);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 3) // esc
{
digitalwrite(2, low);
digitalwrite(3, low);
digitalwrite(4, low);
digitalwrite(5, low);
digitalwrite(6, low);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 4) // right
{
digitalwrite(2, low);
digitalwrite(3, high);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 5) // left
{
digitalwrite(2, high);
digitalwrite(3, high);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
}
int presscount = 0;
int analogval = 0;
int val = 0;
void setup()
{
pinmode(1, output); // output clock
pinmode(2, output); // output character pins
pinmode(3, output);
pinmode(4, output);
pinmode(5, output);
pinmode(6, output);
pinmode(7, output);
pinmode(8, output);
pinmode(9, output);
digitalwrite(2, high); // make sure no characters sent on usb bus when program begins
}
void loop()
{
val = analogread(0);
if(val > 2 && val < 50)
{
delay(500);
val = analogread(0);
if(val > 2 && val < 50)
{
printchar(4);
clocksingle();
}
}
else
{
printchar(0);
while(val > 50)
{
clockmult();
val = analogread(0);
}
presscount = 0;
}
}
void clockmult()
{
digitalwrite(1,low);
delay(.128);
digitalwrite(1,high);
if(presscount < 3)
{
++presscount;
delay(200);
}
else if(presscount < 10)
{
++presscount;
delay(100);
}
else
{
delay(.128);
}
}
void clocksingle()
{
digitalwrite(1,low);
delay(.128);
digitalwrite(1,high);
delay(500);
}
void printchar(int x)
{
if(x == 0) // down
{
digitalwrite(2, high);
digitalwrite(3, low);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 1) // up
{
digitalwrite(2, low);
digitalwrite(3, low);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 2) // enter
{
digitalwrite(2, high);
digitalwrite(3, low);
digitalwrite(4, high);
digitalwrite(5, high);
digitalwrite(6, low);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 3) // esc
{
digitalwrite(2, low);
digitalwrite(3, low);
digitalwrite(4, low);
digitalwrite(5, low);
digitalwrite(6, low);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 4) // right
{
digitalwrite(2, low);
digitalwrite(3, high);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
else if(x == 5) // left
{
digitalwrite(2, high);
digitalwrite(3, high);
digitalwrite(4, low);
digitalwrite(5, high);
digitalwrite(6, high);
digitalwrite(7, low);
digitalwrite(8, low);
digitalwrite(9, low);
}
}
macdub, summarise want program should do. describing functionality desire make easier suggest alternative implementations solve problem.
its little difficult see posted implementation sketch supposed do.
its little difficult see posted implementation sketch supposed do.
Arduino Forum > Forum 2005-2010 (read only) > Software > Syntax & Programs > Interrupts with analog values
arduino
Comments
Post a Comment