This commit is contained in:
gauthiier
2022-07-13 14:30:59 +02:00
parent 367d996afc
commit 581c63a6aa
66 changed files with 2157 additions and 0 deletions
@@ -0,0 +1,27 @@
#include <FastTouch.h>
// Adrian Freed 2018
void setup()
{
SerialUSB.begin(9600);
}
void loop()
{
SerialUSB.print(fastTouchRead(A2)); SerialUSB.print(" ");
SerialUSB.print(fastTouchRead(A3)); SerialUSB.print(" ");
SerialUSB.print(fastTouchRead(A4)); SerialUSB.print(" ");
SerialUSB.print(fastTouchRead(A5)); SerialUSB.print(" ");
SerialUSB.print(fastTouchRead(2)); SerialUSB.print(" ");
SerialUSB.print(fastTouchRead(3)); SerialUSB.print(" ");
for(int i=9;i<=11;++i)
{
SerialUSB.print(fastTouchRead(i)); SerialUSB.print(" ");
}
SerialUSB.println();
delay(100);
}
@@ -0,0 +1,30 @@
#include <FastTouch.h>
//
// Adrian Freed 2019
//
// report on whether pins are being touched based on how
// slow the pins arrive at HIGH from ground when a PULLUP resistor is enabled
// all pin except the built-in LED are probed. Note that each pin will be hard pulled
// to ground and that interrupts are briefly stopped during the measurement.
//
void setup()
{
SerialUSB.begin(9600);
}
void loop()
{
for(int i=0;i<CORE_NUM_DIGITAL;++i)
{
if(i!=LED_BUILTIN)
{
SerialUSB.print(fastTouchRead(i)); SerialUSB.print(" ");
}
else
SerialUSB.print("LED ");
}
SerialUSB.println();
delay(200);
}
@@ -0,0 +1,44 @@
#include <FastTouch.h>
// monotone touch sequencer
// Adrian Freed 2018
void setup()
{
SerialUSB.begin(9600);
}
void loop()
{
int r;
const int tonepin=10;
const int notelength=140, notetonote=160;
SerialUSB.print(r = fastTouchRead(A2)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 587, notelength/(r-1)); delay(notetonote); }
SerialUSB.print(r = fastTouchRead(A3)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 440, notelength/(r-1)); delay(notetonote); }
SerialUSB.print(r = fastTouchRead(A4)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 880, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(A5)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 153, notelength/(r-1)); delay(notetonote); }
SerialUSB.print(r = fastTouchRead(2)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 185, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(3)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 196, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(9)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 349, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(11)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 370, notelength/(r-1)); delay(notetonote);}
SerialUSB.println();
}
@@ -0,0 +1,41 @@
#include <FastTouch.h>
// monotone touch sequencer
// Adrian Freed 2018
void setup()
{
SerialUSB.begin(9600);
}
void loop()
{
int r;
const int tonepin=A0;
const int notelength=140, notetonote=190;
SerialUSB.print(r = fastTouchRead(A2)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 587/2, notelength/(r-1)); delay(notetonote); }
SerialUSB.print(r = fastTouchRead(A3)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 440, notelength/(r-1)); delay(notetonote); }
SerialUSB.print(r = fastTouchRead(A4)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 220, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(A5)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 153, notelength/(r-1)); delay(notetonote); }
SerialUSB.print(r = fastTouchRead(A1)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 185, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(A6)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 196, notelength/(r-1)); delay(notetonote);}
SerialUSB.print(r = fastTouchRead(A7)); SerialUSB.print(" ");
if(r>1)
{ tone(tonepin, 349, notelength/(r-1)); delay(notetonote);}
SerialUSB.println();
}
+6
View File
@@ -0,0 +1,6 @@
# FastTouch
Use this library to detect whether your choice of Arduino pin is being touched.
The technique works with any Arduino pin that has an internal pull up resistor that
can be enabled. It returns a measure of how long it takes for a pin to rise
to a HIGH level after the pull up is enabled. This will be slowed by any
capacitive load added.
+2
View File
@@ -0,0 +1,2 @@
fastTouchRead KEYWORD1
fastTouchMax KEYWORD1
+9
View File
@@ -0,0 +1,9 @@
name=FastTouch
version=0.91
author=Adrian Freed <adrian@adrianfreed.com>
maintainer=Adrian Freed <adrian@adrianfreed.com>
sentence=Fast Touch Library
paragraph=Fast Capacitive Touch on any digital pin with a pull up option
category=Device Control
url=https://github.com/AdrianFreed/FastTouch
architectures=*
+803
View File
@@ -0,0 +1,803 @@
//
// FastTouch.cpp
//
//
// Created by AdrianFreed on 3/12/18.
//
//
#include "FastTouch.h"
#if defined(CORE_TEENSY)
//#if defined(__IMXRT1052__) || defined(__IMXRT10562__)
#if defined(__IMXRT1052__) || defined(__IMXRT1062__)
FASTRUN
int fastTouchRead(int pin)
{
int i;
const struct digital_pin_bitband_and_config_table_struct *p;
if (pin >= CORE_NUM_DIGITAL) return -1;
p = digital_pin_to_info_PGM + pin;
pinMode(pin, OUTPUT_OPENDRAIN);
digitalWrite(pin, LOW);
delayMicroseconds(1);
/* disable interrupts */
noInterrupts();
pinMode(pin, INPUT_PULLUP);
i=0;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
i++;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
i++;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
i++;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
i++;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
i++;
if((*(p->reg + 2) & p->mask)!=0)
goto out;
i++;
for(;i<64;++i)
if((*(p->reg + 2) & p->mask)!=0)
break;
// v += fastDigitalRead(pin)? 0:1;
{
pinMode(pin, OUTPUT_OPENDRAIN);
digitalWrite(pin, LOW);
}
out:
interrupts();
return i;
}
#elif defined(__MKL26Z64__)|| defined(__IMXRT1052__) || defined(__IMXRT1062__) /* Teensy 3LC */
FASTRUN
int fastTouchRead(int pin)
{
const unsigned m = digitalPinToBitMask(pin);
pinMode(pin, OUTPUT_OPENDRAIN);
digitalWrite(pin, LOW);
delayMicroseconds(50);
/* disable interrupts */
noInterrupts();
pinMode(pin, INPUT_PULLUP);
// for(int i=0;i<64;++i)
// ft_o += *port&x;
{
register unsigned a,b,c,d,e,f;
register unsigned aa,ba,ca,da;
#ifdef CONDITIONALAPPROACH
register unsigned i=0;
a = *portInputRegister(pin) & m ;
a = *portInputRegister(pin) & m ;
a = *portInputRegister(pin) & m ;
b = *portInputRegister(pin) & m ;
c = *portInputRegister(pin) & m ;
d = *portInputRegister(pin) & m ;
e = *portInputRegister(pin) & m ;
f = *portInputRegister(pin) & m ;
aa = *portInputRegister(pin) & m;
ba = *portInputRegister(pin) & m;
ca = *portInputRegister(pin) & m;
da = *portInputRegister(pin) & m;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
if( *portInputRegister(pin) & m )
goto out;
++i;
out: ;
#else
register unsigned i;
i = *portInputRegister(pin) & m;
i = *portInputRegister(pin) & m;
i = *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
i+= *portInputRegister(pin) & m;
#endif
interrupts();
// i += ((a & m)?0:1 ) + ((b& m )?0:1 ) +
// ((c & m)?0:1 ) + ((d& m)?0:1 ) + ((e & m)?0:1 ) + ((f& m)?0:1 );
//i += ((aa & m)?0:1 ) + ((ba& m )?0:1 ) +
// ((ca & m)?0:1 ) + ((da & m)?0:1 ) + ((ea & m)?0:1 ) + ((fa& m)?0:1 );
{volatile unsigned t = i, mm = m;
while(mm >>= 1)
t >>= 1;
i = 64 -t; } //+(a+b+c+d+e+f+da+ca+ba+aa 10+
pinMode(pin, OUTPUT_OPENDRAIN);
digitalWrite(pin, LOW);
return i;
}
}
#else
FASTRUN
int fastTouchRead(int pin)
{
pinMode(pin, OUTPUT_OPENDRAIN);
digitalWriteFast(pin, LOW);
delayMicroseconds(50);
/* disable interrupts */
noInterrupts();
pinMode(pin, INPUT_PULLUP);
// for(int i=0;i<64;++i)
// ft_o += *port&x;
{
register unsigned i=0;
register uint8_t a,b,c,d,e,f;
register uint8_t aa,ba,ca,da;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
a = *portInputRegister(pin) ;
b = *portInputRegister(pin) ;
c = *portInputRegister(pin) ;
d = *portInputRegister(pin) ;
e = *portInputRegister(pin) ;
f = *portInputRegister(pin) ;
aa = *portInputRegister(pin) ;
ba = *portInputRegister(pin) ;
ca = *portInputRegister(pin) ;
da = *portInputRegister(pin) ;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
if( *portInputRegister(pin))
goto out;
++i;
out:
interrupts();
// i += ((a & m)?0:1 ) + ((b& m )?0:1 ) +
// ((c & m)?0:1 ) + ((d& m)?0:1 ) + ((e & m)?0:1 ) + ((f& m)?0:1 );
//i += ((aa & m)?0:1 ) + ((ba& m )?0:1 ) +
// ((ca & m)?0:1 ) + ((da & m)?0:1 ) + ((ea & m)?0:1 ) + ((fa& m)?0:1 );
{volatile uint8_t t =10-(a+b+c+d+e+f+da+ca+ba+aa);
i+= t; }
pinMode(pin, OUTPUT_OPENDRAIN);
digitalWriteFast(pin, LOW);
return i;
}
}
#endif
#endif
int fastTouchMax()
{
return 60;
}
+243
View File
@@ -0,0 +1,243 @@
//
//
//FastTouch.h
// Fast Touch Sensing for AVR and Teensy 3
// Adrian Freed 2006-2018 Copyright. All Rights Reserved.
// Tested on Teensy 2.0, Clio, Lilypad, Lilypad USB, Flora, Leonardo, UNO, Micro, BLEpad, PRO Mini,
// Teensy 3.2 (more sensitive with optimized compiler settings and higher clock rate)
// Teensy 3LC
//
#ifndef FastTouch_h
#define FastTouch_h
#include <Arduino.h>
#if defined(CORE_TEENSY)
#include "core_pins.h"
#endif
#ifndef BIT_SET
# define BIT_SET(value, bit) ((value) |= (1UL << (bit)))
#endif
//Arduino
#if (defined(ARDUINO_AVR_MEGA) || \
defined(ARDUINO_AVR_MEGA1280) || \
defined(ARDUINO_AVR_MEGA2560) || \
defined(__AVR_ATmega1280__) || \
defined(__AVR_ATmega1281__) || \
defined(__AVR_ATmega2560__) || \
defined(__AVR_ATmega2561__))
#define __digitalPinToPortReg(P) \
(((P) >= 22 && (P) <= 29) ? &PORTA : \
((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PORTB : \
(((P) >= 30 && (P) <= 37) ? &PORTC : \
((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PORTD : \
((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PORTE : \
(((P) >= 54 && (P) <= 61) ? &PORTF : \
((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PORTG : \
((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PORTH : \
(((P) == 14 || (P) == 15) ? &PORTJ : \
(((P) >= 62 && (P) <= 69) ? &PORTK : &PORTL))))))))))
#define __digitalPinToDDRReg(P) \
(((P) >= 22 && (P) <= 29) ? &DDRA : \
((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &DDRB : \
(((P) >= 30 && (P) <= 37) ? &DDRC : \
((((P) >= 18 && (P) <= 21) || (P) == 38) ? &DDRD : \
((((P) >= 0 && (P) <= 3) || (P) == 5) ? &DDRE : \
(((P) >= 54 && (P) <= 61) ? &DDRF : \
((((P) >= 39 && (P) <= 41) || (P) == 4) ? &DDRG : \
((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &DDRH : \
(((P) == 14 || (P) == 15) ? &DDRJ : \
(((P) >= 62 && (P) <= 69) ? &DDRK : &DDRL))))))))))
#define __digitalPinToPINReg(P) \
(((P) >= 22 && (P) <= 29) ? &PINA : \
((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PINB : \
(((P) >= 30 && (P) <= 37) ? &PINC : \
((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PIND : \
((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PINE : \
(((P) >= 54 && (P) <= 61) ? &PINF : \
((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PING : \
((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PINH : \
(((P) == 14 || (P) == 15) ? &PINJ : \
(((P) >= 62 && (P) <= 69) ? &PINK : &PINL))))))))))
#define __digitalPinToBit(P) \
(((P) >= 7 && (P) <= 9) ? (P) - 3 : \
(((P) >= 10 && (P) <= 13) ? (P) - 6 : \
(((P) >= 22 && (P) <= 29) ? (P) - 22 : \
(((P) >= 30 && (P) <= 37) ? 37 - (P) : \
(((P) >= 39 && (P) <= 41) ? 41 - (P) : \
(((P) >= 42 && (P) <= 49) ? 49 - (P) : \
(((P) >= 50 && (P) <= 53) ? 53 - (P) : \
(((P) >= 54 && (P) <= 61) ? (P) - 54 : \
(((P) >= 62 && (P) <= 69) ? (P) - 62 : \
(((P) == 0 || (P) == 15 || (P) == 17 || (P) == 21) ? 0 : \
(((P) == 1 || (P) == 14 || (P) == 16 || (P) == 20) ? 1 : \
(((P) == 19) ? 2 : \
(((P) == 5 || (P) == 6 || (P) == 18) ? 3 : \
(((P) == 2) ? 4 : \
(((P) == 3 || (P) == 4) ? 5 : 7)))))))))))))))
// --- Arduino 644 ---
#elif (defined(__AVR_ATmega644__) || \
defined(__AVR_ATmega644P__))
#define __digitalPinToPortReg(P) \
(((P) >= 0 && (P) <= 7) ? &PORTB : (((P) >= 8 && (P) <= 15) ? &PORTD : (((P) >= 16 && (P) <= 23) ? &PORTC : &PORTA)))
#define __digitalPinToDDRReg(P) \
(((P) >= 0 && (P) <= 7) ? &DDRB : (((P) >= 8 && (P) <= 15) ? &DDRD : (((P) >= 8 && (P) <= 15) ? &DDRC : &DDRA)))
#define __digitalPinToPINReg(P) \
(((P) >= 0 && (P) <= 7) ? &PINB : (((P) >= 8 && (P) <= 15) ? &PIND : (((P) >= 8 && (P) <= 15) ? &PINC : &PINA)))
#define __digitalPinToBit(P) \
(((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 15) ? (P) - 8 : (((P) >= 16 && (P) <= 23) ? (P) - 16 : (P) - 24)))
#elif defined(__AVR_ATmega32U4__) && defined(CORE_TEENSY)
#define __digitalPinToPortReg(P) \
(((P) == 22 || (P) == 23 || (P) == 5 || (P) == 6 || (P) == 7 || (P) == 8 || (P) == 11 || (P) == 12) ? &PORTD : (((P) == 9 || (P) == 10) ? &PORTC : (((P) >= 17 && (P) <= 21)) ? &PORTF : (((P) == 24) ? &PORTE : &PORTB)))
#define __digitalPinToDDRReg(P) \
(((P) == 22 || (P) == 23 || (P) == 5 || (P) == 6 || (P) == 7 || (P) == 8 || (P) == 11 || (P) == 12) ? &DDRD : (((P) == 9 || (P) == 10) ? &DDRC : (((P) >= 17 && (P) <= 21)) ? &DDRF : (((P) == 24) ? &DDRE : &DDRB)))
#define __digitalPinToPINReg(P) \
(((P) == 22 || (P) == 23 || (P) == 5 || (P) == 6 || (P) == 7 || (P) == 8 || (P) == 11 || (P) == 12) ? &PIND : (((P) == 9 || (P) == 10) ? &PINC : (((P) >= 17 && (P) <= 21)) ? &PINF : (((P) == 24) ? &PINE : &PINB)))
#define __digitalPinToBit(P) \
(((P) >= 0 && (P) <= 3) ? (P) : (((P) >= 5 && (P) < 9) ? (P) - 5 : (((P) == 4) ? 7 : (((P) == 9) ? 6 : (((P) == 10) ? 7 : \
(((P) == 11) ? 6 : (((P) == 12) ? 7 : (((P) == 13) ? 4 : (((P) == 14) ? 5 : (((P) == 15) ? 6 : (((P) == 16) ? 7 :\
(((P) == 17) ? 6 : (((P) == 18) ? 5 : (((P) == 19) ? 4 : (((P) == 20) ? 1 : (((P) == 21) ? 0 : (((P) == 22) ? 4 : (((P) == 23) ? 5 :\
(((P) == 24) ? 6 : 6 )))))))))))))))))))
// --- Arduino Leonardo ---
#elif (defined(ARDUINO_AVR_LEONARDO) || \
defined(__AVR_ATmega16U4__) || \
defined(__AVR_ATmega32U4__))
#define __digitalPinToPortReg(P) \
((((P) >= 0 && (P) <= 4) || (P) == 6 || (P) == 12 || (P) == 24 || (P) == 25 || (P) == 29) ? &PORTD : (((P) == 5 || (P) == 13) ? &PORTC : (((P) >= 18 && (P) <= 23)) ? &PORTF : (((P) == 7) ? &PORTE : &PORTB)))
#define __digitalPinToDDRReg(P) \
((((P) >= 0 && (P) <= 4) || (P) == 6 || (P) == 12 || (P) == 24 || (P) == 25 || (P) == 29) ? &DDRD : (((P) == 5 || (P) == 13) ? &DDRC : (((P) >= 18 && (P) <= 23)) ? &DDRF : (((P) == 7) ? &DDRE : &DDRB)))
#define __digitalPinToPINReg(P) \
((((P) >= 0 && (P) <= 4) || (P) == 6 || (P) == 12 || (P) == 24 || (P) == 25 || (P) == 29) ? &PIND : (((P) == 5 || (P) == 13) ? &PINC : (((P) >= 18 && (P) <= 23)) ? &PINF : (((P) == 7) ? &PINE : &PINB)))
#define __digitalPinToBit(P) \
(((P) >= 8 && (P) <= 11) ? (P) - 4 : (((P) >= 18 && (P) <= 21) ? 25 - (P) : (((P) == 0) ? 2 : (((P) == 1) ? 3 : (((P) == 2) ? 1 : (((P) == 3) ? 0 : (((P) == 4) ? 4 : (((P) == 6) ? 7 : (((P) == 13) ? 7 : (((P) == 14) ? 3 : (((P) == 15) ? 1 : (((P) == 16) ? 2 : (((P) == 17) ? 0 : (((P) == 22) ? 1 : (((P) == 23) ? 0 : (((P) == 24) ? 4 : (((P) == 25) ? 7 : (((P) == 26) ? 4 : (((P) == 27) ? 5 : 6 )))))))))))))))))))
// --- Arduino Uno ---
#elif (defined(ARDUINO_AVR_UNO) || \
defined(ARDUINO_AVR_DUEMILANOVE) || \
defined(__AVR_ATmega328__) || \
defined(__AVR_ATmega328P__) || \
defined(__AVR_ATmega328PB__))
#if defined(__AVR_ATmega328PB__)
#define __digitalPinToPortReg(P) \
(((P) >= 0 && (P) <= 7) ? &PORTD : (((P) >= 8 && (P) <= 13) ? &PORTB : (((P) >= 14 && (P) <= 19) ? &PORTC : &PORTE)))
#define __digitalPinToDDRReg(P) \
(((P) >= 0 && (P) <= 7) ? &DDRD : (((P) >= 8 && (P) <= 13) ? &DDRB : (((P) >= 14 && (P) <= 19) ? &DDRC : &DDRE)))
#define __digitalPinToPINReg(P) \
(((P) >= 0 && (P) <= 7) ? &PIND : (((P) >= 8 && (P) <= 13) ? &PINB : (((P) >= 14 && (P) <= 19) ? &PINC : &PINE)))
#define __digitalPinToBit(P) \
(((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 13) ? (P) - 8 : (((P) >= 14 && (P) <= 19) ? (P) - 14 : (((P) >= 20 && (P) <= 21) ? (P) - 18 : (P) - 22))))
#else
#define __digitalPinToPortReg(P) \
(((P) >= 0 && (P) <= 7) ? &PORTD : (((P) >= 8 && (P) <= 13) ? &PORTB : &PORTC))
#define __digitalPinToDDRReg(P) \
(((P) >= 0 && (P) <= 7) ? &DDRD : (((P) >= 8 && (P) <= 13) ? &DDRB : &DDRC))
#define __digitalPinToPINReg(P) \
(((P) >= 0 && (P) <= 7) ? &PIND : (((P) >= 8 && (P) <= 13) ? &PINB : &PINC))
#define __digitalPinToBit(P) \
(((P) >= 0 && (P) <= 7) ? (P) : (((P) >= 8 && (P) <= 13) ? (P) - 8 : (P) - 14))
#endif
#endif
#if defined(AVR)
static byte ft_o,ft_p,ft_q,ft_r,ft_s,ft_t,ft_u,ft_v,ft_w,ft_x, ft_y, ft_z;
#define fastTouchRead(pin) \
( digitalWrite(pin, LOW), \
pinMode(pin, OUTPUT), \
delay(1), \
pinMode(pin, INPUT), \
/* disable interrupts */ \
BIT_SET(*__digitalPinToPortReg(pin), __digitalPinToBit(pin)), \
ft_o = *__digitalPinToPINReg(pin), \
ft_p = *__digitalPinToPINReg(pin), \
ft_q = *__digitalPinToPINReg(pin), \
ft_r = *__digitalPinToPINReg(pin), \
ft_s = *__digitalPinToPINReg(pin), \
ft_t = *__digitalPinToPINReg(pin), \
ft_u = *__digitalPinToPINReg(pin), \
ft_v = *__digitalPinToPINReg(pin), \
ft_w = *__digitalPinToPINReg(pin), \
ft_x = *__digitalPinToPINReg(pin), \
ft_y = *__digitalPinToPINReg(pin), \
ft_z = *__digitalPinToPINReg(pin), \
/* enable interrupts */ \
!(ft_p & (1<< __digitalPinToBit(pin))) + !(ft_q & (1<< __digitalPinToBit(pin))) + \
!(ft_r & (1<< __digitalPinToBit(pin))) + !(ft_s & (1<< __digitalPinToBit(pin))) + \
!(ft_t & (1<< __digitalPinToBit(pin)))+ !(ft_u & (1<< __digitalPinToBit(pin)))+ \
!(ft_v & (1<< __digitalPinToBit(pin)))+ !(ft_w & (1<< __digitalPinToBit(pin)))+ \
!(ft_x & (1<< __digitalPinToBit(pin)))+ !(ft_y & (1<< __digitalPinToBit(pin)))+ \
!(ft_z & (1<< __digitalPinToBit(pin))) )
#elif defined(_SAMD21_)
static volatile uint32_t ft_o,ft_p,ft_q,ft_r,ft_s,ft_t,ft_u,ft_v,ft_w,ft_x, ft_y, ft_z;
static volatile uint32_t ft_xo,ft_xp,ft_xq,ft_xr,ft_xs,ft_xt,ft_xu,ft_xv,ft_xw,ft_xx, ft_xy, ft_xz;
#define fastTouchRead(pin) \
( pinMode(pin, OUTPUT), \
digitalWrite(pin, LOW), \
delay(1), \
pinMode(pin, INPUT_PULLUP), \
/* disable interrupts */ \
ft_p = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_q = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_r = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_s = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_t = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_u = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_v = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_w = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_x = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_y = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_z = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xo = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xp = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xq = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xr = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xs = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xt = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xu = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xv = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xw = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xx = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xy = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
ft_xz = PORT->Group[g_APinDescription[pin].ulPort].IN.reg, \
/* enable interrupts */ \
!(ft_p & (1ul << g_APinDescription[pin].ulPin)) + !(ft_q & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_r & (1ul << g_APinDescription[pin].ulPin)) + !(ft_s & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_t & (1ul << g_APinDescription[pin].ulPin)) + !(ft_u & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_v & (1ul << g_APinDescription[pin].ulPin)) + !(ft_w & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_x & (1ul << g_APinDescription[pin].ulPin)) + !(ft_y & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_z & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xo & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xp & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xq & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xr & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xs & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xt & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xu & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xv & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xw & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xx & (1ul << g_APinDescription[pin].ulPin)) + !(ft_xy & (1ul << g_APinDescription[pin].ulPin)) + \
!(ft_xz & (1ul << g_APinDescription[pin].ulPin)) \
)
#else
int fastTouchRead( int );
extern int fastTouchMax(void);
#endif
#endif /* FastTouch_h */