PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme beim Touch Sensor Programm



Teslafan
09.11.2010, 13:18
Hallo,

bin noch blutiger Anfänger im Bereich Mikrocontroller Technik will aber für ein Schulprojekt folgendes realisieren:
Ein Touch Schalter soll eine LED zum leuchten bringen.

Bin über die Seite von Martin Junghans gestolpert:

http://www.jtronics.de/elektronik-avr/kapazitives-touch-pad.html

und hab mal versucht dies nachzubauen aber halt nur mit einem Taster und LED als Ausgang.
Mein Programm oder besser das abgeänderte von Martin sieht nun wie folgt aus:

#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <util\atomic.h>


#define SK_A0 (1<<5)
#define SK_B0 (1<<4)
#define SK_A1 (1<<2)
#define SK_B1 (1<<3)
#define SK_A2 (1<<0)
#define SK_B2 (1<<1)
#define SK_A012 (SK_A0 | SK_A1 | SK_A2)
#define SK_B012 (SK_B0 | SK_B1 | SK_B2)
#define MAX_CYCLE 2000

uint16_t keys[3];

void read_senskey( void )
{
uint16_t i = MAX_CYCLE;
uint8_t a, b, x, y;

ATOMIC_BLOCK(ATOMIC_FORCEON){
a = DDRA & ~(SK_A012 | SK_B012);
b = PORTA & ~(SK_A012 | SK_B012);
y = SK_B012; // input mask
do{
DDRA = a; // tristate
PORTA = b | SK_B012;
DDRA = a | SK_B012; // Bx = strong high
DDRA = a; // tristate
PORTA = b;
DDRA = a | SK_A012; // Ax = strong low
if( --i == 0 ) // timeout
break;
x = y & PINA; // not immediately after DDRA
if( x ){
if( x & SK_B0 )
keys[0] = i;
if( x & SK_B1 )
keys[1] = i;
if( x & SK_B2 )
keys[2] = i;
}
y ^= x; // clear processed input
}while( y ); // all inputs done
DDRA = a | SK_A012 | SK_B012; // discharge
}
}

int main (void)

{
DDRA = 0xff;
PORTA = 0x01;
_delay_ms( 50000 );

if ( PINA & (1<<PINA4) )

{
PORTA = 0x01;
}
}

Leider funktioniert es nicht :(
Kann mir jemand helfen?

BMS
09.11.2010, 14:57
Hallo,

Du musst deine Funktion (Methode) auch aufrufen, sonst tut sich da nichts.
Außerdem musst du immer und immer wieder das Touchfeld abfragen und die Ergebnisse davon verwerten. Deswegen eine Endlosschleife mit while(1) einbauen!

So ähnlich könnte das aussehen:


...
void read_senskey( void )
{
uint16_t i = MAX_CYCLE;
uint8_t a, b, x, y;

ATOMIC_BLOCK(ATOMIC_FORCEON){
a = DDRA & ~(SK_A012 | SK_B012);
b = PORTA & ~(SK_A012 | SK_B012);
y = SK_B012; // input mask
do
{
DDRA = a; // tristate
PORTA = b | SK_B012;
DDRA = a | SK_B012; // Bx = strong high
DDRA = a; // tristate
PORTA = b;
DDRA = a | SK_A012; // Ax = strong low
if( --i == 0 ) // timeout
break;
x = y & PINA; // not immediately after DDRA
if( x )
{
if( x & SK_B0 )
keys[0] = i;
if( x & SK_B1 )
keys[1] = i;
if( x & SK_B2 )
keys[2] = i;
}
y ^= x; // clear processed input
}
while( y ); // all inputs done
DDRA = a | SK_A012 | SK_B012; // discharge
}
}

int main (void)
{
DDRA = 0xff; //PORTA komplett Output
PORTA = 0x01; //Damit ist PA4 auf +5Volt

// _delay_ms( 50000 ); // wozu ??

while(1)
{
read_senskey(); //obere Funktion wird aufgerufen, diese fragt ja die Touchfelder ab

//jetzt die Ergebnisse der Touchabfrage (welche im Array keys[] gespeichert wurden) verwerten
if( keys[0]>gibeineZahlein )
{
//LED an
PORTA|=0x01;
}
else
{
//LED aus
PORTA&=0xFE;
}
}

}

PS: Bitte nächstes mal Code-Tags beim eingeben verwenden, dann sieht dein Programm so wie das hier drüber aus^^

Das Programm würde jetzt ein Touchfeld an PA4 / PA5 abfragen und damit eine LED an PA0 schalten.

(bei der void stimmen irgendwie die geschweiften Klammern {} nicht ganz...? oder hab ich mich verzählt?)

Hoffe, ich konnte dir weiterhelfen ;)

Gruß,
Bernhard

Teslafan
09.11.2010, 16:02
Vielen Dank,

du hast mir ja nicht zum ersten mal geholfen, das mit der ADC Wandlung funktioniert jetzt inzwischen übrigens wirklich supi, kann jetzt über 5 LEDS die Spannung 0-5V anzeigen, nichts bahnbrechendes, aber für mich doch ein kleines Wunder :)

Werd das mit dem Touchfeld heute Abend gleich mal ausprobieren, bis dahin bin ich dir zu tiefstem Dank verpflichtet :)

Teslafan
09.11.2010, 18:35
Mal ne frage muß die Elektrode nur mit dem Widerstand oder auch noch mit GND oder so verbunden sein?
Hab jetzt mal die Spannung an PA4 und PA5 überprüft:
PA4 hat 1,7V und steigt an auf 1,72V wenn ich mit dem Finger in die nähe komme.
PA5 hat 0,6V

PA0 leuchtet dauerhaft aber nur sehr leicht wenn ich die kontakte vom Kondensator abziehe leuchtet sie stark.

Teslafan
09.11.2010, 21:06
Juhu es funktioniert, ich danke dir für die Hilfe