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

[Atmega162][C] Zmiana stanu LED

deviland 05 Paź 2008 17:57 1545 9
  • #1 5601898
    deviland
    Poziom 10  
    Witam,

    piszę sobie taki program: jeżeli na pin PA0 podam +5V to stan diody podpiętej do PC0 powinien się zmienić na przeciwny

    
    #include <avr/io.h>
    
    int main (void)
    {
    
       DDRA |= (0 << PA0);  // pin PA0 jako wejście
       
       DDRC |= (1 << PC0); // pin PC0 jako wyjście
       
       PORTC |= _BV(PC0);  // stan początkowy 1
       
       for (;;)
       
       {
       
       if (1 << PA0) PORTC &= ~_BV(PC0);
       else PORTC |= _BV(PC0);
    
    
       }
    } 
    


    ale coś nie bardzo chce działać ....
  • #3 5601921
    deviland
    Poziom 10  
    if (1 << PA0) mialo teoretycznie sprawdzac stan wejscia PA0, ale wlasnie podejrzewalem, ze moze nie dzialac tak jak chcialem. natomiast odpowiedzi za bardzo nie rozumiem
  • #4 5601973
    Balu
    Poziom 38  
    DDRA |= (0 << PA0); - to jest bez sensu
    if (1 << PA0) mialo teoretycznie sprawdzac stan wejscia PA0, - może u Ciebie, ale w C na pewno nie.
    Jak nie rozumiesz odpowiedzi, chyba warto zająć się C na PC na początek.

    Generalnie musisz zrobić WARUNEK a nie coś co jest pewne, -> kompilator warninga nie wyrzucił? Zapewne...

    if (PINA&(1<<PA0)) then coś
  • #5 5603404
    Dr.Vee
    VIP Zasłużony dla elektroda
    Balu, nie rozumiesz?
    DDRA |= (1 << PA0); /* ustaw bit PA0 */

    czyli przez analogię:
    DDRA |= (0 << PA0); /* wyzeruj bit PA0 */

    To takie proste... ;)

    A kompilator to takie coś, co bełkocze niezrozumiale i wypluwa plik hex. Skoro jest plik hex, to chyba wszystko gra, nie? ;)

    Pozdrawiam,
    Dr.Vee
  • #6 5604450
    Pijopic
    Poziom 17  
    Pomijajac to co uz koledzy wyluskali to jeszcze jedno co prawda nie jest to bledne ale mozna lepiej to zrobic

    if (1 << PA0) PORTC &= ~_BV(PC0);
    else...

    zastapic z uwzglednieniem popraek:

    if (PINA & (1<< PA0)) PORTC ^=_BV(PC0);
  • #7 5604484
    Freddie Chopin
    Specjalista - Mikrokontrolery
    to znow nie do konca jest dobre, bo jak bedziesz przycisk trzymal, to bedzie sie zmieniac stan bardzo szybko. problem mozna bardzo prosto rozwiazac - na koncu ifa dorzucic petle, ktora bedzie czekala na puszczenie przycisku.

    4\/3!!
  • #8 5604559
    BoskiDialer
    Poziom 34  
    Dr.Vee napisał:
    Balu, nie rozumiesz?
    DDRA |= (1 << PA0); /* ustaw bit PA0 */

    czyli przez analogię:
    DDRA |= (0 << PA0); /* wyzeruj bit PA0 */

    To takie proste... ;)
    Znaczy się Ty nie rozumiesz. DDRA |= x; ustawia w DDRA te bity, które w x są ustawione( | to suma logiczna). wyrażenie 0<<PA0 jest równe zero, żaden bit się nie zmienia, wyrażenie nie ma wpływu. Żeby bit skasować, należy posłużyć się iloczynem logicznym i negacją:
    DDRA &= ~(1 << PA0); /* wyzeruj bit PA0 */
    Podsumowując: za pomocą |= można co najwyżej ustawić bity, za pomocą &= można co najwyżej wyzerować bity.
  • #9 5605198
    Pijopic
    Poziom 17  
    Freddie to nie tylko jest dobre ale bardzo dobre, a co ktos z tym zrobi to jego sprawa, ja calego kodu za nikogo pisac nie mam zamiaru. A Dialer nie masz za grosz poczucia humoru skoro nie zrozumiales intencji wypowiedzi Dr.vee...
  • #10 5605240
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Pijopic napisał:
    Freddie to nie tylko jest dobre ale bardzo dobre, a co ktos z tym zrobi to jego sprawa, ja calego kodu za nikogo pisac nie mam zamiaru.

    agreed - wybiegam w przyszlosc uprzedzajac pytanie - 'zrobilem jak mi radziliscie i teraz mam stroboskop jak trzymam przycisk' <:

    Cytat:
    A Dialer nie masz za grosz poczucia humoru skoro nie zrozumiales intencji wypowiedzi Dr.vee...

    trV <:

    4\/3!!
REKLAMA