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
}
}
}
}
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
}
}
}
}