18f45k20 modeli pic kulanıyorum ve kesme ile işlemlemlerimi halediyorum fakat kesme bittikden sonra program kaldıgı yerden devam ediyor bunu biliyorum ama benim yapmak istediğim program kaldıgğı yerden değil başlangıçdan başlamasini istiyorum bunu nasıl başarabilirim
while(true)
{
1.komut
2.komut
3.komut
4.komut
}
ben devamli kesme işlemi bitince 1.komuttan başlamısını istiyorum
hocam.
while(1)
{
if(a == 5) a=1;
if (a == 1){ birinci komut}
if (a == 2){ ikinci komut}
if (a == 3){ ucuncu komut}
if (a == 4){ dorduncu komut}
a++;
}
interrupt tada a = 1; yaparsaniz hep interrupt sonrasi birinci komut calisir? ::)
switch case komutu daya uygun değilmi. Break komutundan sonra baştan başlar Bir inceleyin isterseniz.
Evet switch case daha iy,i arkadaşın da dediği gibi.
static unsigned int8 flag;
while(TRUE)
{
switch(flag)
{
case 0: func1 break;
case 1: func2 break;
case 2: func3 break;
case 3: func4 break;
}
}
kesme işlemi burdada kaldıgı yerden devam etmiyecekm
mesala
while (true)
{
delay_ms(100);
led=1;
}
kesme geldigi zaman delay_ms(); en son nerde bıraktıysa 100ms tamamlayıp devam ediyor ben ise baştan 0-100 ms saydırmak istiyorum
yani kesmenin en son kaldıgı adresi nasıl sıfırlarım böyle bir şey yapılabilirmi ?
Kesmenin mantığı bu, kaldığı yerden devam edecek. Bu isi kesmesiz yapabilirsiniz ancak.
Yemek pişiyor başında bekliyorsunuz.Kapı çaldı(kesme oluştu) kapıdaki amcayla konuştunuz.Sonra hemen ocağın başına dönersiniz.Yemeği baştan yapar mısınız ?
Kesmenin mantığı budur.
18F serisi için;
HiTech Pic18 C compiler için;
void reset()
{
#asm
reset
#endasm
}
mikroc;
asm reset;
Alıntı yapılan: selimkoc - 18 Nisan 2015, 22:36:16
18F serisi için;
HiTech Pic18 C compiler için;
void reset()
{
#asm
reset
#endasm
}
mikroc;
asm reset;
Merhaba,
18 F serisinde asm kodları içinde "RESET" var mı?Teşekkürler.
var :) datasheet sayfa 319
Tek problem beklemeyse
başka çözümlerde düşünebilirsin:
#INT_xxxx
void interrupt(void) //kesme rutini
{
kesmeli=0; //süreyi tekrar sıfırdan başlat
}
unsigned int8 kesmeli=0; //
while (true)
{
for(kesmeli=0:kesmeli<100:kesmeli++) //bekleme
{
delay_ms(1);
}
led=1;
}
Yani programı while ın başına mı döndürmek istiyorsun?
Alıntı yapılan: x-nomek - 18 Nisan 2015, 20:55:31
kesme işlemi burdada kaldıgı yerden devam etmiyecekm
mesala
while (true)
{
delay_ms(100);
led=1;
}
kesme geldigi zaman delay_ms(); en son nerde bıraktıysa 100ms tamamlayıp devam ediyor ben ise baştan 0-100 ms saydırmak istiyorum
yani kesmenin en son kaldıgı adresi nasıl sıfırlarım böyle bir şey yapılabilirmi ?
delay_ms(x) gibi komtlar hızlıca birşeyleri test etmek içindir. Gerçek programda bu kadar uzun beklemeler kullanmak
yapısalığı bozar.
Timer kullanmak bu tür sorunları çözer.
Reset yaparsan, her kesmeye girdiğinde program tekrar tekrar baştan yüklenecek. Donanım izin verir mi bilmiyorum ama şöyle yapabilirsin;
Yazdığın programı dissasembly edip while ın program adresini alırsın. Daha sonra kesme alt programının sonunda Stack Pointer ı Pop ile okuyup yerine push ile dissasemblyde bulduğun adresi yazarsan, Program Counter kaldığın yerden değil de senin SP ye yüklediğin yerden devam eder. Bunu daha önce denemedim ama sen istersen bir dene.
Alıntı yapılan: E_Kk - 19 Nisan 2015, 17:46:39
Reset yaparsan, her kesmeye girdiğinde program tekrar tekrar baştan yüklenecek. Donanım izin verir mi bilmiyorum ama şöyle yapabilirsin;
Yazdığın programı dissasembly edip while ın program adresini alırsın. Daha sonra kesme alt programının sonunda Stack Pointer ı Pop ile okuyup yerine push ile dissasemblyde bulduğun adresi yazarsan, Program Counter kaldığın yerden değil de senin SP ye yüklediğin yerden devam eder. Bunu daha önce denemedim ama sen istersen bir dene.
bunu denmeye çalişcam