16f628 3 tane pwm 2 tane timer ile 1 tane hw pwm

Başlatan Tarik konca, 30 Ağustos 2023, 15:46:41

Tarik konca

16f628 de 3 tane pwm olurmu olur v2

buda 16f628 de yine uc tane pwm bu sefer 2 tane timer ile benim yazdigim

bir tane donanimsal olan versiyonu

frekanslari asagi yukari yakin 15000 hz civari

2 tanesi timer0 ve timer1 ile bir tanesi de donanimsal

timer0 ve timer1 de olanlar kendi halinde calisiyor size pek bir zarari yok

interrupt rutini icinde.

pwm i kontrol icin adc pini olmadigi icin for next dongusunde pwm degerini arttirip azalttim

akliniz karismasin siz butonla kontrol edebilirsiniz isterseniz

ana programda baska isler yapabilirsiniz sadece delay kullandiginiz yerlerde biraz sasirtir okadar

mikrobasic ve proteus dosyalari ekde



program MyProject
dim pwm0_duty ,pwm1_duty ,pwm2_duty ,tmr0_duty,tmr0_tmp ,tmr1_duty,tmr1_tmp ,tmr2_duty ,tmr2_tmp, sayac as byte

sub procedure interrupt() iv 0x0004 ics ICS_AUTO
 if  intcon.TMR0IF=1 then
   if portb.0=1 then
     tmr0_tmp=tmr0_duty
   end if
   if portb.0=0 then
     tmr0_tmp=255-tmr0_duty
     tmr0_duty=pwm0_duty
   end if
   portb.0=not portb.0
   tmr0=tmr0_tmp
   intcon.TMR0IF=0
   INTCON.5=1
end if
 if  PIR1.TMR1IF =1 then
     t1con.tmr1on=0
   if portb.1=1 then
     tmr1_tmp=tmr1_duty
   end if
   if portb.1=0 then
     tmr1_tmp=255-tmr1_duty
     tmr1_duty=pwm1_duty
   end if
   portb.1=not portb.1
   tmr1h=255
   tmr1l=tmr1_tmp
   PIR1.TMR1IF = 0
   pie1.0=1
   t1con.tmr1on=1
end if
  if  PIR1.TMR2IF =1 then
 t2con.tmr2on=0
   if portb.2=1 then
     tmr2_tmp=tmr2_duty
   end if
   if portb.2=0 then
    tmr2_tmp=255-tmr2_duty
     tmr2_duty=pwm2_duty
   end if
   portb.2=not portb.2
   tmr2=tmr2_tmp
   PIR1.TMR2IF = 0
    t2con.tmr2on=1
end if
end sub

main:
trisa=255
trisb=0
portb=255
INTCON = %11100000
OPTION_REG = %00001000
T1CON = %00000101
PIR1.TMR1IF = 0
PIE1.TMR1IE  = 1
T2CON=%10000100
PIE1.TMR2IE = 1



pwm_set:

pwm0_duty=0
pwm1_duty=0
pr2=255
CCPR1L=255
t2con.2=1
t2con.0=0
t2con.1=0
CCP1CON = $0C

while(true)
    
for  sayac=0 to 255 step 1
pwm0_duty=sayac
pwm1_duty=sayac
CCPR1L=sayac
delay_ms(1)
next  sayac

for  sayac=255 to 0 step -1
pwm0_duty=sayac
pwm1_duty=sayac
CCPR1L=sayac
delay_ms(1)
next sayac

wend

end.


Tek Care Format C:

Powered by EzPortal