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.

atmega8[c] - Diody nie działaja jak trzeba

hans880 23 Kwi 2013 20:19 783 2
  • #1 23 Kwi 2013 20:19
    hans880
    Poziom 6  

    Witam. Niedawno zaczolem przygode z mikrokontrolerami i napotkalem pewien problem. Układ ma zapalac z przycisku wszystkie 4 diody na raz , po nacisnieciu tego samego przycisku powinnien gasic te diody. Zapala natomiast diode 1, 2 ,3 a wygasza 4 i odwrotnie. Wklejam kod:

    #include <avr/io.h>
    #include <util/delay.h>




    #define LED_1 (1<<PB1) //podlaczenie diody1
    #define LED_2 (1<<PB2) //podlaczenie diody2
    #define LED_3 (1<<PB3) //podlaczenie diody3
    #define LED_4 (1<<PB4) //podlaczenie diody4

    #define KEY_PIN1 (1<<PB0) //podłaczenie klawisza1
    #define KEY_PIN2 (1<<PC5) //podlaczenie klawisza2
    #define KEY_DOWN1 !(PINB & KEY_PIN1) //sprawdzenie stanu klawisza1
    #define KEY_DOWN2 !(PINC & KEY_PIN2) //sprawdzenie stanu klawisza2

    #define LED_TOG1 PORTB ^=LED_1 //zmiana stanu dioda1
    #define LED_TOG2 PORTB ^=LED_2 //zmiana stanu dioda2
    #define LED_TOG3 PORTB ^=LED_3 //zmiana stanu dioda3
    #define LED_TOG4 PORTB ^=LED_4 //zmiana stanu dioda4

    int main(void){

    DDRB |= LED_1; //PB1 wyjsciowy
    PORTB = LED_1; //wyl led1
    DDRB |= LED_2; //PB2 wyjsciowy
    PORTB = LED_2; //wyl led2
    DDRB |= LED_3; //PB3 wyjsciowy
    PORTB = LED_3; //wyl led3
    DDRB |= LED_4; //PB4 wyjsciowy
    PORTB = LED_4; //wyl led4

    DDRB &=~ KEY_PIN1; //kierunek pinu wejsciowy
    PORTB |= KEY_PIN1; //stan wysoki na pinie

    DDRC &=~ KEY_PIN2; //kierunek pinu wejsciowy
    PORTC |= KEY_PIN2; //stan wysoki na pinie

    while(1)
    {

    if(KEY_DOWN1) //jesli klawisz wcisniety
    {
    _delay_ms(80);
    if(KEY_DOWN1) //klawisz nadal wcisniety
    {
    LED_TOG1;
    LED_TOG2;
    LED_TOG3;
    LED_TOG4;
    _delay_ms(200);

    }


    }
    }
    }



    Prosze nie sugerowac sie faktem ze jest tam w makrodefinicjach opisany przycisk drugi bo bedzie mi on dalej potrzebny. Z racji tego ze sie ucze prosze o jakies konstruktywne podpowiedzi

    0 2
  • #2 23 Kwi 2013 20:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Problem leży w tej części kodu:


    Kod: c
    Zaloguj się, aby zobaczyć kod


    a konkretnie w ustawianiu PORTB - pomyśl troszkę, co jest na końcu tego fragmentu w rejestrze PORTB, a co chciałeś by było.

    Kod umieszczaj w znacznikach SYNTAX.
    Ode mnie 20 pkt bo masz ledwo 6, a mogą się przydać skoro zaczynasz :)

    0
  • #3 23 Kwi 2013 20:56
    hans880
    Poziom 6  

    Trochu mi głupio o to pytac bo myslałem ze zrozumiałem ale jednak nie zrozumiałem.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    taka byla podstawowa wersja, zmienilem na
    Kod: c
    Zaloguj się, aby zobaczyć kod

    i działa tak jak chcialem ale nie rozumiem dlaczego. Przeciez np (1<<PB0) ustawia stan wysoki na porcie PB0. To dlaczego działa to do portow pb1, pb2, pb3, a dla portu pb4 musze dodawac juz operator.

    0