Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip MPLAB C serisi => Konuyu başlatan: mihri - 21 Aralık 2010, 11:43:27

Başlık: Kesmede hatalı değişken okuma.
Gönderen: mihri - 21 Aralık 2010, 11:43:27
Merhaba.

volatile unsigned int tipinde bir değişkene main fonksiyonu içinde sonsuz döngüde basit çarpma işlemi ile değer atıyorum. Bu değişken aynı zmanda kesme alt programında da kullanılıyor. Sorun şu kesme alt programında bu değişken BAZEN hatalı olarak görünüyo. İşlemin yapıldığı kodda global kesmeyi kapatıyorum problem ortadan kalkıyor.

main fonksiyonu içinde ilgili  SkewVal değişkeni ile yapılan işlem aşağıdaki gibi.

//INTCONbits.GIE = 0;
SkewVal=(unsigned int)(3750-(SkewAngle*25));//1500uS = 3750 pulse, 1 derece = 25
//INTCONbits.GIE = 1;


kesme alt programında ise aşağıdaki işlem yapılıyor.

m = 0xffff-SkewVal;

Daha öncede dediğim gibi SkewVal değişkeni volatile unsigned int tipinde ve yukarıdaki kod parçalarının haricinde biyerde kullanılmıyor. Burda bir bug mı var yoksa ben mi biyerde hata yapıyorum.?
Başlık: Ynt: Kesmede hatalı değişken okuma.
Gönderen: X-Fi - 21 Aralık 2010, 11:49:27
main içersindeki formül sonsuz döngüdeyse ve tam hesaplama sırasında kesme geliyor ise bu sorun çıkartır hesaplamalar sırasında pic asm olarak değişkenleri birbiri arasında kullanıyor en son gene sonucu aynı değişkene yüklüyor doğru sonucu kullanmak için bu işlemlerin yarım kalmaması gerek.
Başlık: Ynt: Kesmede hatalı değişken okuma.
Gönderen: mihri - 21 Aralık 2010, 12:08:38
Alıntı yapılan: X-Fi - 21 Aralık 2010, 11:49:27
main içersindeki formül sonsuz döngüdeyse ve tam hesaplama sırasında kesme geliyor ise bu sorun çıkartır hesaplamalar sırasında pic asm olarak değişkenleri birbiri arasında kullanıyor en son gene sonucu aynı değişkene yüklüyor doğru sonucu kullanmak için bu işlemlerin yarım kalmaması gerek.

Evet problemin kaynağı işlem sırasında kesmenin oluşması ama bunun işlem sonucunu etkilememsi gerekmez mi? Daha doğrusu 1 Bytedan daha uzun değişkenlere değer atarken bu değişkenin kullanıldığı bir kesme oluştuğunda kesme alt programında değişkenin değerinin korunması gerekir. Mesela 16 bitlik değişkenin ilk 8 bitini atadı tam diğer 8 bitini atayacakken kesme oluşursa ne olur?
Başlık: Ynt: Kesmede hatalı değişken okuma.
Gönderen: X-Fi - 21 Aralık 2010, 12:50:03
Evet o zaman yanlış sonuçla işlem yapmış olacaksınız işlemci 8bit ise eksik kalan registerda hesaplama harici çöp değer bulunacaktır bu tür durumlara olanak vermemek için kesmeleri hesap sırasında kapatmalı veya başka bir yol izleyip işinizi çözebilirsiniz.
Başlık: Ynt: Kesmede hatalı değişken okuma.
Gönderen: iyildirim - 21 Aralık 2010, 14:58:01
Değişkeni volatile tanımlama nedeniniz nedir.