Kesmede hatalı değişken okuma.

Başlatan mihri, 21 Aralık 2010, 11:43:27

mihri

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.?
"Eppur si muove!"

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mihri

#2
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?
"Eppur si muove!"

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

iyildirim

Değişkeni volatile tanımlama nedeniniz nedir.