Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

YARDIM FREKANS METRE

Başlatan YASİN34, 07 Aralık 2014, 12:52:53

YASİN34

Arkadaşlar merhaba bir ödevim var.Ödev frekans metre Program olarak  MİKRO C kullanılacak assembly komutları ile yazılacak pıc olarak 16f887 kullanıılacak sinyal olarak karedalga uygulanıp interrupt girişleri kullanılacak counter da saydırılıp lcd de gösterilecek lütfen yardım edin.İnternette aradım ama bulamadım şimdiden teşekkürler

Kabil ATICI

Olayı sen önce bir LCD'den başla.. LCD üzerine birşeyler yazdır.
Frekansmetre dediğin sayıcı ve timer.
İşlemcinin Timer1 capture girişini kullanarak 1saniye boyunca gelen frekansı sayacaksın. 1s 'yi de timer0 ile oluşturabilirsin. İşte kesme burada kullanılıyor. Sonra Timer1 registerlerini okuyup değerlendirip ekrana yazacaksın.
Micro C asm olayını bilemem, ama işin temeli bu..
ambar7

YASİN34

usta dediğim gibi ben programlama işine çok yabancıyım ve hiç bir eğitim almadım okulda verilen derslerde çok faydalı olmadı bana lütfen yardım edin


uzaylivolkan

Ete Hocanın yapmış olduğu frekansmetre (74HC132 li ve roleli)
http://etepic.com/index.php?topic=60.0
Buradaki devre 2 ayrı bölümden oluşuyor. Preanfi kartı ve frekans ölçen Pic kartı.
Picbasic ile yazılmış program kodları mevcut.  Ama frekans sayma işlemi assembly dili ile yapılmış.
                           Kodlar Hocamızın izni olursa Micro C ye dönüştürülebilir.
Sana Kaynak Olabilecek Güzel Bir Proje.

YASİN34

yardımlarınız için teşekkür ederim ama hoca kesinlikler 16f887 yada 16f877 de istiyo şimdiden teşekkür ederim

Gökhan BEKEN

Hele bir projeye başlayın,
"bakın çizimim şemam bu, projemin kodları şu, şuraya kadar yaptım ama şu kısımı yapamadım"
şeklinde sorun, ozaman herkes yardımcı olmaya çalışır. Bu şekilde teşekkür ederek bir yere varamazsınız.
Özel mesaj okumuyorum, lütfen göndermeyin.

YASİN34

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

int kk  = 0;
int fr  = 0;
int cnt = 0;
int rit = 0;
int acc = 0;
int i   = 0;
int fra[10];

char CN[10];

void interrupt() {

     if(INTCON.TMR0IF == 1){
          fr = (cnt + kk*256)*(1000000)/(256*256); //4MHz crystal, 256 Timer0 increment rate
         /*if(acc<10){         ///
               fra[acc] = fr; ///Counted frequencies are put into an array
               acc++;         ///
          }
          else if(acc >= 10){
               acc = 0;
               for(i=0;i<10;++i){       ///
                   rit = rit + fra;  ///Average frequency is calculated
               }                        ///
          rit = rit/10;                 ///
          }*/
     cnt = 0;
     kk  = 0;
     INTCON.TMR0IF=0;
     }

    if(INTCON.INTF == 1){
         cnt++;
         if(cnt>=256){
              cnt = 0;
              kk++;
         }
    INTCON.INTF = 0;
    }
}

void main() {

     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     
     PWM1_Init(1000);
     PWM1_Set_Duty(100);
     PWM1_Start();

     INTCON.GIE        = 1; //Enable Global Interrupt
     INTCON.INTE       = 1; //Enable RB0/INT external Interrupt
     INTCON.TMR0IE     = 1; //Enable TMR0 Overflow Interrupt
     
     OPTION_REG.T0CS   = 0; //Timer0 increments with Internal instruction cycle clock
     OPTION_REG.PSA    = 0; //Prescaler is assigned to the Timer0 module
     OPTION_REG.PS2    = 1; ////
     OPTION_REG.PS1    = 1; ////Timer0 increments every 256 instruction cycles
     OPTION_REG.PS0    = 1; ////
     OPTION_REG.INTEDG = 1; //Interrupt on rising edge
     
     while(1){
     
           IntToStr(fr,CN);
           Lcd_Out(1,1,CN); //Display the average frequency
     
     }

}






internette buldum arkadaşlar hata varmı bakablirimisiniz ?

Kabil ATICI

Tamam bu Micro  C diyelimde ilk başlıkta sözünü ettiğiniz assembly nerede?
ambar7

selimkoc



assembly ile  yazılacaksa  MikroC' ye ne ihtiyaç var?

RaMu

Alıntı yapılan: selimkoc - 09 Aralık 2014, 19:42:07

assembly ile  yazılacaksa  MikroC' ye ne ihtiyaç var?

Bu sayede internetten bulunamayacak,
kimsede böyle birşeyi hazır yapıp önüne koyamayacak
öğrenci kendi yapmak zorunda kalacak,
bir ihtimal daha var uzak bir ihtimal yaptıracak.

Aslında dersi veren hoca öğretmediği ve
kısa zamanda öğrenilemeyecek birşeyi sormaz,
muhakkak dersi asm ile anlatmıştır,
asm ile frekansmetreyi yazdıktan sonra
çok az mikroc bilgisi ile
proje mikroc de derlenebilir hale getirilir
olur biter.
Hoca asm koddan parça parça burası nasıl çalışıyor diye sorar
öğrenci bilemezse sen yapmamışsın der,
asm kodu yazamıyorsa
veya yazılanı bulup anlayıp mikroc de derlenebilir hale getiremiyorsa
zaten boşuna uğraşmasın öğrenci.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

YASİN34

sbit LCD_RS at RC2_bit;
sbit LCD_EN at RC3_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;                 //tamam
sbit LCD_RS_Direction at TRISC2_bit;
sbit LCD_EN_Direction at TRISC3_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;



  unsigned int cnt = 0;
  unsigned int i   = 0;
  char CN[10];

void interrupt() {

               if (TMR1IF_bit==1)    // 1sn kurulu
                               {

    i++;
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;

                                }

                       
    if(INTCON.INTE == 1) {

       cnt++;
        TMR1IF_bit=1;



                         }
    INTCON.TMR1IE =0;
    INTCON.INTF = 0;
}

void main() {



       INTCON.GIE = 1; //Enable Global Interrupt
       INTCON.INTE = 1; //Enable RB0/INT external Interrupt
       T1CON = 0x31;
       TMR1IF_bit= 0;
       TMR1H = 0x0B;
       TMR1L = 0xDC;
       TMR1IE_bit = 1;
       INTCON = 0xC0;


     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     OPTION_REG.INTEDG = 1; //Interrupt on rising edge


     while(1){


           IntToStr(cnt,CN);
           Lcd_Out(1,1,CN); //Display the average frequency

     }





kod üstünde biraz çalıştım bu şekle geldi yardım edin lütfen