Frequenzzähler
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Timer (CCS)  |  Frequenzzähler « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Frequenzzähler  (Gelesen 3811 mal)
 
Sascha
Newbie
*
Offline Offline

Beiträge: 46


Profil anzeigen
« am: August 12, 2007, 14:43:20 »

Hallo ihr alle,
ich versuche mittels Timer0 Impulse zu zählen und bei einer bestimmten Anzahl ein Pin auf High zu setzten. (PIC 12F629 4MHz intern)

Ich habe mal probiert, das folgender maßen zu lösen. In der ISR habe ich einen Zähler den ich jedes Mal beim Aufruf um einen erhöhe. Außerhalb der ISR frage ich dann ab, ob der Zähler den Wert 25 erreicht hat. Ist das der Fall, setze ich den Zähler wieder auf Null. Jetzt wollte ich in der festlegten Zeit, den int_ext beim L_H Übergang benutzen, um bei einer bestimmten Anzahl von Impulsen Pin_A1 zu setzen. Doch irgendwie gelinkt es mir noch nicht richtig. Außerdem habe ich noch Probleme mit Set_tris. Könnte ich da noch ein wenig Hilfe bekommen. 

Code:
long int count;
int zaehler;

#int_ext
Hundemist()
{
count++;
}



#int_RTCC
RTCC_isr()
{
zaehler++;
}
   
   
void main()
{

   int i;
   set_timer0(130);
   set_tris_a(1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_RTCC);
   
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_32);

   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   ext_int_edge(L_TO_H);
   enable_interrupts(INT_EXT);
   enable_interrupts(global);

   count =0;
   zaehler = 0;
   

   while (1)
   {


      if (zaehler >= 25)
            {
               disable_interrupts(INT_EXT);
               disable_interrupts(INT_RTCC);
               disable_interrupts(global);
               delay_ms(1);
               
                             
               if (count >= 100)
                  {
                     output_high (Pin_A1);
                     delay_ms (500); delay_ms (500);
                     output_low (Pin_A1);
                   }

               zaehler =0;
               count =0;
               enable_interrupts(INT_RTCC);
               enable_interrupts(global);
               enable_interrupts(INT_EXT);
               delay_ms(1);
               set_timer0(130);
             }


 

   }
}
Gespeichert
Sascha
Newbie
*
Offline Offline

Beiträge: 46


Profil anzeigen
« Antworten #1 am: August 14, 2007, 08:58:05 »

Hi,
ich habe das jetzt mal mit einem Pic16f873(20MHz) und dem Counter probiert das scheint soweit zu funktionieren. Dennoch passt zeitlich was nicht. Ich habe den Vorteiler, auf 32 gestellt den Timer0 mit 130 geladen und zähle in der ISR einen Zähler hoch. Mittels if schleife, versuche ich nun ein Zeitfenster von 100ms zu erreichen. In der Schleife, frage ich dann ab, ob 20 Impulse vom Counter gezählt wurden. Bei count = 10 müsste doch der Port bei einer Frequenz von 100Hz (1/100Hz  * 10= 0,1sec)  auf High gesetzt werden oder ? Das passiert jedoch bei einer Frequenz von 88 Hz (1/88 =11,36msec) wo kommen die 1.36msec her ?       
Gruß Sascha

Code:
int zaehler;
int count;



#int_RTCC
void RTCC_isr()
{
 zaehler++;
 set_RTCC(130);
}



#INT_CCP1
void isr()
{
count++;

}


void main() {

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);

   enable_interrupts(INT_CCP1);
   enable_interrupts(INT_RTCC);
   setup_ccp1(CCP_CAPTURE_RE);
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_32);
   enable_interrupts(global);

   set_RTCC(130);
   CCP_1=0;
   count =0;
   zaehler = 0;
   



               output_high(PIN_A1);
               delay_ms (500);delay_ms (500);delay_ms (500);delay_ms (500);delay_ms (500);delay_ms (500);
                delay_ms (500);delay_ms (500);delay_ms (500);delay_ms (500);delay_ms (500);delay_ms (500);
               output_low(PIN_A1);
               delay_ms (500);




   while (1)
   {


              if (zaehler >= 25)
              {


               disable_interrupts(INT_RTCC);
               disable_interrupts(global);
               disable_interrupts(INT_CCP1);
               delay_ms(1);


                  if ( count >= 10 )
                     {

                        output_high(PIN_A1);
                        delay_ms (500);
                        output_low(PIN_A1);
                        delay_ms (10);
                      }


               zaehler =0;
               count =0;
               enable_interrupts(INT_RTCC);
               enable_interrupts(global);
               enable_interrupts(INT_CCP1);
               CCP_1=0;
               set_RTCC(130);

            }



   }
}
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.051 Sekunden mit 19 Zugriffen.
 
Top! Top!