Timer0 kesmesi ile PWM kontrol

ilkersatur

Üye
Katılım
17 Haz 2022
Mesajlar
1
Puanları
1
Yaş
22
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?
 

Ekli dosyalar

  • Ekran görüntüsü 2022-06-17 001323.png
    Ekran görüntüsü 2022-06-17 001323.png
    10.1 KB · Görüntüleme: 11
Katılım
15 Ara 2009
Mesajlar
363
Puanları
6
Yaş
38
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?
/******************************************************
PIC16F877 ile PWM Modu Uygulaması-1
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli

int i=5; // Tamsayı tipinde değişken tanımlanıyor

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı

set_tris_a(0x03); // RA0 ve RA1 pinleri giriş
set_tris_c(0x00); // RC0, RC1 ve RC2 pini giriş

setup_ccp1(CCP_PWM); // CCP1 birimi PWM çıkışı için ayarlandı
setup_ccp2(CCP_PWM); // CCP2 birimi PWM çıkışı için ayarlandı

setup_timer_2(T2_DIV_BY_16,170,1); // Timer2 ayarları yapılıyor

set_pwm1_duty(i); // PWM1 çıkışı görev saykılı belirleniyor
set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor

while(1) // Sonsuz döngü
{
if (input(pin_a0)) // Eğer RA0 girişine bağlı butona basılırsa
{
delay_ms(20); // Buton arkı önleme gecikmesi
while(input(pin_a0)); // Basılı butondan el çekile kadar bekle
i+=3; // i=i+3 anlamındadır.

if (i>=170) // i değeri 170'dan büyükse i değeri 170 olsun
i=170;

set_pwm1_duty(i); // PWM1 çıkışı görev saykılı belirleniyor
set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor
}

if (input(pin_a1)) // Eğer RA1 girişine bağlı butona basılırsa
{
delay_ms(20); // Buton arkı önleme gecikmesi
while(input(pin_a1)); // Basılı butondan el çekile kadar bekle
i-=3; // i=i-3 anlamındadır.

if (i<5) // i değeri 5'den küçük ise i değeri 10 olsun
i=5;

set_pwm1_duty(i); // PWM1 çıkışı görev saykılı belirleniyor
set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor
}
}
}

Bu programı inceleyip yapabilirsin,ilgili pwm çıkışları ve giriş pinini değiştirerek,
 

Forum istatistikleri

Konular
121,364
Mesajlar
854,651
Kullanıcılar
436,865
Son üye
mutlumektup

Yeni konular

Üst