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

Początkujący z C dla AVR - kilka pytań.

marrog 20 Lis 2008 21:24 2968 7
REKLAMA
  • #1 5763626
    marrog
    Poziom 22  
    Witam serdecznie !!!

    Szukam dobrego kursu programowania w C dla AVR.
    Jakoś dużo łatwiej przychodzi mi BASCOM jednak musze coś napisać w C a nie bardzo wiem jak, tzn nie wiem co oznacza kilka linii:

    DDRB |= _BV(0)|_BV(1);
    PORTB |= _BV(0);
    PORTB &= ~_BV(1);
    DDRD &= ~_BV(0);
    PORTD |= _BV(0);

    Co oznaczają |= oraz co powoduje: PORTB &= ~_BV(1); a w szczególności &=~ ??

    Wiem, że to błachostka jednak nie potrafię nigdzie w sieci nic znaleźć na ten temat.
    -=pozdrawiam=-
  • REKLAMA
  • Pomocny post
    #2 5763663
    dawid512
    Poziom 32  
    Zapis typu:
     PORTB |=_BV(0);
    powoduje wystawienie stanu wysokiego na końcówkę 0 Portu B. Zaś zapis typu:
    PORTB &=~_BV(0);
    powoduje wystawienie stanu niskiego na końcówkę 0 Portu B. Czyli zapis typu |=_BV(x); powoduje ustawienie danego bitu zaś zapis &=~_BV(x); powoduje zresetowanie danego bitu. Odnośnie DDRX to 1 oznacza ustawianie jako wyjście zaś 0 jako wejście.
  • REKLAMA
  • #3 5763675
    marrog
    Poziom 22  
    No i juz troche jaśniej sie robi

    Wielkie dzięki :-)
  • REKLAMA
  • #4 5763679
    BoskiDialer
    Poziom 34  
    
        DDRB  |= _BV(0)|_BV(1); // ustawienie bitów 0 i 1 w DDRB
        PORTB |= _BV(0); // ustawienie bitu 0 w PORTB
        PORTB &= ~_BV(1); // skasowanie bitu 1 w PORTB
        DDRD  &= ~_BV(0); // skasowanie bitu 0 w DDRD
        PORTD |=  _BV(0); // ustawienie bitu 0 w PORTD
    

    w ogólności:
    x &= y; to iloczyn logiczny (x = x & y), co oznacza, ze w bit w x zostanie wyzerowany, gdy odpowiadający bit w y jest wyzerowany. Konstrukcja ~_BV(x) daje wartość, która tylko na bicie x jest równa zero, a więc konstrukcja x &=~ y; to skasowanie tych bitów x, które w y są ustawione.
  • REKLAMA
  • #5 5763833
    marrog
    Poziom 22  
    Witam

    Mając taki program jak niżej:
    
    int main(void)
    {
        DDRB  |= _BV(0)|_BV(1);
        PORTB |= _BV(0);
        PORTB &= ~_BV(1);
        DDRD  &= ~_BV(0);
        PORTD |=  _BV(0);
    
        unsigned char i,n;
    
        while (1) 
        {
            PORTB ^=_BV(0);
            PORTB ^=_BV(1);
            
            n = (PIND & _BV(0))? 100: 20; 
    
            for (i = 0; i < n; i++)
                         _delay_ms(10);
        }
        return 0;
    }
    

    nie bardzo rozumiem co tam jest napisane, tzn co ma byc robione, wiem już o co chodzi z tymi portami na początku, jednak po wejściu do petli while nie bardzo wiem co oznacza
    
            PORTB ^=_BV(0);
            PORTB ^=_BV(1);
            
            n = (PIND & _BV(0))? 100: 20;
    

    w szczególności
    
            n = (PIND & _BV(0))? 100: 20;
    


    pozdrawiam
  • #6 5764007
    Dr.Vee
    VIP Zasłużony dla elektroda
    Sugeruję zdobyć jakąś książkę do nauki języka C, inaczej zawsze będziesz kulał z pisaniem/rozumieniem. Język C nie jest aż tak skomplikowany, natomiast ma wiele aspektów które potrafią zaskoczyć nawet zaawansowanych programistów.

    Do rzeczy:
    ^ <- operacja XOR bitowego.
    x ? y : z <- wyrażenie, które ma wartość y jeśli x jest niezerowe (wartość "prawda"), oraz wartość z jeśli x ma wartość 0 (wartość "fałsz").

    Pozdrawiam,
    Dr.Vee
  • #7 5764140
    marrog
    Poziom 22  
    Witam

    Dzieki za odpowiedz, no zaczynam juz rozumiec - kiedys mialem stycznosc z ANSI C ale brak kontaktu i z glowy wylecialy najprostsze rzeczy :/

    A co oznacza jeszcze PIND , reszte juz bez problemu zlapalem. :-)
REKLAMA