Yazılımsal PWM gecikme sorunu

Başlatan Yasin, 13 Ağustos 2014, 22:59:12

Yasin

Arkadaşlar RGB led sürmek için 3 kanal yazılımsal PWM yaptığımda komutların verdiği gecikmeden dolayı maksimum %50 civarı duty değerine çıkabiliyorum. Bu sorunu nasıl çözebilirim?

ete

İki şekilde çözebilirsin. Birincisi yazdığın kodları buraya koyarak ne yaptığını anlamamızı ve dolayısıyla ne yapılması gerektiğini söyleyebilmemizi sağlarsın. İkincisi MIBAM denilen sistemi araştırır ve programını bu sisteme göre yazarak sorunu aşarsın.

Ete

Yasin

Alıntı yapılan: ete - 14 Ağustos 2014, 10:42:00
İki şekilde çözebilirsin. Birincisi yazdığın kodları buraya koyarak ne yaptığını anlamamızı ve dolayısıyla ne yapılması gerektiğini söyleyebilmemizi sağlarsın. İkincisi MIBAM denilen sistemi araştırır ve programını bu sisteme göre yazarak sorunu aşarsın.

Ete

Kod şu şekilde:

DONGU:
GOSUB BUTON
GOSUB PWM_1
GOSUB PWM_2
GOSUB PWM_3
GOTO DONGU

BUTON:
'Bu kısımda bildiğimiz arttırma eksiltme işlemleri var.
RETURN

PWM_1:
HIGH PORTB.0
PAUSE DUTY_1
LOW PORTB.0
PAUSE (100-DUTY_1)
RETURN

PWM_2:
HIGH PORTB.1
PAUSE DUTY_2
LOW PORTB.1
PAUSE (100-DUTY_2)
RETURN

PWM_3:
HIGH PORTB.2
PAUSE DUTY_3
LOW PORTB.2
PAUSE (100-DUTY_3)
RETURN

END

Yasin


ete

3 adet PWM sinyalinin her birinin Duty değerini hem artırabilmeli hemde eksiltebilmelisin. Bu işlem için 2 ayrı buton gerekir. 3 adet sinyal olduğuna göre toplam 6 adet buton gerekecektir. Bu nedenle butonları PORTB.0 - PORTB.5 arasına bağlamakta yarar vardır. A portunu ise 3 adet PWM sinyalinin çıkışı için kullanmak daha doğru olacaktır.

PWM sinyalleri senin yaptığın gibi biri çıkış versin sonra diğerine geçilsin şeklinde düşünürsen bir yere varmak mümkün olmaz. Mantık bu konuda kesme kullanılmasını söyler insana ama sana bir şey söylememiş anlaşılan.

Aşağıda açıkladığım sisteme uygun bir program mevcut bak bakalım işini görecekmi.

Ete
@ __config _INTRC_OSC_NOCLKOUT  & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
Define OSC 4
CMCON=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%11111111

ON INTERRUPT GoTo KESME   
OPTION_REG=%00000011     
INTCON=%10100000

DUTY_R VAR BYTE 56
DUTY_G VAR BYTE 57
DUTY_B VAR BYTE 58
LEDA VAR BYTE   60
LEDB VAR BYTE   61
LEDC VAR BYTE   62
I VAR WORD
X VAR BYTE

PAUSE 200

  DUTY_R=1
   DUTY_G=1
   DUTY_B=1

BASLA:

DUTY_R=DUTY_R+PORTB.0
DUTY_R=DUTY_R-PORTB.1

DUTY_G=DUTY_G+PORTB.2
DUTY_G=DUTY_G-PORTB.3

DUTY_B=DUTY_B+PORTB.4
DUTY_B=DUTY_B-PORTB.5

FOR I=0 TO 150:NEXT I

GOTO BASLA

DISABLE
KESME:
      FOR X=1 TO 254
      IF x<=DUTY_R THEN
         PORTA.0=1
      ELSE
         PORTA.0=0
      ENDIF     

      IF x<=DUTY_G THEN
         PORTA.1=1
      ELSE
         PORTA.1=0
      ENDIF
     
      IF x<=DUTY_B THEN
         PORTA.2=1
      ELSE
         PORTA.2=0
      ENDIF   
      NEXT

      INTCON.2=0       
      RESUME
      ENABLE
     
END

Yasin

#5
Alıntı yapılan: ete - 16 Ağustos 2014, 09:55:43
3 adet PWM sinyalinin her birinin Duty değerini hem artırabilmeli hemde eksiltebilmelisin. Bu işlem için 2 ayrı buton gerekir. 3 adet sinyal olduğuna göre toplam 6 adet buton gerekecektir. Bu nedenle butonları PORTB.0 - PORTB.5 arasına bağlamakta yarar vardır. A portunu ise 3 adet PWM sinyalinin çıkışı için kullanmak daha doğru olacaktır.

PWM sinyalleri senin yaptığın gibi biri çıkış versin sonra diğerine geçilsin şeklinde düşünürsen bir yere varmak mümkün olmaz. Mantık bu konuda kesme kullanılmasını söyler insana ama sana bir şey söylememiş anlaşılan.

Aşağıda açıkladığım sisteme uygun bir program mevcut bak bakalım işini görecekmi.

Ete
@ __config _INTRC_OSC_NOCLKOUT  & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
Define OSC 4
CMCON=7
PORTA=0:TRISA=0
PORTB=0:TRISB=%11111111

ON INTERRUPT GoTo KESME   
OPTION_REG=%00000011     
INTCON=%10100000

DUTY_R VAR BYTE 56
DUTY_G VAR BYTE 57
DUTY_B VAR BYTE 58
LEDA VAR BYTE   60
LEDB VAR BYTE   61
LEDC VAR BYTE   62
I VAR WORD
X VAR BYTE

PAUSE 200

  DUTY_R=1
   DUTY_G=1
   DUTY_B=1

BASLA:

DUTY_R=DUTY_R+PORTB.0
DUTY_R=DUTY_R-PORTB.1

DUTY_G=DUTY_G+PORTB.2
DUTY_G=DUTY_G-PORTB.3

DUTY_B=DUTY_B+PORTB.4
DUTY_B=DUTY_B-PORTB.5

FOR I=0 TO 150:NEXT I

GOTO BASLA

DISABLE
KESME:
      FOR X=1 TO 254
      IF x<=DUTY_R THEN
         PORTA.0=1
      ELSE
         PORTA.0=0
      ENDIF     

      IF x<=DUTY_G THEN
         PORTA.1=1
      ELSE
         PORTA.1=0
      ENDIF
     
      IF x<=DUTY_B THEN
         PORTA.2=1
      ELSE
         PORTA.2=0
      ENDIF   
      NEXT

      INTCON.2=0       
      RESUME
      ENABLE
     
END


Pbp'de kesme işine girmeye hiç gözüm yemedi. Öğrenme adımlarında kesmeyi en sona bıraktım. Program işimi gördü. Teşekkürler.

Yasin

Ayrıca şu kısımda ne demek istediğinizi, ne kastettiğinizi anlayamadım.

Alıntı yapılan: ete - 16 Ağustos 2014, 09:55:43
Mantık bu konuda kesme kullanılmasını söyler insana ama sana bir şey söylememiş anlaşılan.

İlyas KAYA

Alıntı yapılan: certy - 17 Ağustos 2014, 00:20:45
Ayrıca şu kısımda ne demek istediğinizi, ne kastettiğinizi anlayamadım.

ETE hoca demek istemiş ki ;


Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Yasin


ete

Alakası yok demekle ikinci bir kusur daha işledin. Kendinden o kadar eminsin yani. Alakası var elbette. Her şeyden önemlisi bir yazılımsal PWM ürettiğini söyleyip komut gecikmelerinden dolayı sorun yaşadığını belirtiyorsun ve yardım istiyorsun. Ama programı eklemek aklına gelmiyor bu ilk kusurun. Program eklenmeyince senin hangi mantıkla program yazdığını ve nerede sorun yaşadığını nereden anlayacak idik ?
Bu nedenle programı koymanı istedik ama gördük ki programın yazılımsal pwm ile alakası yok.
Bir sinyalin çıkması diğerinin tamamlanmasına bağlı olmaması gerekir. Belki bir sinyal elde ediliyor ama dikkat edersen "G" sinyali için "R" nin tamamlanması gerekiyor idi. Daha da kötüsü "B" sinyalinin çıkması için R ve G nin tamamlanması gerekiyor idi. Hiç böyle PWM olurmu.
Bu nedenle mantıklı düşünen birisi hemen böyle olmaz bu iş için mutlaka kesme kullanmak lazım şeklinde düşünmeliydi. Belki düşündün ama zor geldiği için hemen kaçtın. Kişinin kusurunu görmesi ve kabul etmesi kadar büyük irfan olmaz. Keşke programı yazdığını belirtmeden şu iş nasıl yapılır diye sorsa idin. O zaman alınacak bir konu ortaya çıkmaz idi. Biraz gurur yaptın gibi geldi bana. Böyle ise yapmaman daha doğru olurdu.

Ete

Yasin

Alıntı yapılan: ete - 19 Ağustos 2014, 09:54:11
Alakası yok demekle ikinci bir kusur daha işledin. Kendinden o kadar eminsin yani. Alakası var elbette. Her şeyden önemlisi bir yazılımsal PWM ürettiğini söyleyip komut gecikmelerinden dolayı sorun yaşadığını belirtiyorsun ve yardım istiyorsun. Ama programı eklemek aklına gelmiyor bu ilk kusurun. Program eklenmeyince senin hangi mantıkla program yazdığını ve nerede sorun yaşadığını nereden anlayacak idik ?
Bu nedenle programı koymanı istedik ama gördük ki programın yazılımsal pwm ile alakası yok.
Bir sinyalin çıkması diğerinin tamamlanmasına bağlı olmaması gerekir. Belki bir sinyal elde ediliyor ama dikkat edersen "G" sinyali için "R" nin tamamlanması gerekiyor idi. Daha da kötüsü "B" sinyalinin çıkması için R ve G nin tamamlanması gerekiyor idi. Hiç böyle PWM olurmu.
Bu nedenle mantıklı düşünen birisi hemen böyle olmaz bu iş için mutlaka kesme kullanmak lazım şeklinde düşünmeliydi. Belki düşündün ama zor geldiği için hemen kaçtın. Kişinin kusurunu görmesi ve kabul etmesi kadar büyük irfan olmaz. Keşke programı yazdığını belirtmeden şu iş nasıl yapılır diye sorsa idin. O zaman alınacak bir konu ortaya çıkmaz idi. Biraz gurur yaptın gibi geldi bana. Böyle ise yapmaman daha doğru olurdu.

Ete

Gurur yapmadım, hepimiz beşeriz ve elbette hata yaparız. Hatamı kabul etmiyorum da demedim. Bende biliyorum ki sorunun çözümü için programı koymam gerekir, ama unutmuşum. Öyle zaman oluyor ki birisine bir resim göndermek istediğimde resmin linkini koymadan mesajı gönderdiğim oluyor.

Ki zaten buraya konu açmamın nedeni her PWM'yi birbirini tamamlamadan çalışmadığı için bundan dolayı yaşadığım gecikmeye çözüm getirmekti. Kesme işinin zor gelmesinden ziyade kesmeyi kullanmayı bilmediğimden aklıma gelmedi. Zira kesmeyi kullansam bile bana büyük ihtimal sorun çıkaracaktı. Çünkü Pic'te başka alt programlarda çalışacaktı.

Ayrıca biri size "Mantık bu konuda kesme kullanılmasını söyler insana ama sana bir şey söylememiş anlaşılan." dese tepkiniz ne olurdu diye düşünün. Büyük ihtimalle sizde "Ya bana geri zekalı demeye çalışıyor, ya da mantığını kullanmayı bilmiyor." tarzında bir şey kastederek hakaret ettiğini düşünürsünüz.

Powered by EzPortal