avatar_POWER

TMR0 ve PortB.0 kesmelerini birlikte kullanabilme

Başlatan POWER, 21 Mayıs 2022, 19:36:24

POWER

Kullandığıb mcs 4.0  pbp 2,47
benim işlemci listesinde yok.nedeni neki?

POWER

Değerli arkadaşlar ve @ete hocam,
geçen zaman içinde çözüme yönelik çok uğraştım ama sağlıklı çalışan bir proğram yapamadım.arkadaşların yol göstermesiyle,ır kumanda ile kısmen rgb ledlerin parlaklığını ayarlıyorum fakat pwm sinyalde çok bozulmalar oluyor bu bozulmada rgb ledlere yansıyor.Rb0 kesmesi oluştuğu vakit tmr0 ritmi bozuluyor sanki.ben öyle yorumladım.böyle oluncada sağlıklı pwm sinyali alamıyorum.proğramın anlattığım son halini veriyorum.bu durumu düzeltebilirmiyim,yoksa yazılımsal olarak bu kadarmı olur?değerli yorum ve desteklerinizi bekliyorum.simülasyon dosyasıda 4 numaralı mesajda yüklü.
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 1500
SYMBOL IR_Goz=PORTB.0
SYMBOL ARTTIR=PORTB.1
SYMBOL AZALT=PORTB.2
SYMBOL LED=PORTA.7
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 WORD
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:
    while ALDIM=0
       SAY=SAY+1
    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 biti okuyoruz.
NEXT
'''---------------------------IR KUMANDA İLE ARTTIRMA AZALTMA-------------------       
  IF TUS=25 THEN
TUSA:           
         r=r+5
       IF r>100 THEN r=99  
       GOSUB DELAY1   'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
         ALDIM=0
         SAY=0  
       PAUSE 40
       WHILE IR_Goz=1     'SÜREKLİ İŞLEM YAPMAMASI İÇİN
         SAY=SAY+1
       IF SAY=500 THEN  A_CIK
       WEND
       GOTO TUSA
A_CIK :        
         TUS=0
         ALDIM=0
'         INTCON.7=1
'         INTCON.1=0 
       GOTO BASLA
  ENDIF           

  IF Tus=22 THEN   
TUSB:       
         R=R-5
       IF R<0 THEN R=1   
       GOSUB DELAY1  'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
         ALDIM=0
         SAY=0
       PAUSE 40 
       WHILE IR_Goz=1
         SAY=SAY+1
       IF SAY=700 THEN B_CIK
       WEND
       GOTO TUSB  
B_CIK:      
         TUS=0
         ALDIM=0
'        INTCON.7=1
'        INTCON.1=0  
       GOTO BASLA
  ENDIF

IF TUS=69 THEN TOGGLE LED            
           
            GOTO BASLA

DELAY1:
      FOR W=0 TO 1000  
        PAUSEUS 5
      NEXT
      RETURN   

DELAY:
      FOR I=0 TO 255
      NEXT 
      FOR I=0 TO 255  
      NEXT 
      FOR I=0 TO 255  
      NEXT            
      FOR I=0 TO 255  
      NEXT 
      FOR I=0 TO 255  
      NEXT
      RETURN
DISABLE
KESME: 
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 
GECGIT:
       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

ete

#17
Bu programın sağlıklı çalışmasını beklemek fazla iyimserlik olur.
Yazılımsal PWM nin oluşturulması başlı başına bir iştir ve çok fazla komut gecikmesi yaratır.
Diğer taraftan IR kodlarının okunmasıda devamlılık ister birini yaparken diğer aksar.
Şu anda programda yapılabilecek tek şey Kesme kısmını biraz daha sadeleştirmek olur sanırım.
İki alternatifli bir işte iki işide if ile kontrol etmek gereksizdir. Birini kontrol edip o değilse diğeridir şeklinde bir karar mekanizması oluşturmak yeterlidir. Buda sizi iki if kullanmaktan kurtarır. Bu sistemi kesme kısmına uyguladım aşağıdadır.
KESME: 
    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.
           goto GECGIT
    endIF
     
          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

GECGIT:                
        TMR0=243
        INTCON.2=0    'TMR0 Kesme bayrağı sıfırlandı
        RESUME        'geldiğin yere dön.
        ENABLE        'kesmeler yeniden aktif.
    END

Burada beklenilen işi yapmanın en iyi yolu PWM için CCP1 çıkışını kullanarak HPWM oluşturulmasıdır. Böylece kesme kısmında işlemci yanlızca IR kodlarını okur ve çözer.
Hatta birden fazla PWM gerekirse (R-G-B) 16F1827 veya 16F1825 kullanılarak RGB için PWM sinyalleri oluşturulabilir.


Ete

POWER

Teşekkür ederim hocam,
Mesajınızdan çıkardığım sonuç,bu iki işlemin bu işlemciyle sağlıklı yapılamayacağı.O yüzden 16f1827 incelemeye ve formda ilgili başlıkları okumaya başladım.

ete

Mevcut yazdığın programa bakınca Tek kanal PWM üretmeye çalıştığını görüyorum. Şayet tek kanal lazım ise bunu 16F628 ilede donanımsal PWM kullanarak yapabilirsin. Şayet birden fazla PWM çıkışı (Mesela RGB gibi) gerekli ise o aman 16F1825 veya 16F1827 kullanabilirsin.

Ete

POWER

Ete Hocam,
Aslında bana 4 kanal pwm lazım.İşi daha baside indirgemek için önce bir kanal üzerinde çalışmıştım.16f1827 benim için uygun görünüyor.Hocam aklıma takılan bir konu var.Kesmelerde öncelik ayarı diye bir ayar varmı?Yani bu proğramda olduğu gibi iki kesme kullanılıyorsa birisine öncelik verme imkanımız varmı?

alisumer

#21
ete hocaya sordunuz ama müsadesi ile ben bildiğim kadarıyla cevaplayayım.aynı anda kesme oluşursa diye mi bu seçim.kullanmayı düşündüğünüz işlemcilerde bariz bir öncelik yok bildiğim kadarıyla ama donanımsal olarak kullanılan kapılardan kaynaklı gecikme farklarından ilk hangisini algılayacağı konusu olabilir ama "nS " mertebesinde gecikmelerden bahsedersek basit uygulamalarda önemsiz .ayrıca tek kesme adresi kullandığından her halukarda 04 adresine gideceğinden hangi kesmenin oluştuğunu ancak 04 adresininin altında bayrak kontrolu yaparak anlarsınız hangisi olduğunu  .bazı gelişmiş işlemcilerde farklı kesmeler için farklı kesme adresleri mevcut diye biliyorum onlarda var bu öncelik pic in bazı üst kasalarında stm de falan olduğunu biliyorum.
Sizin işiniz için bu önceliği şöyle ayarlama ihtimaliniz olabilir diyelim kesme bayraklarından önceliği timer bayrağına verdiniz diğerleri ikinci planda olsun kesmeye girdikten sonra türkçe karşılığı olarak  iki bayrakta 1 ise timer 1 i seç  diğerini temizle diyebilirsiniz bu da sizin kuralını koyduğunuz öncelik olur iki üç darbe gecikme ile çözersiniz.
Hep meraktan

POWER

Teşekkür ederim hocam, söylediklerinizi deneyeceğim.

ete

Bazı işlemcilerde kesmeler için Priority (öncelik) kontrolü vardır. Mesela 25K22 veya 45K22 de bu mevcut. 16F1827 de yok sanırım. Alisumer'in kesme önceliği konusunda dedikleri mantıklı.

Ete

Powered by EzPortal