Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 20 kwi 2024, o 02:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 20 wrz 2012, o 13:53 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Po uruchomieniu diody i wyświetlacza LCD poprzez ATB-ETH i TCP/IP przyszedł czas na silnik krokowy bipolarny.
Najpierw korzystając z biblioteki z książki pobawiłem się krokowcem, sprawdziłem ile ma kroków na pełny obrót, pokręciłem w prawo, lewo itp.
Przyszedł czas na dopisanie jego obsługi do mojej stronki www. Tak jak pisałem w poprzednim poście na temat eth+lcd mam zrobiony formularz w którym tym razem podaje się ilość kroków do urla, póki co ograniczyłem się do kręcenia w jedną stronę żeby zbytnio nie komplikować kodu. I teraz tak:
Warunek if:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ładnie nadaje zmiennej step_cmd wartość "6" następnie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zczytuje ile kroków na osi x "ox" silnik ma wykonać, nadając zmiennej step_x zadaną wartość co sprawdzam wyświetlając sobie na LCD.
Następnie w/w pętla for powinna wykonać zadaną ilość kroków w lewo ale niestety silnik robi 1 krok i w układzie pojawia się zwarcie gdyż przygasa podświetlenie LCD a silniczka nie da się przekręcić palcami w żadną stronę.
Oczywiście mam ustawiony timer dla silnika:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Włączenie przerwań sei(); jest oczywiście w funkcji main().

Oraz obsługę przerwania:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Proszę o podpowiedź gdzie popełniam błąd bo już skończyły mi się pomysły.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2012, o 14:25 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Poniższy kod jest błędny. Pętla for wykona 1 krok dla ms2_flag=1 i natychmiast pozostałe kroki dla ms2_flag=0
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Spróbuj tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2012, o 14:51 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Niestety teraz silnik nawet nie drgnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2012, o 16:57 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Nie wiadomo czy step_left jest zainicjowana dlatego też należy dokonać jeszcze jednej modyfikacji w tym co napisałem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2012, o 10:55 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Teraz znów pojawia się zwarcie.
Poza tym wydaje mi się, że obsługa kroków nie może być w if'ie gdyż funkcja nie znajduje się w pętli głównej i po jednorazowym wykonaniu warunku przejdzie dalej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2012, o 17:23 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Napisałem sobie funkcję która wywołuje się w głównej pętli programu więc nie powinno być problemu z odczytem flagi przerwania:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zmienna step_x jest globalna.
Niestety znów pojawia się zwarcie.

Zakomentowałem całą zawartość while(1) i wrzuciłem tylko:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

I znów to samo, jak to możliwe skoro cały kod do obsługi silników jest skopiowany z projektu w którym przed wczoraj kręciłem silniczkami bez problemów:/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2012, o 13:40 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Zmienna ms2_flag jest globalna:
Kod:
volatile uint8_t ms2_flag;

Funkcja kroki_lewo(); jest wzięta z płyty dołączonej do książki i wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Funkcja odpowiadająca za kroki zadane z urla wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

I jest ona w pętli głównej while(1).

Inicjalizacja silnika i ustawienie dla niego timera jest w funkcji main():
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W pętli while(1) uruchomienie funkcji check_and_step następuje poprzez:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w/w kodu używam również do uruchomienia LCD oraz migania diodą (inna wartość cmd==x uruchamia np leda). Gdy do w/w if'a dodam linijkę wyświetlającą tekst na LCD to ten się pojawia więc na pewno program wchodzi do warunku. To samo gdy w funkcji check_and_step dopiszę wyświetlanie tekstu na LCD, więc sama funkcja tez jest uruchamiana.
No i obsługa przerwania:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2012, o 19:06 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Ale czy czasem do podtrzymywania pracy silnika nie musiałbyś ciągle wysyłać cmd = 6 ?
Myślę, że powinno to być w ten sposób, że raz wysyłasz komendę i potem o ile kolejna komenda nie dotyczy silnika to silnik działa dopóki nie wykona zadanej liczby obrotów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wtedy funkcja check_and_step() będzie wywoływana, aż do wykonania określonej liczby kroków. Natomiast wywołanie na końcu silnik_stop(); jest konieczne, bo inaczej masz jak ty to określasz "zwarcie". To nie zwarcie tylko zatrzymanie na ostatnim z kroków i zasilanie ciągle jest dołączone co objawia się unieruchomieniem wału silnika:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2012, o 17:38 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Silnik jest podłączony prawidłowo bo na drugiej atmedze mam program kręcący silniczkami i jak ją wpinam to wszystko hula.

Co do wywoływania komendy, wydaje mi się, że jeśli
Kod:
cmd=analyse_get_url((char *)&(buf[dat_p+4]));
jest w pętli while(1) to
Kod:
if (cmd==6){
                        check_and_step();
                }

Jest wywoływane aż do uzyskania kolejnej komendy albo nie spełnienia warunku z check_and_step.
Czy dobrze myślę?
Natomiast silnik robi tylko 1 krok a nie zadaną ilość i się blokuje.

Zakomentowanie całej zawartości while(1) i wrzucenie do niej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Powinno kręcić silniczkiem non stop a znów jest "zwarcie".
Cały projekt:
https://dl.dropbox.com/u/25250195/20_ET ... w_step.rar



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2012, o 19:35 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

mlekorlz napisał(a):
Zakomentowanie całej zawartości while(1) i wrzucenie do niej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Powinno kręcić silniczkiem non stop a znów jest "zwarcie".

Co prawda nie widziałem, aby wystąpił jakiś konflikt zasobów, ale powinieneś tymczasowo wyłączyć inicjalizację wszystkiego poza silnikiem i kolejno dołączać do kompilacji, a wtedy pewnie coś znajdziesz.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2012, o 16:10 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Witam,

Doszedłem do rozwiązania problemu więc opiszę dla ludzi którzy będą mieli podobny problem.

Cały problem tkwił w pętli while(1)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powyższy zapis idealnie nadaje się do wyświetlenia strony bądź zapalenia diody led gdyż dzieje się to tylko raz, natomiast silnik potrzebuje ciągłego "taktowania", powyższy zapis wydaje się w porządku ale prawie na początku pętli while(1) jest kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Który powoduje, że po wykonaniu requesta praktycznie cała część while(1) jest omijana, dopóki nie pojawi się nowy.
Dlatego mój silnik robił 1 krok i się zawieszał.
Wszelkie "ciągłe" sterowanie wystarczy dać powyżej w/w kodu i wszystko hula jak należy:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO