Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Kategoria: Akumulatorki / Baterie / Ładowarki
  • #1 11 Sty 2017 20:40
    kamil94goldman
    Poziom 2  

    Witam, Zbudowałem układ sterowania szlabanem, z wykorzystaniem dwóch przycisków włącz/wyłącz, dwie krańcówki, silnik DC oraz dwie diody sygnalizujące prace silnika. W programie chciałem zrobic żeby silnik został wyłączany poprzez zbocze narastające gdy szlaban uderzy w krańcówkę, lecz niekiedy zdarza się że uderzając w krańcówkę silnik nie zostaje wyłączony a krańcówka została zwarta. Proszę o pomoc w wyjaśnieniu dlaczego tak się dzieje.

    W załączniku załączam schemat układu na poniżej program:

    #include <avr/io.h>
    #include <avr/delay.h>
    int main(void){


    DDRC = 0x30; //ustawienie partów pc4 i pc5 jako wyjścia "ledy" oraz portów od pc0 do pc3 jako wejścia "przyciski i krańcówki"
    PORTC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3);//podciągniecie przycisków i krańcówek do "1"
    DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2); //ustawienie portów do sterowania L293D jako wyjscia


    while(1){


    if((PINC & 0x08)) //uruchom silnik w góre przyciskiem góra gdy górna krańcówka nie jest wciśnięta
    {
    if(!(PINC & 0x01))
    {
    PORTC |= (1<<PC4); //sygnalizacja lampkami
    PORTC &= ~(1<<PC5);

    PORTD |= (1<<PD0); //obrot w góre
    PORTD |= (1<<PD2);
    PORTD &= ~(1<<PD1);
    }
    }

    if((PINC & 0x04)) //uruchom silnik w dół przyciskiem dół gdy dolna krańcówka nie jest wciśnięta
    {
    if(!(PINC & 0x02))
    {
    PORTC |= (1<<PC5); //sygnalizaja lampkami
    PORTC &= ~(1<<PC4);

    PORTD |= (1<<PD0); //obrot w dół
    PORTD |= (1<<PD1);
    PORTD &= ~(1<<PD2);
    }
    }

    if((PINC & 0x04)) //dolna krańcówka wyłącza silnik zboczem narastającym
    {

    if(!(PINC & 0x04))
    {

    PORTC &= ~(1<<PC4); //wylaczenie lampek
    PORTC &= ~(1<<PC5);

    PORTD &= ~(1<<PD0); //zatrzymanie silnika

    }
    }

    if((PINC & 0x08)) //górna krańcówka wyłącza silnik zboczem narastającym
    {

    if(!(PINC & 0x08))
    {

    PORTC &= ~(1<<PC4); //wylaczenie lampek
    PORTC &= ~(1<<PC5);

    PORTD &= ~(1<<PD0); //zatrzymanie silnika

    }
    }

    }
    }

    (11 Sty 2017 22:00) Polecenie moderatora: dondu

    Wklejając kod programu używaj proszę znacznika SYNTAX. Składnia jest wtedy kolorowana i łatwo kod analizować, a dodatkowo posty są krótkie. Instrukcja: http://www.elektroda.pl/rtvforum/viewtopic.php?p=14652518#14652518

  • #2 11 Sty 2017 21:37
    BlueDraco
    Specjalista - Mikrokontrolery

    To co masz napisane w kodzie, to:

    "jeśli dolna krańcówka jest wciśnięta i równocześnie nie jest wciśnięta - wyłącz silnik"

    oraz
    "jeśli górna krańcówka jest wciśnięta i równocześnie nie jest wciśnięta - wyłącz silnik"

    Równoczesne spełnienie dwóch sprzecznych warunków nie zdarza się często.

  • #3 11 Sty 2017 21:55
    kamil94goldman
    Poziom 2  

    A czy bez używania przerwań zewnętrznych int0 i int1 można napisac program aby działał na zbocze narastające ?

  • #4 11 Sty 2017 22:02
    BlueDraco
    Specjalista - Mikrokontrolery

    Tak - użyj przerwania timera zaprogramowanego np na 100 Hz. Z przerwaniami od portów nie zadziała z powodu, który klarujemy tu co tydzień lub częściej.

  Szukaj w 4mln produktów
Przeglądaj produkty