Forum: Mikrocontroller und Digitale Elektronik Frequenzzählung mit PIC 12F675 und Komparator


von Steve L. (steve_l)


Lesenswert?

Hallo!
Ich bin gerade dabei, eine Frequenzzählungt mit einem PIC 12F675 mittels 
des internen Komparators zu realisieren. Es ist lediglich eine 
Unterscheidung zwischen 50Hz bzw. 51Hz notwendig. Dazu habe ich einen 
220/12 Trafo, welchen ich auf der Sekundärseite mit einem 
Spannungsteiler belaste, damit ich am PIC etwa 3V(eff) habe. Die beiden 
Pole sind auf den Komparatoreingang geschaltet. Nun will ich als ersten 
Test einfach eine LED jede Sekunde mittels der Netzfrequenz toggeln.
Der Code dazu ist unten angeführt.

Nun hab ich das Problem, dass die LED so schnell schaltet, dass sie 
eigentlich nur "gedimmt" ist. Wenn ich für Count einen Wert von 10000 
verwende, sind die Perioden der LED etwas länger als eine Sekunde.

Ich hab schon einiges ausprobiert, verstehe aber nicht, warum die 
Interrupts des Komparators so häufig auftreten. Das sollte doch nur alle 
10ms (bei einem Nulldurchgang) passieren.
Ich würde mich freuen, wenn jemand eine Idee oder einen Hinweis hätte.

Schönen Gruß,
Steve

CODE:

#include <frequenz1.h>
boolean on=false;
int16 count;

void init();
void led_off();
void led_on();
void led_toggle();


#int_COMP
void COMP_isr()
{   count++;
    clear_interrupt(INT_COMP);
}

void main()
{
   init();

   while(true){
      if(count>100)
      {  count=0;
         led_toggle();
      }
   }
}

void init()
{  setup_comparator(A0_A1);
   clear_interrupt(INT_COMP);
   enable_interrupts(INT_COMP);
   enable_interrupts(GLOBAL);
   count=0;
}

void led_off()
{  if(on)
   {  output_low(PIN_A5);
      output_low(PIN_A2);
      on=false;
   }
}

void led_on()
{    if(!on)
     {  output_low(PIN_A5);
        output_high(PIN_A2);
        on=true;
     }
}

void led_toggle()
{  if(on)
      led_off();
   else
      led_on();
}

von usuru (Gast)


Lesenswert?

Ein Comparator hat keine ST-Eingänge, daher hast Du kurz vor und kurz 
nach dem Nulldurchgang Zeiten, in denen der Comparator "zappelt". Leg 
COUT mal an einen Oszi, dann siehst Du das.

Workaround: Bau in die ISR eine Verzögerung ein.

von Steve L. (steve_l)


Lesenswert?

Besten Dank für deine Antwort! Konnte damit den Fehler beheben!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.