logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Prośba o sprawdzenie kodu - programowanie ATtiny13

Defozo 13 Sty 2010 16:36 2373 5
REKLAMA
  • #1 7529769
    Defozo
    Poziom 17  
    Witam, piszę w C (w Programmer's Notepad - WinAvr).
    Mam problem z kodem na mikrokontroler ATtiny13.

    /* "domofon.c" - programik do auto-otwieracza do domofonu */
    /* układ ATtiny 1MHz */
    /* PB3 - Wyjście - BUZ11 - otwiera drzwi */
    /* PB4 - Wejście - dzwonek (wywołanie) */
    
    #define F_CPU 1000000
    //#include <avr/eeprom.h>
    #include <avr/io.h>
    #include <util/delay.h>           
    
    int czas = 0;
    int czas3 = 0;
    int czas2 = 0;
    int access1 = 0;
    int access2 = 0;
    int access3 = 0;
    int access4 = 0;
    
    int main (void)
    {
    	DDRB |= _BV(3);
    	
    	while (1)
    	{
    		if ((access1 = 1) || (access2 = 1) || (access3 = 1) || (access4 = 1))
    		{
    			_delay_us(1);
    			czas2 = czas2+1;
    			if (czas2 > 10000000)
    			{
    				access1 = 0;
    				access2 = 0;
    				access3 = 0;
    				access4 = 0;
    			}
    		}
    		if (!(bit_is_clear(PINB,4)))
    		{
    			if (access1 == 0)
    			{
    				goto access1;
    			}
    			if (access2 == 0)
    			{
    				goto access2;
    			}
    			if (access3 == 0)
    			{
    				goto access3;
    			}
    			if (access4 == 0)
    			{
    				goto access4;
    			}
    			goto dalej;
    			access1:
    			while (!(bit_is_clear(PINB,4)))
    			{
    				_delay_ms(1);
    				czas3 = czas3+1;
    			}
    			if ((czas3 > 500) & (czas3 < 1500))
    			{
    				access1 = 1;	
    			}
    			else
    			{
    				access1 = 0;
    				access2 = 0;
    				access3 = 0;
    				access4 = 0;
    			}
    			czas3 = 0;
    			goto dalej;
    			access2:
    			while (!(bit_is_clear(PINB,4)))
    			{
    				_delay_ms(1);
    				czas3 = czas3+1;
    			}
    			if ((czas3 > 30) & (czas3 < 500))
    			{
    				access2 = 1;	
    			}
    			else
    			{
    				access1 = 0;
    				access2 = 0;
    				access3 = 0;
    				access4 = 0;
    			}
    			czas3 = 0;
    			goto dalej;
    			access3:
    			while (!(bit_is_clear(PINB,4)))
    			{
    				_delay_ms(1);
    				czas3 = czas3+1;
    			}
    			if ((czas3 > 30) & (czas3 < 500))
    			{
    				access3 = 1;	
    			}
    			else
    			{
    				access1 = 0;
    				access2 = 0;
    				access3 = 0;
    				access4 = 0;
    			}
    			czas3 = 0;
    			goto dalej;
    			access4:
    			while (!(bit_is_clear(PINB,4)))
    			{
    				_delay_ms(1);
    				czas3 = czas3+1;
    			}
    			if ((czas3 > 500) & (czas3 < 1500))
    			{
    				access4 = 1;
    			}
    			else
    			{
    				access1 = 0;
    				access2 = 0;
    				access3 = 0;
    				access4 = 0;
    			}
    			czas3 = 0;
    			goto dalej;
    		}
    		dalej:
    		if ((access1 == 1) & (access2 == 1) & (access3 == 1) & (access4 == 1))
    		{
    			access1 = 0;
    			access2 = 0;
    			access3 = 0;
    			access4 = 0;
    			czas = 0;
    			czas2 = 0;
    			PORTB |= _BV(3);
    			_delay_ms(3000);
    			PORTB = 0x00;
    		}
    	}
    }


    Zadaniem mikrokontrolera miało być dawanie prądu przez 3 sek. (na PB3) jeśli przed tym na pinie PB4 pojawił się prąd w takim czasie:
    1. 500 - 1500 ms
    <-przerwa->
    2. 30 - 500 ms
    <-przerwa->
    3. 30 - 500 ms
    <-przerwa->
    4. 500 - 1500 ms

    Problem w tym, że mikrokontroler daje już prąd gdy dam:
    2. 30 - 500 ms
    <-przerwa->
    3. 30 - 500 ms
    <-przerwa->
    4. 500 - 1500 ms
    Tak jakby jedynki nie było...

    Dlaczego?

    Proszę o pomoc,
    Pozdrawiam,
    Defozo
  • REKLAMA
  • Pomocny post
    #2 7530704
    pidorek
    Poziom 15  
    if ((access1 = 1) || (access2 = 1) || (access3 = 1) || (access4 = 1))

    pierwszy if, popularny błąd zmień na ==
    dalej nie przeglądałem
  • REKLAMA
  • #3 7531675
    chrupex
    Poziom 11  
    Ta... tak zmień tak jak pisze pidorek. Poza tym dam Ci jeszcze jedna radę. Zrezygnuj z instrukcji goto. Na początku moze wydawac sie fajna, ale prawda jest taka ze bardzo pomniejsza czytelnosc kodu, wiec jak zaczna sie wieksze projekty to sie mozesz pogubic.

    Pozdro!

    PS. To nie jest tylko moja opinia. W kazdym podreczniku do programowania w C/C++ radzą zrezygnować z goto :)
  • REKLAMA
  • #4 7532076
    Defozo
    Poziom 17  
    @pidorek
    Wielkie dzięki, nie zauważyłem...

    @chrupex
    Tak, wiem... goto będę używał tylko jak to konieczne.

    @Edit
    Dodałem jeszcze:

    tam gdzie sprawdza te wszystkie accessy, bo tak to działało tylko za pierwszym razem.

    Dzięki!
    Pozdrawiam,
    Defozo
  • REKLAMA
  • #5 7532283
    Rariusz
    Specjalista Automatyk
    Witam

    W ramach możliwości proponuje podzielić program na funkcję w celu poprawy czytelności.
    Można zamiast PORTB wprowadzić marko.
    Np: PORT_WEJ_WYJ PORTB

    Pozdrawiam
  • #6 9378490
    Defozo
    Poziom 17  
    Ostateczny, sprawdzony i działający kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziękuję za odpowiedzi,
    pozdrawiam,
    Defozo.
REKLAMA