caporeira Napisano Grudzień 25, 2009 Udostępnij Napisano Grudzień 25, 2009 Witam , jestem początkującym elektronikiem jak i programistą dlatego proszę o wyrozumiałość. Schemat elektroniczny już mi ktoś sprawdził i powinien być dobrze ale w skrócie to chcę sterować za pomocą Atmegi8 poprzez układ L293 silnikiem krokowym dwufazowym bipolarnym. Tyle udało mi się napisać i nie wiem co zrobić dalej (proszę o rady,wskazanie błędów), co teraz zrobić aby to zadziałało i proszę o wyrozumiałość (pisząc program wzorowałem się na jednym z kursów ale nie wszystko tam było) Pisane w języku C /* sterowanie silnikiem bipolarnym "krokowy.c" */ /* 2 przyciski przyłączone do portu D(PD0,PD1); 4 zaciski silnika do portu C(PC5,PC4,PC3,PC2); 4 diody led do portu B (PB0,PB1,PB2,PB3) */ /* ATmega 1MHz */ #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> int main(void) { /* 4 linie portu C będą wyjściami na L293NE (PC2,PC3,PC4,PC5) */ DDRC = 0x3C; /* 0x3C binarnie 000111100 */ /* 2 linie portu D będą wejściami z podciągnięciem do VCC (PD0,PD1) */ DDRD = 0xFC; /*11111100*/ PORTD = 0x03; /*00000011*/ /* 4 linie portu B będą wyjściami na diody led (PB0,PB1,PB2,PB3)*/ DDRB = 0x0F; /*00001111*/ PORTB = 0x0F; /*00001111*/ /* Początek nieskończonej pętli */ for(;;) { /* Przepisanie zawartości PIND do PORTC */ PORTC = PIND; /* Przepisanie zawartości PIND do PORTB */ PORTB = PIND; /* Początek nieskończonej pętli */ while(1) { /* Jeśli pierwszy przycisk wciśnięty */ if(!(PIND & 0x01)) PORTC = 0x14; /*00010100;(PC4,PC2); I krok*/ if(!(PIND & 0x01)) PORTB = 0x01; /*00000001;(PB0) pierwsza dioda led świeci*/ _delay_ms(200); if(!(PIND & 0x01)) PORTC = 0x18; /*00011000;(PC4,PC3); II krok*/ if(!(PIND & 0x01)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/ _delay_ms(200); if(!(PIND & 0x01)) PORTC = 0x28; /*00101000;(PC5,PC3);III krok*/ if(!(PIND & 0x01)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/ _delay_ms(200); if(!(PIND & 0x01)) PORTC = 0x24; /*00100100;(PC5,PC2); IV krok*/ if(!(PIND & 0x01)) PORTB = 0x08; /*00001000;(PB3) czwarta dioda led świeci*/ _delay_ms(200); /* Jeśli drugi przycisk wciśnięty */ if(!(PIND & 0x02)) PORTC = 0x24; /*IV krok*/ if(!(PIND & 0x02)) PORTB = 0x08; /*00001000;(PB3) czwarta dioda led świeci*/ _delay_ms(200); if(!(PIND & 0x02)) PORTC = 0x28; /*III krok*/ if(!(PIND & 0x02)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/ _delay_ms(200); if(!(PIND & 0x02)) PORTC = 0x18; /*II krok*/ if(!(PIND & 0x02)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/ _delay_ms(200); if(!(PIND & 0x02)) PORTC = 0x14; /*I krok*/ if(!(PIND & 0x02)) PORTB = 0x01; /*00000001;(PB0) pierwsza dioda led świeci*/ _delay_ms(200); } } } Program się kompiluje ale czy ma prawo działać ? Nie jestem pewny czy dobrze zrobiłem te pentle ? Wyskakiwało mi ostrzeżenie : warning: "F_CPU" redefined Cytuj Link do komentarza Share on other sites More sharing options...
Kenji Grudzień 25, 2009 Udostępnij Grudzień 25, 2009 Zastanawiają mnie dwie rzeczy... Mianowicie po pierwsze stylistyka twojego kodu trochę boli i przy większych programach sam się zgubisz i myślał będziesz co się gdzie zaczyna, a co gdzie kończy... Po drugie po co w pętli nieskończonej robisz kolejną pętlę nieskończoną? (mam na myśli for(;😉 a potem while(1)). Co do pętli nieskończonych to staraj się ich unikać. daj sobie zmienną np. Włączony albo coś takiego, i jak ona się zmieni to żeby program się wyłączył a, nie brutalnie odcinać mu zasilanie jak to się zazwyczaj stosuje 😉 Co do ostrzeżenia to kompilator mówi ci, że masz już wcześniej zdefiniowaną zmienną "F_CPU", a definiujesz ją ponownie. O ile się nie mylę nic się nie powinno dziać, ale pewnie jest jakiś "ładniejszy" sposób na zrobienie tego. Cytuj Link do komentarza Share on other sites More sharing options...
swierkdeck Grudzień 25, 2009 Udostępnij Grudzień 25, 2009 No jest, wtedy w makefile nie ustawiamy F_CPU Cytuj Link do komentarza Share on other sites More sharing options...
caporeira Grudzień 27, 2009 Autor tematu Udostępnij Grudzień 27, 2009 Dziękuje za uwagi. W związku z tym dodałem dwie linijki kodu po IV krokach: if(!(PIND & 0x00)) PORTC = 0x00 /*Po zwolnieniu przyciku silnik się zatrzymuje*/ Skasowałem wpis : /* Początek nieskończonej pętli */ for(;;) /* Przepisanie zawartości PIND do PORTC */ PORTC = PIND; /* Przepisanie zawartości PIND do PORTB */ PORTB = PIND; Co do przypisania zmiennej to chodzi o to i czy to poprawne ? : przycisk1 =(!(PIND & 0x01)) PORTC dioda11 = (!(PIND & 0x01)) PORTB przycisk2 = (!(PIND & 0x02)) PORTC dioda21 = (!(PIND & 0x02)) PORTB Nie mam w tej chwili możliwości zaprogramować uC (kłopoty z programatorem) tym samym sprawdzenia działania programu - chciałem zapytać czy dobrze po przypisywałem porty wejścia,wejścia z przyłączeniem do Vcc, wyjścia i czy silnik ma prawo się kręcić ? Czy te "if" dobrze napisałem i faktycznie będą wykonywane kroki silnika w odstępach czasu 200 ms ? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!