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

Zbocze narastające - niewłaściwe działanie zbocza narastającego

kamil94goldman 11 Sty 2017 20:40 945 3
REKLAMA
  • #1 16192229
    kamil94goldman
    Poziom 3  
    Posty: 261
    Pomógł: 5
    Ocena: 3
    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

    }
    }

    }
    }
    Załączniki:
    • Zbocze narastające - niewłaściwe działanie zbocza narastającego schemat.png (43.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 16192457
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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.
  • REKLAMA
  • #3 16192513
    kamil94goldman
    Poziom 3  
    Posty: 261
    Pomógł: 5
    Ocena: 3
    A czy bez używania przerwań zewnętrznych int0 i int1 można napisac program aby działał na zbocze narastające ?
  • #4 16192537
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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.
REKLAMA