Gelen dijital girişleri saymak

Başlatan hakansefau, 18 Nisan 2014, 21:21:08

hakansefau

Arkadaşlar lpc1343 ile örneğin 8 adet pine herhangi anda gelecek olan digital işaretleri saymak istiyorum. Fakat tam olarak beceremedim, yardımlarınızı bekliyorum. Kodun başlangıç değer fonk. değişken define ları falan göstermedim çok uzun görüntü olmasın diye.

    while(1) {

//////////////////////////////////////////////////////////////SIGNAL PORT 1
    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN1) == 0){
    		buffer = 1;
    		if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN1) == 1)
    		{
    		sensor1++;
    		buffer = 0;
    		}
    	}
    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN2) == 0){
    		sensor2++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN3) == 0){
    		sensor3++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN4) == 0){
    		sensor4++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN5) == 0){
    		sensor5++;
    	}
    	//////////////////////////////////////////////////////////////SIGNAL PORT 2
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN6) == 0){
    		sensor6++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN7) == 0){
    		sensor7++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN8) == 0){
    		sensor8++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN9) == 0){
    		sensor9++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN10) == 0)
		{
    		sensor10++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN11) == 0)
		{
    		sensor11++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN12) == 0){
    		sensor12++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN13) == 0){
    		sensor13++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN14) == 0){
    		sensor14++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN15) == 0){
    		sensor15++;
    	}
    	//////////////////////////////////////////////////////////////SIGNAL PORT 3
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN16) == 0){
    		sensor16++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN17) == 0){
    		sensor17++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN18) == 0){
    		sensor18++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN19) == 0){
    		sensor19++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN20) == 0){
    		sensor20++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN21) == 0){
    		sensor21++;
    	}
//////////////////////////////////////////////////////////////SIGNAL PORT 4
    	if(GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN22) == 0){
    		sensor22++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN23) == 0){
    		sensor23++;
    	}
    	if(GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN24) == 0){
    		sensor24++;
    	}

    	///	i gelen pulselar genel toplami
    	i = sensor1 + sensor2 + sensor3 + sensor4 + sensor5 + sensor6 + sensor7 +
    		sensor8 + sensor9 + sensor10 + sensor11 + sensor12 + sensor13 + sensor14 +
    		sensor15 + sensor16 + sensor17 + sensor18 + sensor19 + sensor20 + sensor21 +
    		sensor22 + sensor23 + sensor24;

    	printf("\nsayac = %d",i);
		
    }


Bu durumu bir kaç farklı şekilde denedim. Sensör girişi 0 a çektiği zaman okutuyorum. Bu şekilde yaptığımda sensör 0a çektiğinde wihle içine çok döndüğünden sayaç çok sayıyor. sadece 0 olduğunda sayacı arttır dediğimde bu seferde tek bir pinde takılı kalıyor. Eğer 0a çekmezse o pin kontrolünde kalıyor.

Bu pinleri sürekli kontrol edip, hangi pin 0 a çekerse sayacı 1 arttırcam. ama 0 olduğu zaman 1 2 3 .. diye saymayacak 1 kez işaret geldi gibi anlamalı. Bu tarafı kestiremedim. FPGA ile çok rahat çözülebilir bir durum çünkü paralel kontrol edemiyorum bu koşulları, lpc1343 ile çözmek zorundayım, bir fikriniz varmıdır acaba?

Teşekkürler

sadogan

Digital  girişlerde external interrupt yokmu varsa sensör çıkışına göre yükselen yada düşen
kenarda interruta girerek değişkeninizi artırısınız.
Yoksa  girşlerinizi bir önceki giriş değerleri ile exor yapıp değişme varmı diye bakarak değişme var ise ilgili
işleminizi yapabilirsiniz.

hakansefau

Aslında şöyle bir durum var, lpc1343e hakim değilim. Fakat durum itibariyle kullanmak zorundayım.

Kodu şu şekilde yazdım;

int main(void) {

    GPIOInit();
	SystemInit();
	DelayInit();

	LCDInit();
	LCDClear();
	DelayMS(10);
	LCDGotoXY(1,1);

	PortDirInit();

 	volatile uint32_t sensor22 = 0;

 	unsigned char buffer1, buffer2, buffer3, buffer4, buffer5,
 	buffer6, buffer7, buffer8, buffer9, buffer10, buffer11, buffer12, buffer13,
 	buffer14, buffer15, buffer16, buffer17, buffer18, buffer19, buffer20, buffer21,
 	buffer22, buffer23, buffer24 = 0;

    while(1)
    {
    	LCDGotoXY(0,0);
    	LCDPutString("SAYAC : ");
    	//LCDPutDecByte(i);
    	LCDGotoXY(0,1);
    	LCDPutDecByte(sensor22);

    	GPIOSetValue(LED_PORT, LED_PIN, 0);;
//////////////////////////////////////////////////////////////SIGNAL PORT 1
    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN1) == 0){
    		buffer1 = 1;
    	}
    		if((buffer1) && (GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN1)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor1++;
    		sensor22++;
         	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
        	buffer1 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN2) == 0)
		{
    		buffer2 = 1;
    	}
    		//if((buffer2 == 1) && (GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN2) == 1) // buffer ve signal kontrolu
		if((buffer2) && (GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN2)) == 1)
    	{
    		//sensor2++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer2 = 0;
    	}

    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN3) == 0){
    		buffer3 = 1;
    	}

    		if((buffer3) && (GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN3)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor3++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer3 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN4) == 0){
    		buffer4 = 1;
    	}

    		if((buffer4) && (GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN4)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor4++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer4 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN5) == 0){
    		buffer5 = 1;
    	}
    		if((buffer5) && (GPIOGetValue(SIGNAL_PORT1, SIGNAL_PIN5)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor5++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer5 = 0;
    		}

//////////////////////////////////////////////////////////////SIGNAL PORT 2
    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN6) == 0){
    		buffer6 = 1;
    	}
    		if((buffer6) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN6)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor6++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer6 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN7) == 0){
    		buffer7 = 1;
    	}
    		if((buffer7) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN7)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor7++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer7 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN8) == 0){
    		buffer8 = 1;
    	}
    		if((buffer8) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN8)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor8++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer8 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN9) == 0){
    		buffer9 = 1;
    	}
    		if((buffer9) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN9)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor9++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer9 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN10) == 0)
		{
    		buffer10 = 1;
    	}
    		if((buffer10) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN10)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor10++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer10 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN11) == 0)
		{
    		buffer11 = 1;
    	}
    		if((buffer11) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN11)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor11++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer11 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN12) == 0){
    		buffer12 = 1;
    	}
    		if((buffer12) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN12)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor12++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer12 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN13) == 0){
    		buffer13 = 1;
    	}
    		if((buffer13) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN13)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor13++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer13 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN14) == 0){
    		buffer14 = 1;
    	}
    		if((buffer14) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN14)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor14++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer14 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN15) == 0){
    		buffer15 = 1;
    	}
    		if((buffer15) && (GPIOGetValue(SIGNAL_PORT2, SIGNAL_PIN15)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor15++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer15 = 0;
    		}

//////////////////////////////////////////////////////////////SIGNAL PORT 3
    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN16) == 0){
    		buffer16 = 1;
    	}
    		if((buffer16) && (GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN16)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor16++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer16 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN17) == 0){
    		buffer17 = 1;
    	}
    		if((buffer17) && (GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN17)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor17++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer17 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN18) == 0){
    		buffer18 = 1;
    	}
    		if((buffer18) && (GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN18)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor18++;
    			sensor22++;
            	LCDGotoXY(0,1);
            	LCDPutDecByte(sensor22);
    		buffer18 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN19) == 0){
    		buffer19 = 1;
    	}
    		if((buffer19) && (GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN19)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor19++;
    			sensor22++;
            	LCDGotoXY(0,1);
            	LCDPutDecByte(sensor22);
    		buffer19 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN20) == 0){
    		buffer20 = 1;
    	}
    		if((buffer20) && (GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN20)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor20++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer20 = 0;
    		}

    	if(GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN21) == 0){
    		buffer21 = 1;
    	}
    		if((buffer21) && (GPIOGetValue(SIGNAL_PORT3, SIGNAL_PIN21)) == 1) // buffer ve signal kontrolu
    		{
    		//sensor21++;
    		sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
    		buffer21 = 0;
    		}

//////////////////////////////////////////////////////////////SIGNAL PORT 4
    	if(GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN22) == 0){
    		buffer22 = 1;
    	}
    			if((buffer22) && (GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN22) == 1)) // buffer ve signal kontrolu
    			{
    	    		sensor22++;
    	        	LCDGotoXY(0,1);
    	        	LCDPutDecByte(sensor22);
    	    		buffer22 = 0;
    	    	}

    	if(GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN23) == 0){
    		buffer23 = 1;
    	}
    			if((buffer23) && (GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN23)) == 1)
    			{
    	    		//sensor23++;
    	    		sensor22++;
    	        	LCDGotoXY(0,1);
    	        	LCDPutDecByte(sensor22);
    				buffer23 = 0;
    	    	}

    	if(GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN24) == 0){
    		buffer24 = 1;
    	}
		if((buffer24) && (GPIOGetValue(SIGNAL_PORT4, SIGNAL_PIN24)) == 1)
		{
			sensor22++;
        	LCDGotoXY(0,1);
        	LCDPutDecByte(sensor22);
			//sensor24++;
    		buffer24 = 0;
    	}

    	GPIOSetValue(LED_PORT, LED_PIN, 1);
    }


Burada mz80 kullanıyorum. Sensör cismi görünce 0a çekiyor. Ok ve while ın içinde fazlaca saymasın diye 0'dan 1 e döndüğünde sayacı arttırdım. Bu şekilde tamam.
Hatta aynı anda cisim gördüğünde farklı zamanlarda 1e çektikleri için gene bir problem yaşamıyorum.

Ama bir problem var bir türlü çözemedim. Şimdki mcu için default durumda tüm io lar input ve pull-up olduğunu öğrendim. Fakat ben sadece p3.0 p2.0 ve p1.0 için bu kod çalışıyor. yani 24 sensörü değil 3 sensörde okuma yapıyor.

Daha kısaca sorunum şu, bence ben p3.0 p2.1 ve p1.0 haricindeki pinleri input ve pull up yapamıyorum.

CMSIS de şöyle bir kod var
GPIOSetDir(SIGNAL_PORT2, SIGNAL_PIN11, 0);


Bu in put yapıyormuş. main fonk. içinde çağırdığım PortDirInit(); fonk da bu işlemleri yaptırıyorum bu 24 pin için.

Fakat ya doğru yapamıyorum ya da başka birşey var. Ama bulamadım