Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

rs485 kesme sorunu

Başlatan yusufozkay, 18 Mayıs 2009, 22:39:56

yusufozkay

Selamlar,

Programımda 18f452 ile 16f628'i rs485 ile haberleştiriyorum.
Normalde yapması gereken işlemleri yapıyor fakat,
çalışır vaziyette dururken, 18f452 denetleyicisi olan kart
normalde benim dışardan vereceğim bir komutla yapması
gereken bir işlemi yapıyor. Bu 10-15 dakika içerisinde herhang
bir anda oluyor. Seri haberleşme soketini çıkarttığım zaman
herhangi bi sorun olmadan çalışıyor.
Programda hata olma olasılıklarını inceledim bi sorun görünmüyor,
ancak yine de ben yanlızca kesme ve gelen veriyi buffer'a atma
işlemini yapacak hale getirdim, 628i de 200ms aralıklarla veri
gönderecek şekilde ayarladım.

Bu durumda da halen sorun devam ediyor. Fazladan bilgi olarak
kesme işleminin içerisinde tek satırlık bir fonksiyon var ve bu
fonksiyonu kaldırdığım takdirde program henüz ana döngüye
gelmeden takılıyor. Yine bu durumdayken seri haberleşme soketini
çıkardığım zaman normal çalışıyor. Kesme ile ilgili bir sorun
var gibi duruyor fakat ne olduğunu henüz çıkaramadım.
Yardımcı olursanız sevinirim. Teşekkürler.

Not: rda kesmesinin haricinde timer1 kesmesi de çalışıyor.

BenC

rs485 entegresini alış enable pini, alış pozisyonunda değilse veri alamayacağı için kesme gerçekleşmiyor olabilir.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

yusufozkay

Yok kesme çalışıyor, kesme ve seri haberleşme ile gelen veriler genel
olarak çalışıyor gibi. Fakat normalde benim komutum olmadan yapmaması
gereken işlemi yapıyor ve bunu seri haberleşme girişleri bağlı iken yapıyor.
Yoksa temel işlemlerde sorun yok.

datasheeti biraz daha inceledim. eeproma yazma işlemi yaparken kesmeleri
iptal etmek gerekiyormuş.programın normal döngüsünde eeproma yazma
işlemi var, gerçi programın o kısımlarını durur vaziyette işlemiyor. ccs'in
eeproma yazma fonksiyonunda bu işlemi kendiliğinden yapıyor da olabilir.
Yine de yarın bi deneyeceğim.

Başka önerileri olan var mı?

alayli

Datanızı gönderirken doğrulamak, doğru data gittiğini test etmek için bir önlem aldınız mı? Belki CRC eklemeniz gerekiyordur.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

yusufozkay

Henüz bi önlem almadım ancak simülasyon ortamında da aynı durum oluşuyor. Ayrıca seri haberleşme ile gelen veriyi kullanmadığım zaman da aynı durum oluşuyor. Yani kesme ya da kesmede kullandığım gelen bir bytelık veriyi buffer'a atma esnasında sorun oluşuyor gibi görünüyor.

MURSEL

veriyi bufere nasıl atıyorsun ?
usart modulune gelen 2 baytlık datayı okumassan üzerine başka bi data gelirse taşma hatası verip  takılı kalıyordu bildigim kadarıyla datayı  almada bir sıkıntı var gibi   fuse ayarlarına  NOSTVREN bunu ekle daha öncelikle haberleşmendeki problemi cöz  ,kesmeye girdikten sonra neler yaptıgını gösterirsen daha kısa sürede cözüm bulunabilir ,


timer1 kesmesi sıkıntı oluşturmaz eger rda kesmesine girdikten sonra tüm kesmeleri aktif et demiyorsan "enable_interrupts(GLOBAL); " problem olmaz

yusufozkay

ccs'in rs485 kütüphanesini biraz değiştirdim onu kullanıyorum. kütüphanedeki kodları gönderirim.
Başka sorunlar da gözlemledim. Normalde seri haberleşme ile gidip gelmesi gereken veriler gayet düzgün bir şekilde çalışıyor. Sorunları sıralarsam:

* a ve b iki değişken olsun, c bir bit olsun
if(a & b)
    c = 1;
a değişkeni 0 olmasına rağmen if bloğunun içerisine girip bu biti set edebiliyor(1 saatlik bir çalışma süresi içerisinde herhangi bir anda yapıyor). Bunu proteusta da net bir şekilde gözlemledim. a'nın 0 olduğunu kesinlikle biliyorum(nitekim proteusta da gözlemliyorum), ayrıca bitin set olduğu tek yer burası. hatta bu problemi şu şekilde hallettim ve oldu:
if(a & b)
  if(a)
      c = 1;
Yani a kesinlikle 0 olduğu için gerçekten a bir değer almadan bu bit set olamamış oluyor, böylece problem çözülüyor, ancak bu şekilde çözmek istemiyorum, yamadan başka bişey değil bu.

* Yine uzun bir bekleme süresinden sonra LCD'nin üst satırında yazmaması gereken bişey yazıyor(normalde alt satırda yazan bir şey). LCD durumu değiştiği zaman normal durumuna dönüyor. LCD ile ilgili sorun proteusta olmadı, ancak kartın kendisinde sorun oluyor.

* Çok uzun bir süre boyunca normal çalıştıktan sonra işlemci reset atıyor. Bir kez olduktan sonra bu sıkça da olabiliyor. İşlemcinin reset atmasını sağlayabilecek herhangi bir configurasyon biti aktif değil (NOWDT, NOSTVREN), yanlızca BORV42 var.

Bir fikri olan varsa ve yardımcı olabilirse sevinirim. Teşekkürler.

yusufozkay

LCD işlemlerini yaparken kesmeleri iptal etmek gerekebilir mi acaba?