Selamlar
16f1827 ile analog datayı serout serin komutu ile karşı 16f1827 ye gönderip hpwm kullanarak çıkış almaya çalışıyorum. kod üzerinde adım adım denemediğim seçenek kalmadı. son bir yere geldim ve orada sıkıştım. anlam veremiyorum arkadaşlar. alıcı picte hpwm ile serin i birlikte kullanınca proteus programındaki simülatörde osiloskopta pwm çıkışlarında hiç bir hareketlilik gözlenmiyor. ama ne zamanki alıcı koddan serini kaldırıyorum (ve dolayısıyla manuel elle hwpm değeri veriyorum, mesela 50) o zaman hpwm sorunsuz çalışıyor. bu pic ile ilgili bir sorun mudur yoksa derleyiciden midir yardımcı olursanız çeok sevinirim. proton+ kullanıyorum işletim sistemim win7 64 bit. alıcı verici kodları aşağıdadır. bu arada programlayıcı olarak Pickit 2 kullanıyorum ve 16f1827 desteklenmediği için yama yükledim. yamadan da olabilir diye düşündüm bir an. lakin yamadan sonra bi sürü kod attım tek pic üzerinde analog ölçüm yapıp pwm alabiliyorum ama iş karşılıklı olunca ve alıcıda serin yazdımmı osiloskopta birşey değişmiyor.
verici kod:
Device = 16F1827
Include "modedefs.bas"
Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 LVP_OFF, STVREN_OFF, PLLEN_ON, WRT_OFF
OSCCON = %11110000
OSCTUNE = %00011111
Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 200
Declare CCP3_Pin PORTA.3
Declare CCP4_Pin PORTA.4
TRISA = 1
TRISB = 0
PORTA = 0
PORTB = 0
ANSELA = 1
ANSELB = 0
Dim z As Word
Dim x As Byte
x = 50
z = 50
basla:
z = ADIn 0
DelayUS 10
z = z/256
DelayUS 5
z = x
DelayUS 5
SerOut PORTB.5,396,["ERAY",x]
DelayUS 10
GoTo basla
alıcı kod:
Device = 16F1827
Include "modedefs.bas"
Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 LVP_OFF, STVREN_OFF, PLLEN_ON, WRT_OFF
OSCCON = %11110000
OSCTUNE = %00011111
Declare CCP3_Pin PORTA.3
Declare CCP4_Pin PORTA.4
TRISA = 0
TRISB = 1
PORTA = 0
PORTB = 0
Dim x As Byte
x = 0
basla:
SerIn PORTB.5, 396, [Wait ("ERAY"),x]
DelayUS 10
HPWM 4, x, 1000
DelayUS 10
GoTo basla
ben alıcı kodu derleyemiyorum niye acaba
declare xtal satırı yok
işlemci PLL ile 32mhz gibi konfigure edilmiş görülüyor
hpwm de osc min-max limitleri var
32mhz de 1khz pwm olmaz
işlemci 8mhz kabul ediliyorsa olur
hocam datasheeti baya okudum. kafamda o kadar dikkat etmem gereken nokta var ki. orayı kaçırmışım. pwm yi hemen yine data sheetten bakıp uygun değere çekiyorum.
yalnız normal pwm değeri verince çalışıyor? hpwm 2 , 50, 1000 mesela. serin koyunca sıkıntı çıkıyor. bunu bi göz önünde bulundurabilir misiniz ?
evet osilatör pll ile 32 mhz seçtim. o ayarları baya ince yaptım datasheetten bakarak
sorun verici kısmında da olabilir. analog ölçüm pic i karıştırıyor olabilir.
programa biraz bakınca anladığım kadarı ile yazılımsal seri data okuma yapıp donanımsal pwm ile çıkış veriyorsun. Fakat (yanlış hatırlıyor da olabilirim) proton serin komutunda kod gelene kadar bekleme yapar. Seninde program satırlarına baktığımızda pwm yönetiminden önce serin komutun var birde wait komutu ile anahtar kelimeyi bekliyorsun haliyle işlemci orada çakılıp kalıyor ;)
mümkünse pwm'i ya da seri data okumayı main içerisinde değilde timer1 timer0 ya da kullandığın işlemcide ne tür kesme oluşturacaksan onunla oku;
kısaca bir örnek mantığı anlatabilmek adına;
kesme:
HPWM 4, x, 1000
return;
basla:
SerIn PORTB.5, 396, [Wait ("ERAY"),x]
DelayUS 10
goto basla
tarzında bir durum oluşturabilirsin kesme geldiğinde otomatik olarak pwm değeri güncellenir ana program içerisinde de gelen datayı okursun burada 2. dikkat etmen gereken husus kesme içerinden en az bekleme ile çıkman seri data gelirken kesme içerisinde olursa program datayı doğru okuyamazsın.