mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Touch Sensor Programm


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin noch blutiger Anfänger im Bereich Mikrocontroller Technik, will nun 
aber für ein kleines Schulprojekt einen Touch Taster einbauen. Bin auf 
die Projektseite von Martin Junghans gestoßen

http://www.jtronics.de/elektronik-avr/kapazitives-...

und das hat mir dann recht gut gefallen, hab den Code von seiner seite 
jetzt einmal in AVR studio kopiert, bekomme aber ziehmlich viele 
Fehlermeldungen :(
Bräuchte theoretisch auch nur ein Touch Schalter welcher einfach einen 
Ausgang anschalten soll.

Bei dem Programm seh ich leider gar nicht durch weil keine Ports sondern 
x und y verwendet werden, kann mir einer von euch helfen das zu 
verstehen?
Gerade so ewtas wie ATOMIC_BLOCK und so weiter übersteigt halt meinen 
Horizont.

Hier mal der Code:
#include <avr/io.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)
{

return 0;
}

Danke schon mal im vorraus.

Autor: Martin J. (bluematrix) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo andi,
hilfe und mehr Informationen findest du:

da: Beitrag "qtouch - sekt oder selters"
und
da: Beitrag "kapazitiver Touch Sensor - Slider - Wheel"

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

erstmal vielen dank für die schnelle Antwort
Die beiden Beiträge kenne ich schon, das Prinzip ist mir eigentlich auch 
klar, ich denke mein Hauptproblem ist das ich nicht genügend Ahnung von 
der Programmierung habe. Hab mir dein Quellcode mal angesehen also den 
kompletten, aber bei Sachen wie "ATOMIC_BLOCK(ATOMIC_FORCEON)" steig ich 
aus. Die Anleitung auf deiner Homepage über die Funktionsweise klingt 
sehr logisch, ist es auch einfacher zu realisieren also ohne diese 
ATOMIC_BLOCK(ATOMIC_FORCEON)?
Im Grunde genommen könnte ich doch auch:

1: PB1 und PC1 wie folgt als Ausgänge auf Low definieren:

PORTB &= ~(1<<PB1);
PORTC &= ~(1<<PC1);

und dann einfach nen delay machen mit 500ms

2: Eine Schleife machen und PB1 auf High setzen und PC1 auf Eingang 
setzen:
while(){
PORTB |= (1<<PB1);
DDRC  &= ~(1<<DDC1);
nen delay machen mit 500ms
3:Jetzt PC1 als Ausgang mit 0V und PB1 als Eingang
PORTC &= ~(1<<PC1);
DDRB  &= ~(1<<DDB1);
4: Jetzt kommt mein Hauptproblem:

Wie kann ich prüfen ob die Spannung an Cs ausreicht? Und was muß in die 
Schleife rein um wieder aus dieser raus zu kommen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.