avatar_POWER

TMR0 ve PortB.0 kesmelerini birlikte kullanabilme

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

POWER

İyi çalışmalar,
Uzaktan IR kumanda ile RGB led sürebilmek için bir proğramla uğraşıyorum.IR kumanda PortB.0 kesmesini kullanarak kontrol yapıyor.3 çıkışa ihtiyacım olduğu için TMR0 kesmesini kullanarak PWM sinyalini üretmek istedim.ETE hocamın ders notlarından yararlanarak proğramı yazdım.Proğram portb.0 ile tuş kontrolü ve tmr0 ile pwm sinyal alma şeklinde ayrı ayrı çalışıyor.Buraya kadar sorun yok.Sorun PortB.0 ve TMR0 kesmelerini aynı anda kullanma ihtiyacı oluştuğunda başladı.Çünkü tuş kontrolü PortB.0 kesmesi ile PWM sinyalide TMR0 kesmesi ile sağlanacak.Ben Kumandanın tuşlarıyla PWM sinyali ile oynayacağım için iki kesmeyide aynı anda kullanmam gerekli diye düşünüyorum.Fakat kesme oluştuğu anda başka kesme oluşmasın diye Dısable komutunu kullanıyoruz.Ben bu işin içinden çıkamadım doğrusu.Söylediklerimi yapabilmem için nasıl bir yol izlemem lazım.Kod vermedim,Şayet bu işin bir yolu var ise(TMR0 ve PortB.0 kesmelerini birlikte kullanabilme)ile ilgili. ozaman eklerim.

ete

Bu konuya bir açıklama getirmek lazım. Kesme olayı kesme bayrakları ile yönetilir.
Hangi bayrak önceden kalkarsa (set edilirse) program onunla ilgili kesmeye gider.
Ancak diğer kesme bayrağı sırada bekler ve program kesmeden çıkar çıkmaz diğer kesme bayrağı programı kesmeye gönderir. Kısaca kesmeler kaybolmaz ancak biraz gecikmeye uğrayabilir.
Bu sorun oluşturuyor ise bir kesme oluşup program kesmeye girdiğinde diğer kesme bayrağını test ederek ikinci kesmeye gitmeden ona ait işlemi yerine getirebilirsin.
Kısaca işin çözümü kesme bayraklarının kontrol edilmesinde yatıyor.

Ete

POWER

iyi geceler hocam,
Proğram size ait bir proğram.Yapmaya çalıştığım,IR kumanda ile porta.1 pinine bağlı ledi yakıp söndürmek ve porta.0 pininden 0-5v pwm sinyali almak.Bu iki fonksiyonu ayrı ayrı yapabiliyorum fakat beraber yapamıyorum.Üzerinde çok uğraştım ama söylediğiniz şekilde kesme bayraklarını düzenleyemedim hocam.Bir çok alternatif denedim ama olmadı.Denemelerimi deneme bordunda yapıyorum.
'****************************************************************
'*  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
TRISB=%00000111   
TRISA=%00000000  
'''-----------------------------------------------------------------------------
@ 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- 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 LED=PORTA.1
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 WORD
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
''''----------------------------------------------------------------------------       
      IF PORTB.1=0 THEN 
         R=R+1
         IF R=100 THEN R=99  
         GOSUB DELAY
      ENDIF   
      IF PORTB.2=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 
''''--------------------------------ON--OFF-------------------------------------
IF Tus=69  THEN TOGGLE LED

        GOTO BASLA

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: 
    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.
'''-----------------------------------------------------------------------------
      IF PORTA.0=1 THEN
         RH=RH-1
         IF RH=0 then 
           PORTA.0=1-PORTA.0
           RH=R
         endif
      ELSE
         RL=RL-1
         IF RL=0 THEN
           PORTA.0=1-PORTA.0  
           RL=100-Rh
         ENDIF
      ENDIF
        TMR0=243
        INTCON.2=0    'TMR0 Kesme bayrağı sıfırlandı
        RESUME        'geldiğin yere dön.
        ENABLE        'kesmeler yeniden aktif.
 END


mehmet

#3
Kesme etiketi altında; hangi kesmenin
aktif olduğunu ayırt etmek doğru
olmaz mı? Timer kesmesi gelse de
önce RB0 kesmesi işlemlerini yapıyor.

KESME:
IF INTCON.2 = 1 THEN
'Timer kesmesi işlemleri
ENDIF

IF INTCON.1 = 1 THEN
'RB0 kesmesi işlemleri
ENDIF
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

POWER

#4
İyi geceler,
****************************************************************
'*  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
PORTA=0
PORTB=0
TRISB=%00000111   '
TRISA=%00000000   '
''''----------------------------------------------------------------------------
@ 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=%00000000       'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10110000           'Kesmeler aktif ve TMR0 kesmesi aktif
CMCON=7                    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
''''----------------------------------------------------------------------------
 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  '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
SAYAC VAR BYTE
DUTY  VAR BYTE 106 

DEFINE PULSIN_MAX 1200
SYMBOL IR_Goz=PORTB.0
SYMBOL LED=PORTB.4  

SYMBOL CIKIS=PORTA.1
SYMBOL ARTTIR=PORTB.1
SYMBOL AZALT=PORTB.2
CLEAR  'tüm değişkenler sıfırlandı
'PAUSE 200
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
''''----------------------------------------------------------------------------
    IF ARTTIR=0 THEN 
         R=R+1
         IF R=100 THEN R=99  '2-4V(90-89)      
         GOSUB DELAY
      ENDIF   
      IF AZALT=0 THEN 
         R=R-1
'         IF R<=40 THEN R=41 '2-4V
         IF R<=0 THEN R=1 '1-4V(17-18)
         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 
'''---------------------------------ON--OFF-------------------------------------
IF Tus=69  THEN TOGGLE LED

            GOTO BASLA

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.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.2 = 1 THEN  
      IF CIKIS=1 THEN
         RH=RH-1
         IF RH=0 then 
           CIKIS=1-CIKIS
           RH=R
         endif
         ELSE
         RL=RL-1
         IF RL=0 THEN
           CIKIS=1-CIKIS 
           RL=100-Rh
         ENDIF
       ENDIF
      TMR0=243
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
ENDIF
END
Proğramı bu şekilde düzenledim.Kısmen çalışıyor fakat pwm çıkışı düzgün değil.Daha doğrusu tuş ile arttırırken ve azaltırken sinyalde bozulmalar oluyor.Simülasyondada gerçek devresindede durum aynı.İşin içinden çıkamadım malesef.

alisumer

#5
kodu denemedim ama ilk bakışta kesme içinde oyalanacak  çok komut var tercihen kesmede az iş yapılır. beklemeler kesmeden çıkmayı geciktirir 
 koşullar ise  durumlarına göre  zaman kayması yaparlar . kodu kesme dışına olabildiğince çıkarmaya çalışmalısınız bence .
Hep meraktan

POWER

#6
@alisumer
hocam söylediğiniz doğru aslında.Çünkü tuşa bastığım zaman biraz geç algılıyor gibi.Fakat kesmeden çıkartabileceğim bi kod bulamadım.

alisumer

sanırım 1 pwm üretimi yapıyorsunuz birde okuma kesme içerisinde en azından bu ikisini ayrı bloklara ayırıp kesme başlangıcında bayrak kontrolu yapıp ilgili bloğa dallandırıp oradan da bir an önce çıkmaya çalışın.mesela
disable
kesme:
bayrak kontrol:
tmr0 kesmesi ise dallan pwm e
pulsin.....
.....
goto cıkıs  ; çıkışa yönlendirmek önemli kesme oluşmayan diğer bloğa geçmemesi gerekiyor.
pwm:
TMR0=243
pulsout ...
cıkıs:
      RESUME
      ENABLE
gibi blokları küçültüp her kesme sonucunda daha kısa sürede kesmeden çıkmaya çalışabilirsiniz.böylelikle giriş  kesmesinde kesmeye gittiğinde timer işlemeye devam eder tekrar baştan başlamaz pwm kayması az olur
Hep meraktan

mehmet

TMR0 değerini biraz düşürerek, pwm
frekansını düşürseniz nasıl olur?
216 ile deneseniz?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

POWER

#9
Alıntı yapılan: mehmet - 25 Mayıs 2022, 20:40:30TMR0 değerini biraz düşürerek, pwm
frekansını düşürseniz nasıl olur?
216 ile deneseniz?
Söylediğiniz değişliği yaptım sonuç değişmedi mehmet hocam
Alıntı yapılan: alisumer - 25 Mayıs 2022, 14:13:43sanırım 1 pwm üretimi yapıyorsunuz birde okuma kesme içerisinde en azından bu ikisini ayrı bloklara ayırıp kesme başlangıcında bayrak kontrolu yapıp ilgili bloğa dallandırıp oradan da bir an önce çıkmaya çalışın
3-4 gündür uğraşıyorum.Söylediğiz biçimde farklı kodlar ile denedim fakat sorun aynı.İki ayrı kod bloğu tek başına çalışıyor.Yani rb0 kesmesi kullanılarak ır kumanda ile role kontrolü yapılıyor burda sıkıntı yok.tmr0 kesmesi kullanılarak pwm sinyali oluşturuyorum.bu sinyalin duty değerini değiştirerek rgb led sürmek amacım.duty değerini değiştirmek için iki ayrı buton atadım o zaman problemsiz çalışıyor.Ben istiyorumki duty değerini de ır kumanda ile değiştirebileyim.İş te problem burda başlıyor.Proğram konusunda orta derecede bilgim var.O yüzden takılıp kaldım malesef.Kullandığım kodlar ete hocanın ders notlarında alıntıdır.

mehmet

Alıntı yapılan: POWER - 26 Mayıs 2022, 15:08:07Söylediğiniz değişliği yaptım sonuç değişmedi mehmet hocam3-4 gündür uğraşıyorum.Söylediğiz biçimde farklı kodlar ile denedim fakat sorun aynı.İki ayrı kod bloğu tek başına çalışıyor.Yani rb0 kesmesi kullanılarak ır kumanda ile role kontrolü yapılıyor burda sıkıntı yok.tmr0 kesmesi kullanılarak pwm sinyali oluşturuyorum.bu sinyalin duty değerini değiştirerek rgb led sürmek amacım.duty değerini değiştirmek için iki ayrı buton atadım o zaman problemsiz çalışıyor.Ben istiyorumki duty değerini de ır kumanda ile değiştirebileyim.İş te problem burda başlıyor.Proğram konusunda orta derecede bilgim var.O yüzden takılıp kaldım malesef.Kullandığım kodlar ete hocanın ders notlarında alıntıdır.

Daha önce denemiştim, PIC16F628A ile olmamıştı.
PIC16F1827 ile dört donanımsal pwm yapmıştım.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

POWER

Alıntı yapılan: mehmet - 26 Mayıs 2022, 16:12:45Daha önce denemiştim, PIC16F628A ile olmamıştı.
PIC16F1827 ile dört donanımsal pwm yapmıştım.
Bende bu konuyu soracaktım,siz benden önce davradınız.Yani teknik olarak bu işlemci ile yapılamayacaksa boşuna uğraşmayayım.
Pic16f1827 nin özelliklerine şimdi baktımda CCP modul:2 eccp modül:2 Motor Control Pwm Kanal:4 gibi özellikler var.Burda beni ilgilendiren Motor Control Pwm Kanal sayısımı acaba? Aslında bana 5 adet pwm gerekli ama uygun işlemcide bulamadım.

alisumer

yazılımla da yapabilirsiniz pwm çıkışını ben 6 kanal servo sürmek için 16f690 kullanıyorum 20 ms de bir kesme oluşturup sıra ile pulsout komutu ile çıkış alıyorum. sizin proje led süreceğim diye başladı motora evrildi tek pwm idi çoklandı anlamadım led ve servoda sıkıntı olmaz ama bilmiyorum çıkış frekansınız çok yüksek ise belki donanım gerekebilir
Hep meraktan

POWER

#13
@alisumer
Yanlış anladınız.Motora evrilmedi.Yapmak istediğimi yapamayınca mehmet hocada bende yapamamıştım işlemci değiştirdim demesi üzerine bende işlemci değişikliğini düşünmeye başladım.mehmet hocanın kullandığı işlemcinin özelliklerine bakınca,
CCP modul:2  eccp modül:2  Motor Control Pwm Kanal:4 bilgilerini gördüm.ben hangisini kullanacağım diye sordum.yani motor olayı yok.rgb led ve 3 adet role kontrolü.
Ayrıca pbp 16f1827'i desteklemiyor doğrumu?
 

alisumer

Hep meraktan

Powered by EzPortal