CCS C PIC Timer0 kesmesi ile PWM kontrolü YARDIM

Başlatan ilkersatur, 17 Haziran 2022, 01:56:08

ilkersatur

Merhabalar, bütünleme sınavım için çalışmaktayım. Takıldığım bir konu var.  Mikroişlemci alanına hakim olanlar yardımcı olursa çok sevinirim.
Timer0 kesmesi aktif edilmiştir.
PIN_B7 1KHz'lik PWM işaret üretecektir.
PWM duty değeri PIN_B6 gelen sinyal lojik "1" ise %60, "0" ise %40 olacaktır.
PIN_B6 lojik seviye, ana program tarafından izlenerek pwm duty değerinin değişimi timer0 kesme alt programı tarafından ayarlanacaktır.
CCS C yazılımı nasıl olmalıdır?


Erol YILMAZ

Okudugunuz Bölüm neydi? Ona göre cevap verelim.

quarko

Her bir timer kesmesinde B6 nın lojik değerini okuyup ona göre pwm in duty cycle değerini güncelleyebilirsin. Okuduğun lojik değerleri düzgün algılamak için ufak bir dijital filtre ile kullanman faydalı olacaktır.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

ilkersatur

#3
#include <main.h>
#byte sfr_t0l=0xFD6
#byte sfr_t0h=0xFD7
int8 t0l_ton;
int8 t0h_ton;
int8 t0l_toff;
int8 t0h_toff;
int16 sayi;
int16 sayi1;

#byte sfr_t0con=0xFD5
#bit  tmr0on=sfr_t0con.7
#bit  t08bit=sfr_t0con.6
#bit  t0cs=sfr_t0con.5
#bit  t0se=sfr_t0con.4
#bit  psa=sfr_t0con.3
#bit  t0ps2=sfr_t0con.2
#bit  t0ps1=sfr_t0con.1
#bit  t0ps0=sfr_t0con.0


#byte sfr_intcon=0xFF2
#bit  sfr_gie=sfr_intcon.7
#bit  sfr_tmr0ie=sfr_intcon.5
#bit  sfr_t0if=sfr_intcon.2

#INT_TIMER0
void tmr0(void)
{

  while(TRUE)
  
      if (input(PIN_B6)==1)
          {
          output_high(PIN_B7);
      
          sfr_t0l=t0l_ton; 
          sfr_t0h=t0h_ton;
          }
          else
          {
          
          output_low(PIN_B7);
      
          sfr_t0l=t0l_toff; 
          sfr_t0h=t0h_toff;
          
  }
  }
void timer0_ayar(void);
void timer0_kesme_ayar(void);

void main()
{

  timer0_ayar();  
  timer0_kesme_ayar();
      
  tmr0on=1;
  sfr_tmr0ie=1;
  

}
void timer0_ayar(void)
{
  tmr0on=0;
  t08bit=0;
  t0cs=0;//timer
  t0se=0;
  psa=1;
  t0ps2=0;
  t0ps1=0;
  t0ps0=0;
  
      sayi=65535;
      sayi-=600;  
      t0h_ton=make8(sayi,1);
      t0l_ton=make8(sayi,0);
  
      sayi1=65535;
      sayi1-=400;  
      t0h_toff=make8(sayi1,1);
      t0l_toff=make8(sayi1,0);
}

void timer0_kesme_ayar(void)
{
  sfr_gie=1;
  sfr_t0if=0;  
}

20 Haziran 2022, 01:56:47
Alıntı yapılan: quarko - 17 Haziran 2022, 15:12:36Her bir timer kesmesinde B6 nın lojik değerini okuyup ona göre pwm in duty cycle değerini güncelleyebilirsin. Okuduğun lojik değerleri düzgün algılamak için ufak bir dijital filtre ile kullanman faydalı olacaktır.

her bir timer0 kesmesini nasıl okuyabilirim, onu bilmiyorum
if (sfr_t0if==0)
bu şekilde olabilir mi?

20 Haziran 2022, 01:57:16
Alıntı yapılan: Erol YILMAZ - 17 Haziran 2022, 15:07:10Okudugunuz Bölüm neydi? Ona göre cevap verelim.
mekatronik mühendisliği

forsa1975

program sıralamasında karışıklıklar görünüyor.

main() ana döngü programın en altında olması gerekiyor.

bu main bloğu içinde döngü yok.

timer0 içindeki döngüye gerek yok. hatta ordaki döngüyü main bloğu içine koy.

timer0 bloğu ayarlanan zamanda zaten çalışacak.

main içinde döngüden önce timer0 için gereken ayarları yazman gerek enable etmen ve zamanını vermen gerek

setup_timer_0(T0_INTERNAL | T0_DIV_BY_8);
set_timer0(250);
enable_interrupts(INT_TIMER0);


#INT_TIMER0
void tmr0(void) bloğun belli sürelerde çalışacak.

kontrollerini burada yapıp buna göre pwm sinyalinin high yada low çıkışını verebilirsin.