16f88 ile proton kullanarak RB0 kesme oluşturma konusunda yardım

Başlatan gogoce, 20 Ağustos 2014, 11:15:57

gogoce

Merhaba Ustalar arkadaşlar,


ETE hocamızın 6. dersinden de faydalanarak dimleme işlemi yapmak istiyorum . Programı protonda yazdım . İlk defa kesme programı yazacağım . Bu konuda hiç tecrübem yok az bilgim var . Bişeyler yapmaya çalıştım ama başarılı olamadım . Yardımlarınızı bekliyorum


Saygılar


Device 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, DEBUG_OFF & CPD_ON & LVP_OFF & BODEN_OFF & MCLR_OFF & WDT_OFF & CP_ALL & HS_OSC
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF

XTAL = 20
Dim AC As Word
TRISB=%00000001
TRISA=%00001011

OPTION_REG.6=0               ;YÜKSELEN KENAR TETİKLEMESİ
ADCON1=%10000000             ;ANALOG DEĞER 10 BİT , 
ADCON0=%10001001             ;FOSC/32 , ANALOG KANAL 2
ANSEL=%00000011              ; AN0 VE AN1 ANALOG DİĞERLERİ DİJİTAL İNPUT
CMCON=7                     ; comparatör kapalı
Symbol GIE = INTCON.7 'Tüm kesme işlemlerine izin verme biti INTCON
Symbol INTE = INTCON.4     'RB0/INT ucundan gelen kesmeye izin verme biti
Symbol INTF = INTCON.1     'RB0/INT harici kesme bayrağı INTCON
GIE=1         'Tüm kesme işlemlerine izin ver
INTE=1         'RB0/INT ucundan gelen kesmeye izin ver
ON_hardware_interrupt kesme
PORTA=0
PORTB=0

basla:
Toggle PORTB.2
GoTo basla

Disable
kesme:
GIE=0 'diğer kesme işlemlerine izin verme
INTE=0 'RB0/INT ucundan gelen kesmeyi sıfırla
INTF=0 'RB0/INT harici kesme bayrağını sıfırla
AC = ADIn 0
If AC>700 Then AC=700
AC=AC/10
DelayUS AC
PORTB.4=1  ;triyak ateşlendi
DelayUS 50
PORTB.4=0  ;triyak ateşlemesi kesildi
INTE=1 'RB0/INT ucundan gelen kesmeye izin ver
GIE=1 'diğer tüm kesme işlemlerine izin ver
Resume 'ana programa dön
Enable 'diğer interruptlara izin ver
End
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

RB0 dan sıfır geçiş giriyorsan eğer, yükselen kenarda kesme yaratmak için ,
OPTION_REG.6=1 olmalı sen sıfır vermişsin.

Programda dimleme süresi adc kanalından okunuyor. bu süre normalde 10.000 us dir. Ama komut gecikmeleri nedeni ile sürenin ancak 8500-9000 aralığı kullanılabilir. Bunu 9000 kabul edersek okunan adc değerini bu değere çevirmen gerekir. Sen 10 bit okuma yapıyorsun ama sayıyı 700 de sınırlamışsın. Bu neden? hadi bunu kabul edelim diyelim peki asıl gecikme değeri için birde bunu 10'a bölmüşsün. Bu demektirki maksimum pot değerinde sen 70 gibi bir gecikme değeri elde edeceksin ki bu yanlış bir değerdir.
Çünki bekletme komutun DelayUS AC  şeklinde ve bu bir us cinsinden gecikme yaratacaktr. maksimum pot değerinde sen 70 us bekleyeceksinki bu hiç bir dimleme yaratamayacaktır.
Burada doğru hesap ve komut şöyle olmalı.
maksimum adc değerimiz 1023 dür. Sıfır dahl toplamda 1024 kademe demektir bu. Bekleme süremiz 8500 us olarak kullanalım. Bu durumda sabit çarpanımız, 8500/1024=8,3 olarak bulunur. Bunu virgülden kurtarmak içn 10 ile çarparız. Sonradan sonucu 10'a bölmek gerkecektir.
O halde formül, SURE (AC)=ADC*83/10 şeklinde hesaplanacaktır.
Hemen bir örnek yapıp test edelim. Port orta konumda iken okunacak adc değeri 511 olacaktır. 1 eklersek 512 bulacağız. SURE=(512*83)/10=4249 şeklinde bulunurki bu maksimum değerimiz olan 8500'ün hemen hemen yarısıdır. Demekki formül doğrudur.
ADC okuma ve AC hesaplama kısmını ana program bölümüne koymak daha akıllıca olacaktır. Zira  kısımda program hiç bir iş yapmamaktadır. Oraya koyduğun toggle komutuda hiç bir işe yaramaz çünki o kadar kısa sürede toggle işlemi yapılırki o pinde en ufak bir değişiklik izleme imkanın olmaz.
Bu açıklamalardan sonra gelelim Kesme kısmına. Kesme kısmındaki program dizisi aşağıdaki şekilde olmalı.;
Disable
kesme:
GIE=0 'diğer kesme işlemlerine izin verme
DelayUS AC
PORTB.4=1  ;triyak ateşlendi
DelayUS 50
PORTB.4=0  ;triyak ateşlemesi kesildi
INTF=0
GIE=1 'diğer tüm kesme işlemlerine izin ver
Resume 'ana programa dön
Enable


Son bir şey eklemek isterim. Dikkat edilirse dim süresi ne kadar uzun olursa yük o kadar az voltaj alır. Yük bir lamba ise Dim süresi 8500 iken lamba hiç yanmayacaktır. Pot maksimumda ama lamba parlaklığı minimumda olmuş olacak. Halbuki güzel olanı Pot maksimumda lamba parlaklığı maksimumda, pot minimumda lamba parlaklığıda minimumda olmalıdır. Bunu sağlamak için ya ADC den okunan değeri 1023 den çıkarmak yada hesaplanan AC değerini 8500 den çıkarmak gerekir.

Ete

gogoce

açıklamalar için teşekkürler hocam . Hemen deneyip sonucu bildireceğim
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Device 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, DEBUG_OFF & CPD_ON & LVP_OFF & BODEN_OFF & MCLR_OFF & WDT_OFF & CP_ALL & HS_OSC
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF

XTAL = 20
Dim AC As Word
Dim sure As Word
TRISB=%00000001
TRISA=%00001011

OPTION_REG.6=1               ;YÜKSELEN KENAR TETİKLEMESİ
ADCON1=%10000000             ;ANALOG DEĞER 10 BİT , 
ADCON0=%10001001             ;FOSC/32 , ANALOG KANAL 2
ANSEL=%00000011              ; AN0 VE AN1 ANALOG DİĞERLERİ DİJİTAL İNPUT
CMCON=7                     ; comparatör kapalı
Symbol GIE = INTCON.7 'Tüm kesme işlemlerine izin verme biti INTCON
Symbol INTE = INTCON.4     'RB0/INT ucundan gelen kesmeye izin verme biti
Symbol INTF = INTCON.1     'RB0/INT harici kesme bayrağı INTCON
GIE=1         'Tüm kesme işlemlerine izin ver
INTE=1         'RB0/INT ucundan gelen kesmeye izin ver
ON_hardware_interrupt kesme
PORTA=0
PORTB=0

basla:
AC=ADIn 0
sure=ac*83/10
GoTo basla

Disable
kesme:
GIE=0 'diğer kesme işlemlerine izin verme
DelayUS sure
PORTB.4=1  ;triyak ateşlendi
DelayUS 50
PORTB.4=0  ;triyak ateşlemesi kesildi
INTF=0
GIE=1 'diğer tüm kesme işlemlerine izin ver
Resume 'ana programa dön
Enable
End


hocam bu şekilde yaptım lamba parlaklığı max da . Trimpotla ayarlama yapılmıyor . Ayrıca hocam trimpotun tam sağ konumunda 0 tam sol konumunda 1024 okunuyor . 5v ve gnd yi bilinçli olarak değiştirmiştim . benim amacım tam sağ konumunda max voltaj tam sol konumunda min voltaj vermesi idi . Şimdi devreyi kontrol edeceğim . Çok uğraştım eminim basit bir detayı atlıyorumdur .

Yinede teşekkürler hocam son durumu paylaşacağım
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Sıfır geçiş yakalama devren de bir sorun olabilir. En güzeli devrenin aynısını simulasyonda kurup programı orada çalıştırmaktır. Buna göre ADC nin hesapladığı süre değerini oluşturulan sıfır geçiş gesmelerini görmeye çalışman gerek. Bu dosyalar var ise elde ettiğin HEX dosyası ile birlikte koy buraya bende bakayım.

Ete

gogoce

hocam ne yaptıysam proteusu doğru düzgün çalıştıramadım  en fazla 10 dk çalışıp kapanıyo
mecburen gerçek devrede deniyorum . Zaten sıfır geçiş devresinde 1,15 ms gecikme olduğunu daha önce söylemiştiniz . Bu benim için bir problem değil ama yinede bir şema ve hex dosyası göndermeye çalışayım . Devre smd olduğundan eleman değerlerini değiştirmek hayli problem olacak o yüzden şimdilik 1,15ms lik hatayı görmemezlikten geçiyorum
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

hocam proteus 7,9 ve üzeri pc de çalışmıyor . Sanırım pc de problem var 7,7 portable bulup onunla çizdim  .
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Hem devrede hemde programda sorun var.
Devredeki sorun bu hali ile RB0 kesmesi yaratacak tetik sinyali oluşmuyor.
Program ise stack hatası veriyor. Süre hesabını da doğru yaptığından emin değilim.
Proton da yazılınca programa tam hakim olamıyorum. Ama anladığım kadarı ile,
- ADC parametreleri eksik
- Kesme kurulumu da yanlış yada eksik.
Program kesmeye girmez ise stack hatası vermiyor. Bu demektir ki kesmeye giderken stack kısmı devreye giriyor ama ne hikmetse stack hatası oluşuyor. Şu komutdan şüpheleniyorum.
ON_hardware_interrupt kesme
bu şöyle olması gerekmiyormu ? ON_hardware_interrupt GOTO kesme

ADC parametrelerinde
DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 2    ' ADC clock source  (Fosc/32)
DEFINE ADC_SAMPLEUS 3 ' ADC sampling time (uSec)
komutlarının karşılığı bazı parametreler verilmesi gerekiyor bana kalırsa.
Zira İsis ayrıca ADC ölçümünde ADC çevrim CLK peryodunun 1,6us den daha az olduğunu söylüyor.
Buda ADC işlemi için CLK seçiminin yanlış olduğunu gösterir.

Program bir şekilde düzeltilir ama devrenin sorununu bulmak gerekir yada çalışanbir devre kullanmak belkide daha doğru olur.

Ete


gogoce

haklısınız hocam mcs de derlemeye başlıyacam proton dert olmaya başladı

kesme içerisinde triyak ateşlemesini kapattığımda lamba hiç yanmıyor

triyak ateşlemesini açıyorum lamba tam parlaklıkta yanıyor

kesmeden mi çıkamıyor ne yapıyor anlamadım

Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

devreye de bi el atmak gerekecek smd malzemelerle ne yapacaz bakalım :(
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Devreye bir el attım. Vsin configürayonu bana göre yanlış idi onu düzelttim. Kesme oluşmaya başladı.
Skop ayarları yanlış idi onu düzelttim. Bazı ufak ayarlamalar yaparak önce devreyi çalışır hale getirdim.
Sonra programı PBP da yazdım. Sonuçta istediğm gibi çalıştı sistem. Umarım gerçek devrede de çalışır.
İlişiktedir.
Bu arada sıfır geçiş yakalama sistemi high da bekleyip sıfır geçiş anında LOW a düştüğü için Option registeri 6. cı bitine sıfır vermek gerekiyormuş. Çalışınca gördüm bunu. Gecikme meselesi 0-8500us arasında gayet güzel çalışıyor.

Ete

gogoce

teşekkürler hocam hemen deneyip sonuçları bildireceğim
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

gogoce

Hocam tesekkurler program calisti . Anca firsat bulup yazabildim . simdi dimlenmis lambaya trafo baglayip cikisi dogrulttuktan sonra baska bir picle ( gnd ler ortak ) voltaji ekrana yazmak istiyorum fakat soyle bir sikinti oldu


Pot min konumda iken lambada 19 v var . analog okudugum ham deger 225 (picin analog portunda 1.10 v var ). lamba tam parlakken okudugum ham analog deger 822 ( analog portta okudugum deger 4.02 v)

822-225 = 597 deger var bu degeri 206 ya boluyorum olmuyor 206-19=187 ye boluyorum olmuyor  anliyacaginiz hocam bu isi beceremedim nerde hata yapiyorum acaba hocam
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Dimmer işinde teorik değerler ile gerçek değerler genelde bir birinden farklı olur.
İsis verilerine bakarak gecikme süresinin 8500us olduğunu gördük. Gerçektede böylemi acaba?
Bu nedenle gerçek devrene bir skop bağlayıp sinüs yanında tetik sinyalinin hangi aralıkta çalıştığına bakmak lazım. Ama önceki tecrübelerimden biliyorum dimmeri (lambayı) sönük konuma alınca çıkış tam sıfır olmuyor.
Sende de öyle olmuş. Öncelikle göz kontrolü yapıp,
- Lambanın min dim seviyesinde tam olarak sönüp sönmediğine bakmak lazım. Bazen lamba sönük gibi gözüksede rezistansta hafif bir kızarma görülebilir.
- Maksimum dim seviyesinde lambanın parlaklığının tam parlak olup olmadığınada bakmak gerekir. Bunun için lamba direk bağlanıp parlaklık mukayesesi yapılmaya çalışılmalıdır.

Ölçtüğün değerler de anlamsız gibi geldi bana. Öncelikle pot min konumda iken potun bağlı olduğu ADC pininde 0V okumalısın. Pot max. konumda iken ADC pininde ise 5V okuman gerekir. Sende bu voltajlar nedir.
Diğer taraftan lamba üzerinde okuduğun voltaj bana göre sanal bir voltaj olabilir. Bu tür voltajların True RMS ölçebilen voltmetreler ile ölçülmesi daha doğru olur. Açıkçası AC konusunda çok fazla tecrübeli değilim. Kendi deneylerim sonucunda elde ettiğim tecrübelerim var yalnızca. Ama AC okumanın zorluğunu gayet iyi biliyorum. Boşta okuyabilirsin ama yük bağlı ise okumada sapmalar olur.
SOnuçta burada elde ettğin sonuçları bende değerlendirmekte zorlanırım. Üstelik sorunun ne olduğunuda anlamış değilim. Lamba tam sıfırlanıyor ve ayar ile tam parlak hale de gelebiliyor ise sorun yok demektir.

Ete

gogoce

Cevap icin tesekkurler hocam

Pot min da iken lambanin flamani hafif kizarik oluyor . lambada 19 v olcuyorum

Bu degeri analog olarak pice verdigimde picde 1.10 v goruyorum


Pot max da iken lamba parlak ve lambada 206 v olcuyorum , bu degeri analog olarak pice verdigimde 4.20v okuyorum


Dediginiz gibi faz kaymasi gibi bir durum olusuyor pot max iken lambada 220 v civari olmasi gerekiyor idi ' ama ben 206 v olcuyorum bunla sonra ilgilenecegim benim asil sikintim analog portta 1.10 v var iken displaye 19 , portta 4.20 v varken 206 v yazdiramanam . hesapta hata yapiyorum
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

Powered by EzPortal