16F1827 Serin ve hpwm birlikte çalışmıyor

Başlatan xcyqp09k2, 27 Ocak 2015, 19:01:45

xcyqp09k2

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

Maxim

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


xcyqp09k2

#2
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



xcyqp09k2

sorun verici kısmında da olabilir. analog ölçüm pic i karıştırıyor olabilir.

gokhangokcen

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.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.