automatic room light controller with visitor counter ödevi yardım!!!

Başlatan AKİF, 28 Aralık 2014, 15:47:42

AKİF

Merhabalar,
benim automatic room light controller with visitor counter diye bir ödevim var.CCS C de yazıyorum.
Kısaca kapıda iki sensör(buton olarak düşünebiliriz.) var.İlk önce sensör1 den geçip sonra sensör2 den geçerse kişi saysı 1 artacak.Eğer ilk  önce sensör2 den geçip sonra sensör1 den geçerse kişi sayısı 1   azalacak.
Sıkıntı şu, kişinin hangi sensörden ilk geçtiğini programda yazamadım.
Şu ana kadar yaptığım proteus ve c souce file dosyalarını gönderiyorum.
Ne yapmam gerekir?timer veya interrupt mı kullanmam gerekiyor?
İLginiz için şimdiden teşekkürler...

Hattuşa

slm usta;
CCS-C bilmiyorum kod konusunda yardımcı olamam ama benim aklımda şöyle bir fikir var işine yarar mı bilmem.
şimdi siz 16f877 kullanmışsınız bunda INT0 ve INT1 varmı bilmiyorum. int girişlerini seçmekteki amacım hiç kimseyi kaçırmamak adına,
mesela 18F252,18F2520 gibi içerisinde 2-3 adet int girişi olan entegrelerden seçebilirsiniz, (belki portb change girişi ile de olabilir)
ana döngü koştururken INT girişlerden birisi 1 olduğunda diğerini kontrol edersiniz, mesela INT0 =1 oldu bunu bir değişkene atarsınız (X değişkeni). peşinden INT1 i takip edersiniz INT1 değişkeni(y değişkeni) de 1 olduysa kişi içeriye giriş var demektir.
tam terside çıkış. ana döngüde
x şayet 1 oldu ise y yi kontrol et eğer y de 1 olduysa içeri giren kişi sayısını 1 artır
y şayet 1 oldu ise x i kontrol et eğer x de 1 olduysa dışarı çıkan sayısını 1 artır.

tıpkı rotary encoder mantığı gibi...
umarım kafan karışmaz  ;D

ete

Buton yada sensörlerin bağlantısı PORTB değişiklik kesmesine uygun olmuş. Bu kesmeyi aktif edersen, ve kesme içinde hangi buton yada sensörün aktif olduğunu kontrol edersen işin kolaylaşır.
İşin temel mantığı şöyle olmalı.
Önce pozisyon kontrolü için bir bit değişkeni set edilmelidir. Pozisyon derken iki konumlu bir pozisyon söz konusu. İçeriden veya dışarıdan hiç bir kimse geçmediği konumda POZ=0 , içeriden yada dışarıdan birisi sensörlerden birinden geçerse;
1. Dışarıdan içeri doğru geliyorsa 1 nolu sensör çalışmış olacak bu durumda POZ=1 ve YON=1
2. İçeriden Dışarı doğru biri geçmiş ise 2 nolu sensör aktif olacak ve yine POZ=1 ancak YON=0 olacaktır.

Bu aşamadan sonra saydırma konumu gerçekleşecektir. Yani
POZ=1 ve YON=1 ise 2 nolu sensör en sonunda aktif olacak ve sayac=sayac+1 olacaktır. Sayma işlemi bittikten sonra hemen POZ=0:YON=0 yapılmalıdır.

POZ=1 ve YON=0 ise 1 bu sefer 1 nolu sensör aktive edilmiş olacak ve Sayac=Sayac-1 şeklinde sayaç çalıştırılacak ve POZ=0 YON=0 yapılacaktır. Bu şekilde işlemler tekrarlanacaktır.

Ete

Burak

Kesmeye gerek yok . Kapidan istersen ferrari ile gec problem olmaz ... Yapmak istedigin sey icinse soyle bir onerim var
Sensorler ayni anda bir insan vucudu tarafindan golgelenemiyor diyerekten dusunuyorum.
X ve y degiskenin olsun bit tipinde tanimlanmis .

İf sens1 :0 and y<>1 then x:1
if sens2:0 and x:1 then
Kisi :kisi+1
x:0
endif

İf sens2:0 and x<>1 then y:1
if sens1:0 and y:1 then
Kisi : kisi - 1
y:0
endif

Sensorun 0 olmasi demek bu senaryoda sensor cisim gormesi anlamina geliyor unutmadan bunda ekliym

Burak
Ω Gens Una Sumus Ω

AKİF

Öncelikle herkese teşekkürler....
Ete hocam dediğiniz gibi yapmaya çalıştım ama olmadı...kodu aşağıya yazıyorum sıkıntı ne acaba?
Sıkıntı şu ,ilk button1 e basıp bırakıp  sonra button2 ye basıp bıraktıktan sonra artırma yapması gerekiyor.
Aynı şekilde ilk button2 ye basıp bırakıp sonra button1 e basıp bıraktıktan sonra azaltma yapması gerekiyor.
Benim yaptığımda button1 e basınca hemen azaltma ,button2 ye basınca hemen artırma yapıyor.
Yani programda , button1 bir puls(basıp çekme) yapacak sonra button2 bir puls yapacak ve artırma yapılacak.
Eğer ilk önce button2 bir puls yapıp sonra button1 bir puls yaparsa azaltma yapılacak...

#include "C:\Users\akif celebi\Desktop\Yeni klasör (7)\main.h"
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#int_RB       
void  RB_isr(void){
int poz,yon;
    if(!input(pin_b5)||!input(pin_b6))
   poz=0;
   else{
   poz=1;
   if(input(pin_b5))
   yon=1;
    if(input(pin_b6))
   yon=0;
     }
}

const int hane[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7c,0x07,0x7F,0x6F};
int butonsay=0;

void main()
{
int poz,yon;
   setup_adc_ports(NO_ANALOGS);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_vref(FALSE);
   
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

set_tris_b(0x01);
set_tris_a(0x00);
set_tris_d(0x00);
output_d(hane[butonsay]);

output_low(pin_a1);

while(TRUE)
{
if(poz==1&&yon==1){
butonsay++;
if(butonsay==10){
butonsay=0;
}
while(input(pin_b6));{
output_d(hane[butonsay]);
}
}

if(poz==1&&yon==0){
butonsay--;
if(butonsay==10){
butonsay=0;
}
while(input(pin_b5));{
output_d(hane[butonsay]);
}
}

if(butonsay>0){
output_high(pin_a1);
}
else
output_low(pin_a1);
}
}

Powered by EzPortal