TMR0 ve PortB.0 kesmelerini birlikte kullanabilme

Başlatan POWER, 28 Mayıs 2022, 19:28:08

POWER

iyi çalışmalar,
IR kumanda ile RGB ledleri fet ile on-off yapmak ve 3 adet roleyide on-off olarak kontrol etmek için yola çıkmış idim.Sağolsun ete hocanın yardımlarıyla bunları yapmıştım problemsiz çalışıyorlar.Malüm IR kumanda RB0.Int.kullanarak bu kontrolleri yapıyor.Sonraki adımımda rgb ledlerin parlaklığını değiştirmek oldu.Yine ete hocanın ders notlarından yararlanarak tmr0 taşma kesme özelliğini kullanarak yazılımsal pwm sinyali elde ettim ve duty değerini butonla değiştirerek rgb ledlerin parklaklığı ile oynayabiliyorum.Buraya kadar sorun olmadı.Ledlerin parlaklığını butonla değilde, ır kumanda yardımıyla yapmaya çalıştığım zaman problemler başladı.Bir haftayı geçti denemediğim yöntem kalmadı.Burdan ve başka formlardan bir çok araştırma yaptım fikirler aldım nafile.
Problem:IR kumanda ile parlaklık ayarı yapmaya çalışırken pwm sinyalde bozulmalar çok oluyor(simülasyonda görüyorum bunu)Gerçek devrede denerken,scop imkanım olmadığı için analog ölçü aleti bağladım çıkışa.Ölçü aletinin ibresi bulunduğu yerde çok sekiyor.Proğramcılığım orta seviyelerde,çıkamadım işin içinden.
1-Benim yapmaya çalıştığım bu işi yazılımsal pwm ile yapabilmek mümkünmü? Mümkün değilse işlemci değiştirmem gerekecek.Ustalarımın yardımlarından dolayı şimdiden teşekkür ederim.

'****************************************************************
'*  Name    : PWM-TMR0.BAS                                      *
'*  Author  : [ETE-EROLEC-ERO]                                  *
'*  Notice  : Copyright (c) 2007 [E.T.E]                        *
'*          : All Rights Reserved                               *
'*  Date    : 3/2/2007                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
define OSC 4
Include "MODEDEFS.BAS"
PORTA=0
PORTB=0
TRISA=%00000000
TRISB=%00000111  
'''-----------------------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
''----'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00001000     'Pull up dirençleri aktif-wdt geçerli bölme oranı 1/1
INTCON=%10110000         'Kesmeler aktif TMR0 ve RB0/INT kesmeleri aktif
CMCON=7                  '16F628 de komparatör pinleri iptal hepsi giriş-çıkış
DEFINE PULSIN_MAX 1200
SYMBOL IR_Goz=PORTB.0
SYMBOL ARTTIR=PORTB.1
SYMBOL AZALT=PORTB.2

R  var byte
G  var byte
B  VAR BYTE
RH VAR BYTE
GH  VAR BYTE
BH  VAR BYTE   
RL  VAR BYTE
GL  VAR BYTE
BL  VAR BYTE
I   VAR byte
W   var bit
TAMAM VAR WORD 58
Tus   Var byte 60
IR_AL var BYTE(32)62
X     var Byte 100
SAY   VAR WORD 102
ALDIM VAR BIT

CLEAR  'tüm değişkenler sıfırlandı

TMR0=243     
R=50       
G=50
B=50
RH=r
RL=100-rH
gh=g
gl=100-gH
bh=b
bl=100-bH

BASLA:
        SAY=0
    while ALDIM=0
       SAY=SAY+1
''''-----------------------BUTON İLE ARTTIRMA  AZALTMA--------------------------       
      IF ARTTIR=0 THEN 
         R=R+1
         IF R=100 THEN R=99  
         GOSUB DELAY
      ENDIF   
      IF AZALT=0 THEN 
         R=R-1
         IF R<0 THEN R=1
         GOSUB DELAY
      ENDIF   
'''-----------------------------------------------------------------------------
    WEND
       ALDIM=0
       TUS=0
   for X=0 to 7
       IF IR_AL(16+X)>70 then TUS.0[X]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
   next 
'--------------------------IR KUMANDA İLE ARTTIRMA AZALTMA----------------------
IF TUS=25 THEN
   R=R+1
 IF R=100 THEN R=99      
   GOSUB DELAY
ENDIF   

IF TUS=22 THEN
   R=R-1
 IF R<0 THEN R=1 
   GOSUB DELAY
ENDIF
            GOTO BASLA

DELAY:
      FOR I=0 TO 1000
      NEXT 
      FOR I=0 TO 1000  
      NEXT 
      FOR I=0 TO 1000  
      NEXT            
      FOR I=0 TO 1000  
      NEXT 
      FOR I=0 TO 1000  
      NEXT
      RETURN

DISABLE
KESME: 
INTCON.5=1
IF INTCON.4=1 & INTCON.1=1  THEN    
    PULSIN IR_Goz,1,TAMAM   
       IF TAMAM >400 AND TAMAM<500 THEN        
         for X=0 to 31    
           pulsin IR_Goz,1,IR_AL(X) 'YALNZCA LOW BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
         next 
          ALDIM=1 
       ENDIF 
       SAY=0      
       INTCON.1=0   'RB0/INT Bayrağı (flag) silindi.
'       Resume      'geldiğin yere dön.
'       Enable      'kesmeler yeniden aktif.
endIF
'''-----------------------------------------------------------------------------
IF INTCON.5=1 & INTCON.2=1  THEN
      IF PORTA.1=1 THEN
         RH=RH-1
         IF RH=0 then 
           PORTA.1=1-PORTA.1
           RH=R
         endif
      ELSE
         RL=RL-1
         IF RL=0 THEN
           PORTA.1=1-PORTA.1 
           RL=100-Rh
         ENDIF
      ENDIF
ENDIF
        TMR0=243
        INTCON.2=0    'TMR0 Kesme bayrağı sıfırlandı
        RESUME        'geldiğin yere dön.
        ENABLE        'kesmeler yeniden aktif.
 END
https://s2.dosya.tc/server17/lpo1vk/pwm.rar.html
TB6BKG