merhaba arkadaşlar...
Ben dc motor ile hız kontrolü yapacağım..
Keypad ile hız bilgisi alacağım..
Keypadı taramalı yöntem ile taradığımda program çok kasılıyor..
hatta proteus zaman sayacı bile yavaşlıyor..
#int_ext
void pulse_counter(){ // Dis kesme
pulse++;
}
#int_timer0
void timer(){
set_timer0(SETT); // Timer. Zaman saymak icin
flag=0;
//output_low(pin_e0);
if(tt>0){
tt--;
}
else{
//output_high(pin_e0);
//delay_ms(1000);
flag=1;
disable_interrupts (global);
disable_interrupts(int_timer0);
disable_interrupts(int_ext);
tt=100;
}
}
//************ ANA FONKSIYON *********************
void main(){
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED); // Kullanilmayan birimler
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
set_tris_a(0xFF);
set_tris_b(0b00000011); // b0-b1 cikis, digerleri giris
set_tris_c(0b11110000); // c1,c2 cikis
set_tris_d(0x00); // komple cikis
set_tris_e(0x00);
output_a(0x00); //A pinleri sifirla
output_b(0x00); // B pinleri sifirla
output_c(0x00); // C pinleri sifirla
output_d(0x00); // D pinleri sifirla
output_e(0x00);
setup_CCP1(CCP_PWM); // PWM modulu timer2 zamanlayicisini kullanir.
setup_CCP2(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,255,1);
set_pwm1_duty(0); // PWM1 cikis gorev cevrimi-SAAT TERSI
set_pwm2_duty(0); // PWM2 cikis gorev cevrimi-SAAT YONU
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_EXT);
enable_interrupts(INT_timer0);
enable_interrupts(GLOBAL);
set_timer0(SETT);
ext_int_edge(H_TO_L);
lcd_init(); // lcd hazirlaniyor
lcd_gotoxy(1,1);
printf(lcd_putc,"\fONCE *'A BAS!");
while(TRUE){
deger=keypad_tara(); // Keypad tara
hiz_bilgisi(deger); // Keypad sayilarini basamakli sayiya cevir
if(flag){ // timer0 kesmesi olustuysa flag=1 ise
devir=((float)pulse/encoder)*60; //Enkoder devir hesabi
if(input(pin_b1)){ //Yon Kontrolu
lcd_clear2();
printf(lcd_putc,"mHiz=+%.0f rpm",devir);
//printf(lcd_putc,"pulse: %d",pulse);
}else{
lcd_clear2();
printf(lcd_putc,"mHiz=-%.0f rpm",devir);
//printf(lcd_putc,"pulse: %d",pulse);
}
enable_interrupts(INT_EXT);
enable_interrupts(INT_timer0);
enable_interrupts(GLOBAL);
ext_int_edge(H_TO_L);
set_timer0(SETT);
pulse=0;
devir=0;
tt=100;
flag=0;
}
}
}
//*********** KEYPAD TARAMA FONKSIYONU ************
keypad_tara(){
tus=0;
output_high(sat1);
if(input(sut1)){ while(input(sut1)); tus=1; }
if(input(sut2)){ while(input(sut2)); tus=2; }
if(input(sut3)){ while(input(sut3)); tus=3; }
output_low(sat1);
output_high(sat2);
if(input(sut1)){ while(input(sut1)); tus=4; }
if(input(sut2)){ while(input(sut2)); tus=5; }
if(input(sut3)){ while(input(sut3)); tus=6; }
output_low(sat2);
output_high(sat3);
if(input(sut1)){ while(input(sut1)); tus=7; }
if(input(sut2)){ while(input(sut2)); tus=8; }
if(input(sut3)){ while(input(sut3)); tus=9; }
output_low(sat3);
output_high(sat4);
if(input(sut1)){ while(input(sut1)); tus=14; }
if(input(sut2)){ while(input(sut2)); tus=10; }
if(input(sut3)){ while(input(sut3)); tus=15; }
output_low(sat4);
return tus;
}
Merhaba. Sonsuz döngü içerisinde sanki sürekli tuşlara basılıyormuş gibi tarama yapıyorsunuz. Bunun yerine herhangi bir tuşa basıldığını anlayıp sonra tarama yapın ve hız bilgisini alın.
Proteusta kasar. Sen devreyi pratik olarak yap. Gerçek ortamda kasma olmayacaktır.
Alıntı yapılan: fahri- - 21 Nisan 2016, 09:27:39
Proteusta kasar. Sen devreyi pratik olarak yap. Gerçek ortamda kasma olmayacaktır.
taramalı keypad yapınca proteusdaki zaman yavaşlıyor. yani zaman çok yavaşlıyor. 1sn, 10sn gibi sürüyor..
Baskı devreye geçince aynı sorun devam eder mi ?
Etmez. Hiç bir sıkıntı olmaz. Senin PC simülasyonu real time yapamıyor. Hızı yetmiyor. Ama gerçek devrede bu olay olmaz.
Alıntı yapılan: fahri- - 22 Nisan 2016, 10:06:10
Etmez. Hiç bir sıkıntı olmaz. Senin PC simülasyonu real time yapamıyor. Hızı yetmiyor. Ama gerçek devrede bu olay olmaz.
Çok teşekkür ederim..
Dirençlere çift tıkla,
MODEL TYPE yazan yerin karşısında DIGITAL i seç,
biraz daha hızlanır.
Isis de simulasyon zamanı yavaş çalışsa dahi,
gösterdiği zamanda gerçekte ne işi yapacaksa simulasyondada o işi yapar,
yani:
misal program çalışmaya başladıktan tam 1 saniye sonra bir ledin yanmasını sağlıyor olsun,
simulasyon, başlatıldıktan, gerçek zamana göre 10 dk sonra bile ancak led yakma işini simule edebiliyor olsa,
led yakıldığı anda, simulasyon zamanı 1 saniyeyi gösteriyor olur,
gerçekte ne kadar zaman geçtiğinin önemi yoktur,
kodun işlediği zaman simulasyon gösterge zamanıdır.
Isis bazen kasar, gerçekte denemekte fayda var.
Alıntı yapılan: RaMu - 22 Nisan 2016, 19:46:47
Dirençlere çift tıkla,
MODEL TYPE yazan yerin karşısında DIGITAL i seç,
biraz daha hızlanır.
Isis de simulasyon zamanı yavaş çalışsa dahi,
gösterdiği zamanda gerçekte ne işi yapacaksa simulasyondada o işi yapar,
yani:
misal program çalışmaya başladıktan tam 1 saniye sonra bir ledin yanmasını sağlıyor olsun,
simulasyon, başlatıldıktan, gerçek zamana göre 10 dk sonra bile ancak led yakma işini simule edebiliyor olsa,
led yakıldığı anda, simulasyon zamanı 1 saniyeyi gösteriyor olur,
gerçekte ne kadar zaman geçtiğinin önemi yoktur,
kodun işlediği zaman simulasyon gösterge zamanıdır.
Isis bazen kasar, gerçekte denemekte fayda var.
Yanıtınız için teşekkür ederim..
Dediğinizi deneyeceğim..
Ana döngünün her turunda deger=keypad_tara(); fonksiyonuyla tarama fonksiyonuna giriyorsunuz. Bu kadar hızlı bir taramaya gerek yok. 20ms'de 1 kere girmesi yeterli. Ana döngünün en başına 20ms'lik bir delay ekleyebilirsiniz.Yok eğer döngü çok hızlı olmalı diyorsanız, tarama fonksiyonunu;
int i;
if(++i > 100)
{
deger=keypad_tara();
i = 0;
}
gibi 100 turda bir kere girecek şekilde ayarlayabilirsiniz.