Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

Defozo 13 Sty 2010 16:36 2055 5
  • #1 13 Sty 2010 16:36
    Defozo
    Poziom 17  

    Witam, piszę w C (w Programmer's Notepad - WinAvr).
    Mam problem z kodem na mikrokontroler ATtiny13.

    Code:
    /* "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

    0 5
  • Pomocny post
    #2 13 Sty 2010 19:32
    pidorek
    Poziom 15  

    if ((access1 = 1) || (access2 = 1) || (access3 = 1) || (access4 = 1))

    pierwszy if, popularny błąd zmień na ==
    dalej nie przeglądałem

    0
  • #3 13 Sty 2010 21:37
    chrupex
    Poziom 10  

    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 :)

    0
  • #4 13 Sty 2010 22:29
    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:

    Code:
    czas3 = 0;

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

    Dzięki!
    Pozdrawiam,
    Defozo

    0
  • #5 13 Sty 2010 23:00
    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

    0
  • #6 09 Kwi 2011 12:13
    Defozo
    Poziom 17  

    Ostateczny, sprawdzony i działający kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dziękuję za odpowiedzi,
    pozdrawiam,
    Defozo.

    0