29 Ekim 2021 Cuma

Frekans metre (frequency meter) ccs compiler

 Frekans metre(frequency meter) ccs compiler  pic c içinde example ex_freq.c uygulamasn çalştırdık.

#include <16F887.h>

#use delay( crystal=20mhz )    //one instruction=0.2us

//#use rs232(icd)   //Text through the ICD

#fuses nomclr,hs

#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7) //Text through the UART

#bit t1_overflow=0x0C.0

#define LCD_DATA_PORT getenv("SFR:PORTD") 

#include<lcd.c>

// #bit t1_overflow=0xF9E.0  (PIC18, Reminder)

void main() {

   int cycles8, cycles;

   int32 freq;

   long freqc_high;

   long freqc_low;

lcd_init();

   while (TRUE) {

      cycles8=0;

      cycles=0;

      freqc_high=0;

      t1_overflow=0;

      set_timer1(0);

      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);

/* ___ wait one second ___  */

      while (cycles!=0xFF) { //true=3, false=4

       cycles8=0; //1 cycle

       //start inner loop

         while (cycles8!=0xFF) { //true=3, false=4

            if (t1_overflow)//true=2,false=3             //----|

               {t1_overflow=0;freqc_high++;}//6 cycles   //    |

         else                                         //    |-- 8 cycles

            {delay_cycles(5);}                        //----|

            delay_cycles(62); //x

            cycles8++; //1

 ///2 cycles to jump to top

 //math: end inner loop

 //math: total inner loop=((3+8+x+1+2)*255 + 4)*255

 //math: if x=62.87781 then inner loops takes 5mil instructions

 //math: if x=62 then inner loop takes 4942920, have to fill 57080 cycles

         }

 delay_cycles(216);      //y

 cycles++;          ///1 cycle

 ///2 cylces to jump to top

 //math: outer=(3+1+y+1+2)*255+4=57080

 //math: y=(57080-4)/255)-(3+1+0+0+1+2)

 //math: if y=216.827450980392156862745098039216 then outer loop cylces is 57080

 //math: if y=216 then outer loop cycles is off by 211 cycles.  z=211

      }

      delay_cycles(211);   //z

/* ___ end waiting 1 second ___ */

      setup_timer_1(T1_DISABLED);   //turn of counter to prevent corruption while grabbing value

      if (t1_overflow)            //check one last time for overflow

          freqc_high++;

      freqc_low=get_timer1();      //get timer1 value as the least sign. 16bits of freq counter

      freq=make32(freqc_high,freqc_low);   //use new make32 function to join lsb and msb

      printf("\f%LU Hz\r\n",freq);      //and print frequency

      printf(lcd_putc,"\f%LU Hz\r\n",freq);

   }

}




10 yorum:

  1. yüzdelik gösterecek şekilde tasarlayabilir miyiz. öörneğin 49.99 Hz şeklinde.

    YanıtlaSil
  2. olur kardeşim mail adresini gönder yapıp göndereyim

    YanıtlaSil
    Yanıtlar
    1. orkunfirtina@gmail.com
      kusura bakma geç oldu biraz ama.

      Sil
    2. Uygun zamanda bakip gonderecim insaAllah

      Sil
  3. orkunfirtina@gmail.com
    kusura bakma geç oldu biraz ama

    YanıtlaSil

Her yorum bilgidir. Araştırmaya devam...