Autor Thema: Touch-Sensor mit PIC  (Gelesen 5915 mal)

Offline Luftlandeapotheker

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
Touch-Sensor mit PIC
« am: Februar 28, 2012, 00:28:12 Vormittag »
Hallo zusammen!

Im Netz habe ich eine interessante Schaltung eines Kapazitiven Sensors gefunden (http://www.elektronik-labor.de/AVR/Touch.html) und (www.zabex.de/site/schaltungstechnik.html#kanmi2).
Diese möchte ich mit einem PIC12F675 nachbauen.
Ursprünglich ist das Projekt für ATtiny13 bzw. Atmel-Prozesoren gedacht.
Hier mein Versuch, das Ganze auf einem PIC 16F877 nachzubauen:
Zwischen PB0 und PB1 befindet sich ein 22nF Keramik-Kondensator, an PB1 hängt noch ein Metallstück als Sensor dran.
int n;
void main()
{setup_adc_ports(NO_ANALOGS);
 setup_adc(ADC_OFF);
 setup_psp(PSP_DISABLED);
 setup_spi(FALSE);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_DISABLED);
 setup_timer_2(T2_DISABLED,0,1);
 Printf ("\nTest o.K.");
 delay_ms(500);
 set_tris_B(0x00);  //alle Ausgang
 output_B (0x00);
 delay_us(250);
   while(1)
   {
   set_tris_B (0x02);  //Pin_B1 Eingang
   output_B (0x00);  // PORT B low
   n=0;
      While(1)
      {
      set_tris_B (0x02);  //Pin_B0 Ausgang, B1 Eingang
      output_B (0x01);  //Pin_B0 high (+)
      delay_us(10);
      n++;
      set_tris_B (0x03);  //Pin_B0, B1 Eingang
      delay_us(10);
      set_tris_B (0x01);  //Pin_B0 Eingang, B1 Ausgang
      output_B (0x01);  //Pin_B0 high, B1 low
      delay_ms(250);
      if (input(PIN_B0)==1) break;
      set_tris_B (0x03);  //Pin B0, B1 Eingang
      }
   set_tris_B (0x00);     //PIN_B0,1,2,3,4 Ausgang
   output_B (0x00);     //PORTB = low
   Printf ("\nLadezyklen =%i",n);
   }
}

Leider funktioniert es noch nicht. Als Ladezyklus wird immer 1 ausgegeben.
Meine Frage:
Hab ich das BASCOM-Programm aus dem 1. Link korrekt umgesetzt? Oder gibt es einen essentiellen Unterschied zwischen Atmel und PIC, den ich übersehen habe?

Über Anregungen würde ich mich sehr freuen!

Danke schonmal..

Matthias

Offline Stampede

  • Hero Member
  • *****
  • Beiträge: 1026
    • Profil anzeigen
    • PicPlayer.de
Re:Touch-Sensor mit PIC
« Antwort #1 am: Februar 28, 2012, 10:07:25 Vormittag »
Hi,

check mal alle Ansel, Tris, Port Register etc. WEnn du ein Oszi hast, mal messen.

      output_B (0x01);  //Pin_B0 high, B1 low
      delay_ms(250);
      if (input(PIN_B0)==1) break;
Ohne dass ich mir alles im Detail angeschaut hat. Egal was du an B0 anschliesst: Wenn du den Pin erst high setzt, dann 250ms wartest, und dann den Pegel abfragst, dann würde es mich auch wundern wenn da was anderes als eine 1 zurückgegeben wird (ausser es hängt eine riesige Kapazität dran). Sicher, dass das so stimmt?

Gruß
Stefan

Offline Luftlandeapotheker

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
Re:Touch-Sensor mit PIC
« Antwort #2 am: Februar 28, 2012, 20:21:40 Nachmittag »
Hallo Stefan!

Ja, da hast du selbstverständlich Recht, da sollte immer 1 rauskommen. Ich habe mir nochmal die Grundlagen angeschaut, und daraufhin die Schleife wie folgt geändert:
while(1)
   {
   set_tris_B (0x02);  //Pin_B1 Eingang
   output_B (0x00);  // PORT B low
   n=0;
      While (1)
      {
      set_tris_B (0x01);  //Pin_B0 Eingang, B1 Ausgang
      output_B (0x02);  //Pin_B1 high (+)
      delay_us(100);
      n++;
      Output_B (0x00);
      set_tris_B (0x02);  //Pin_B0, Ausgang, Pin_B1 Eingang
      delay_us(10);
      set_tris_B (0x03);  //Pin B0, B1 Eingang
      if (input(PIN_B0)==1)
      {break;}
      }
   set_tris_B (0x00);     //PIN_B0,1,2,3,4 Ausgang
   output_B (0x00);     //PORTB = low
   Printf ("\nLadezyklen =%Lu",n);
   delay_us(250);

Nach dem Test wird jetzt auch etwas angezeigt, allerdings sieht das mehr nach Zufall aus, und auch nur, wenn ich den Sensor berühre. :D
Werde nochmal die Grundlagen lesen müssen...
Ein Oszi habe ich natürlich gerade nicht bei der Hand.

Vielen Dank schonmal!
Gruß
Matthias

 


* Recent Topics