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?
(https://i.ibb.co/Kbx5D3t/Ekran-g-r-nt-s-2022-06-17-001323.png) (https://ibb.co/Kbx5D3t)
Okudugunuz Bölüm neydi? Ona göre cevap verelim.
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.
#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:47Alı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:16Alıntı yapılan: Erol YILMAZ - 17 Haziran 2022, 15:07:10Okudugunuz Bölüm neydi? Ona göre cevap verelim.
mekatronik mühendisliği
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.