Main fonkisoynundaki delay ve interrupt timer

Başlatan mustafay, 25 Mayıs 2010, 16:02:28

picmanya

#15
bu ana programda çalışan delay(x); fonksiyonu işlenirken kesme oluşsada dikkate alınmıyor demekki sonuç bu yani.peki bundan ne kadar eminsiniz? %100 eminmisiniz. delay(x); fonksiyonunun açılımını yani içindeki komutları tek tek bilen varmı bunu nerden görebiliriz.bu fonksiyon içinde şöyle bir komutun olması mümkünmü SRbits.IPL = 0; gibi bir komut yani status registerin ipl bitlerine atama yapan bir komut olabilirmi?
ben bu derleyiciyi hiç kullanmadım ama delay(x); bu tarz çalışıyorsa ya bu fonksiyonu kullanmayıp kendiniz bir gecikme sağlayan fonksiyon oluşturun yada profesyoneller gibi davranıp bu tür komutlara güvenmeden işlemcinin gerçek zaman timerx lerinden birini kurup kullanın derim.

radres

Ben CCS C'nin ana programda kullanılan delay fonksiyonlarında kesmeleri iptal ettiğine dair bir ibare bulamadım. Yani delay fonksiyonu çalışırken kesme gelirse kesme çalışıyor diye biliyorum. Kesme fonksiyonunda ise: kesme fonksiyonuna girişte tüm kesmeler kapatıldığı için delay fonksiyonu kesme içinde kullanmak bir sorun teşkil etmeyecektir. Sadece kesme fonksiyonunda zaman gecikmesi kullanmak programlama mantığı açısından verimli olmayan bir durumdur o kadar. Yanlışsam düzeltin.

picmanya

bana radres'in cevapları daha doğru gibi geliyor.
ama yinede imkanınız varsa doğruluğundan kesin emin olunan çok kısa ve net bir yazılımla bunu deneyip cevap verebilirseniz daha güzel olurdu.

bir şey daha soracağım CCS C nin hazır kullanılan fonksiyonlarının içini görmek mümkün olmuyor değilmi bunun bir yöntemi yok galiba yanlışmı biliyorum?içleri asm de olsa görmek mümkünmüdür?

radres

Benim dediğim doğru gibimi geliyor. delay fonksiyonlarında kesmeler çalışıyor. Zaten çalışmasaydı bu delay fonksiyonlarını kullanmak imkansız olurdu gibi me geliyor. CCS C derlendiğinde oluşan .lst uzantılı dosyada fonksiyonların asm karşılıklarını bulabilirsiniz.

JKramer

Benim attığım mesajlar görünmüyor mu?

radres


picmanya

Görünüyor.
Siz bu konuda çok eminsiniz
Bir bakarmısınız ana programdaki delay(x); fonksiyonu içinde hangi komutlar ifadeler koşturuluyor.
özelliklede status registerine atama yapılıyormu o satırı çıkarıp kodu bütün dosyayla birlikle derleyin olay çözülür bence.tabi çözmek isteniyorsa belki istenmeyip bu hali kabulde ediliyor olabilir.

Salih

#22
Arkadaşlar, biraz önce aşağıdaki kodları denedim çalışıyor. Ben CCS C'de böyle problem olmadığını biliyordum ama
yinede deneyeyim dedim. Deney gerçek devre üzerinde yapılmıştır. Benim bildiğim Pic Basic de bütün komutlar çalışmaya başlayınca bütün kesmeleri iptal ediyor. Komut çalışmasını bitirince kesmeleri serbest bırakıyor. Herhalde bazı arkadaşlar pic basic deki bu olayı CCs C'de var zannediyorlardı.
Pin_B1 deki 2ms periyotlu kare dalga delay den etkilenmeden çalışıyor.
#include <16F877.h>
#Device ADC=10
#FUSES NOWDT, HS,PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=8000000)

#INT_TIMER0 
void tmr0()
{
set_timer0(6);
output_toggle(Pin_B1);
}
void main(){

setup_psp(PSP_DISABLED); 
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
setup_timer_1(T1_DISABLED);  
setup_timer_2(T2_DISABLED,0,1);  
setup_adc_ports(NO_ANALOGS); 
setup_adc(ADC_OFF); 
setup_CCP1(CCP_OFF); 
setup_CCP2(CCP_OFF); 
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);

while(true){
output_toggle(Pin_B0);
delay_ms(1000);
}
}

bulut_01

pbp konusunda yanılıyorsun arkadasım ınt ile kare dalga elde  ettıgım pause gecikme yaptıgımda kesme ana döngüsünde int iptal olmadıgı resımde ve kodda ıspatıdır

@ DEVICE pic12F629
@ DEVICE pic12F629, WDT_OFF
@ DEVICE pic12F629, PWRT_ON 
@ DEVICE pic12F629, PROTECT_OFF
@ DEVICE pic12F629, MCLR_OFF
@ DEVICE pic12F629, INTRC_OSC_NOCLKOUT
TRISIO=0
gpio=0
WPU=0
clear
ON INTERRUPT goto KESME
INTCON=%10100000
OPTION_REG=%10000101
CMCON=7
TMR0=0
SAYAC VAR BYTE
SAYAC=0

WHILE GPIO.3=0
PAUSEUS 1
toggle gpio.2
WEND

DISABLE
KESME:
SAYAC=SAYAC+1
IF SAYAC=25 THEN
TOGGLE GPIO.0
SAYAC=0
pause 1000
ENDIF
INTCON.2=0
RESUME
ENABLE
END


[IMG]http://pic1.resimupload.com/r2/thumb_439221439.JPG[/img]
YENİLMEZ..

radres

salih bey olayı deneyerek gösterdiğiniz için sağolun.

picmanya

burasını anladık sağolun.
farklı bir konuda bir şey sormak istiyorum;
pic adc pinine bağlı ve dc 0....5 volt arası gerilim üreten bir kaynak olsun ben bu adc kanalını CCS C de istediğim an okuma yapabiliyorum burda sorunum yok.merak ettiğim pic işlemcinin adc giriş pini kendi adc kesmesi ile nasıl okunuyor CCS C'de adc kesmesinin oluşma şartlarını kısaca anlatabilecek varmı?

radres

ADC kesmesi (INT_AD), A/D birimi analog sinyali dijital bilgiye çevirme işlemini bitirince meydana gelir.

picmanya

anladım.
fırçalı dc 12 volt motor kontrolünde şase ile H köprü arasına bağlı 0,033R 4W. şönt bir direnç üzerinden akım okumaya çalışıyorum.devre donanımsal olarak gayet güzel çalışıyor sorun yok yalnız C programında işin içinden henüz çıkamadığım bir kısım var.

adc kesmesinin çalışma şartlarını bu yazılım için sormuştum.ama umduğumu bulamadım.

sorunum şöyle;
motor normalde 12 volt dc altında 1,5 amper çekiyor.
ama motor ilk kez enerjilendiğinde yada düşük bir devirde çalışıyorken birden daha yüksek devire geçildiğinde zannediyorum motor noramal akımının çok üstünü asılıyorki ben programda aşırı akım bilgisini okuyup motoru durduruyorum.

bu tür fırçalı dc motor akımını adc pini üzerinden 0...5 volt aralığında okuyan varmı daha önce?
bu işin yazılımı nasıl yapılıyor mantığı nasıl dır bilgi verebilirmi?

radres

Motorun çektiği akımı direncin üzerinde meydana gelen gerilim düşümüne göre okuyorsun anladığım kadarı ile. Bence devrende sorun yoksa mantık güzel.

picmanya

evet öyle okuyorum ama bu gerilimi opampla non inverting arttırıp o şekilde işlemciye giriyorum standart çokça kullanılan bir yöntem oluyor bu.
dc motor akımı okumada programda nasıl bir mantık izleniyor onu merak ediyorum akım sıçramaları nasıl değerlendiriliyor kolay yolu varmı onu bilmek istiyorum benim mantığımla program baya uzuyor ve buda hoşuma gitmiyor kolayı varsa bilmek isterim doğrusu mantık yönünden bir sıkıntım var.
şu anda şönt üzerinden akım bilsini analog olarak aldığım opampın çıkışına yani işlemciye giden hattına ayrıca başka bir opampı daha bağlayıp bu opampa bir pot üzerinden referans gerilim verip yani bu opampı karşılaştırıcı olarak kullanıp bunun çıkışındaki +5V. veya 0V. gerilimi işlemcimin harici kesme pinine vermeye ve onuda kullanmaya çalışıyorum burda amaç akım sıçramasını ayrı pinden algılamak ama bu iş böylede yapılıyormu onuda bilmiyorum.

şönt üzerinden akım okuyanlar yardım!