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



Teraz jest 11 gru 2024, o 09:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 7 sty 2012, o 23:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

Witam wszystkich
Myślałem, że udało mi się to w miarę pojąć, jednak okazało się, że nie za bardzo. Dlatego też proszę o wskazówkę, co jest nie tak w moim programie:

Otóż założenie jest takie, że program ma zapalić tę samą diodę D5 trzykrotnie, ale ma to zrobić przy użyciu pętli FOR (z pętlą while sobie poradziłem). Napisałem taki kod:

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


No i za diabła nie mogę zrozumieć, czego tu brakuje? Program po jednorazowym zapaleniu diody "milknie" że tak powiem.
Podejrzewam, że problem jest banalny, ale siedzę już godzinę nad tym, i nie rozumiem.
Proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 00:04 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Ok, posłuchaj - pierwsza rzecz. Generalnie program jest poprawnie napisany. Aczkolwiek nie masz w nim nieskończonej pętli głównej - więc fakt, że dioda mignie trzy razy i przestaje reagować cały układ aż do resetu nie powinien cię dziwić. Po prostu po zakończeniu pętli for() program kończy swoje działanie i pozostaje w bezczynności.

Dziwne jest tylko to, że piszesz iż dioda mignie tylko jeden raz. Bo oczywiście powinna mignąć sobie 3 razy. Ale może spróbuj to tak napisać:

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


Może coś źle podłączyłeś ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 00:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

Teraz dział jak miało działać. Pomogło chyba wyprowadzenie definicji zmiennej "i" poza pętlę while, chyba. No bo nic innego nie przychodzi mi do głowy. Oczywiście usunąłem opóźnienie 2 s i teraz dioda "śmiga" jak trzeba.

Tylko czemu w pierwszej wersji nie działało? Przecież zmienna i byłą zdefiniowana prawidłowo, prawda?


Edit:
Po usunięciu nieskończonej pętli while układ także przestaje działać jak zakładałem, czyli dioda mignie tylko jeden raz i koniec, zamiast trzech razy. A przyczyną jak się okazało był średnik po pętli for :?



Ostatnio edytowano 8 sty 2012, o 00:32 przez worner, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 00:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No właśnie chciałem to sprawdzić, dlatego wciągnąłem definicję zmiennej przed pętlę. Byłem ciekaw, czy przestawiłeś w opcjach kompilatora odpowiednią rzecz, żeby można było w ten sposób definiować zmienne bezpośrednio w pętli ??? Bo bez tej zmiany powinno ci się co najmniej ostrzeżenie (WARNING) pokazywać. Ja osobiście jednak zawsze definiuję zmienne iteracyjne czyli takie np i ..... przed pętlą, tym bardziej, że może się ona przydać także czasem w dalszym rozwoju programu w dalszej jego części poza pętlą. A przy definicji w nawiasach pętli for() już byłoby to niemożliwe.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 00:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

Od dziś także będę w ten sposób definiował zmienne iteracyjne. Chyba jest to bardziej przejrzyste.

Dziękuję za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 00:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

ach - nie zauważyłem tego średnika ;) rzeczywiście - pętla wykonała się trzy razy nic nie robiąc a w zasadzie to kompilator wyrżnął jej kod w asemblerze a potem grzecznie wykonał jednokrotnie blok kodu w nawiasach klamrowych.

No dla mnie też bardziej przejrzyście jest definiować takie zmienne przed pętlą. Jednak jak coś - to nie jest błędem żeby definiować je wewnątrz.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 19:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

Dzisiaj znowu pojawił się problem, tym razem w innym wydaniu, a chyba dotyczącym pętli while.

Napisałem taki oto program, który według założeń powinien wykonywać się w poętli nieskończonej. Tymczasem wykonuje się jeden raz i stoi.
Kod:

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


No i cuduję we wszystkie strony i nie mogę sobie poradzić. Zmieniałem już wartość zmiennej i w pierwszej pętli i oczywiście wstawiałem operator porównania <= 7, definicję zmiennej wstawiałem do pętli while i nic to nie pomaga.
Nie jestem pewien, czy może to mieć związek z ustawieniami samego Eclipse, bo wczoraj coś grzebałem, a dzisiaj już nie potrafię przypomnieć sobie, co zmieniłem, a czego nie ruszałem.
Proszę o wskazówki, bo ręce już załamuję. :cry:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 20:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Kod:
                    for(i=8;i>0;i--)                        //pętla gasząca diody
                    {
                       a = i;
                       --a;
                            PORTC |= (1<<a);
                            _delay_ms (100);
                    }


tak działa lub tak:

Kod:
                    for(i=7;i>0;i--)                        //pętla gasząca diody
                    {
                            PORTC |= (1<<i);
                            _delay_ms (100);
                    }



czemu nie działa z operatorem " >= " to już nie wiem :(


PS

Dobra już wiem! Najwyraźniej chodzi o tym 'unsigned int'. Mam wrażenie że pętla for po dojechaniu do Zera ustawia tak jak by -1 i wtedy zmienna się psuje. Tak też gdy zdeklarujesz zmienną 'i' jako po prostu 'int' wszystko powinno hulać

Kod:
            int8_t i;

lub

Kod:
            int i;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 20:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

No ale dlaczego miałbym definiować (nie deklarować) zmienną "i" jako liczbę dwubajtową, jeszcze w dodatku ze znakiem. To chyba nie o to chodzi. Zainstalowałem sobie teraz Eclipsa Indigo i spróbuję na innej platformie wrzucić ten program do procka.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 21:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 gru 2011
Posty: 110
Lokalizacja: Dolnyśląsk
Pomógł: 0

Podałem też pętle która działa bez zmiany zmiennej na 'int' lub 'int8_t'

Kod:
                    for(i=8;i>0;i--)                        //pętla gasząca diody
                    {
                       a = i;
                       --a;
                            PORTC |= (1<<a);
                            _delay_ms (100);
                    }



Albo zmieniamy typ zmiennej i nic więcej ruszać nie trzeba.

Kod:
       int8_t i;


to zmienna jedno bajtowa... tak ? tyle że ze znakiem. Czemu ? Bo bez nie działa. Proste.
Z resztą pan Mirek pewnie wszystko rozwieje niebawem :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2012, o 22:20 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Zastanów się jak to działa, zamiast załamywać ręce albo sięgać po debuger.

jeśli masz tak jak miałeś czyli:

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


to pomyśl sobie co się stanie gdy w drugiej pętli zmienna i będzie już = 0 ???? Przecież to trzeba sobie rozpatrzeć - nie wyobrażam sobie, a szczególnie gdy program nie działa tak jak bym chciał - żebym nie rozpatrywał w najmniejszych drobiazgach jak działa program - bo jest tylko jedna możliwość. Nie żadna zła konfiguracja Eclipse czy inne kosmiczne powody, po prostu ja coś źle robię.

A zatem jeśli w kolejnym przebiegu pętli zmienna i będzie już = 0, to co ? zostanie ona w związku z warunkiem (i>=0) zmniejszona o 1 prawda ??? pomyślałeś o tym ? W takim razie ile wyniesie wynik działania 0-1 jeśli działamy na liczbie bez znaku (wszak zdefiniowałeś zmienną i jako uint8_t) ????? Myślę, że zgodzisz się ze mną, że i będzie równe 255 i to chyba nie jest dziwne tak ? Warunek pętli mówi, że będzie ona wykonywana do momentu większe lub równe 0, więc gdy po tym obiegu i będzie równe 255 no to nadal warunek jest spełniony i w związku z tym taka pętla jak sobie teraz uświadamiasz - zaczyna działać bez końca .... wciąż gasząc twoje diody LED - PRAWDA ???

Jak temu zaradzić? Jest na to 1000 sposobów. Jeden taki na szybko przychodzi mi do głowy aby tę drugą pętlę zapisać tak:


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


Czyli iteracja działa w identyczny sposób jak w pierwszej pętli a my się tylko posługujemy prostym działaniem matematycznym odwracającym (7-i) .... widzisz to ? Spróbuj sobie to przeanalizować.

Ale też można oczywiście nie zmieniać sposobu iteracji tylko zmienić typ zmiennej jak radził kolega wyżej z uint8_t na int8_t (czyli nadal zmienna 8-bitowa ale będzie zawierała liczby dodatnie i ujemne z zakresu -128 do +127. Spokojnie nam to wystarczy gdyż zmienna zmienia się tylko w zakresie od 0 do 7 prawda ?

wtedy gdy przed pętlą główną zmienisz definicję na int8_t i; możesz napisać tę drugą pętlę np tak:

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


ale zauważ, że zmieniłem lekko warunek w pętli z (i>=0) na (i>0) - bo teraz gdy zmienna i dojdzie do wartości ZERO i nastąpi jej zmniejszenie o JEDEN to jaką przyjmie wartość ? przecież już nie 255 tylko -1 .... a -1 jest mniejsze od zera więc warunek spowoduje że pętla się zakończy.

Można byłoby jeszcze powoływać dodatkowe zmienne jak pisał kolega wyżej albo jeszcze coś - no jak pisałem wyżej - sposobów jest milion - tylko trzeba zawsze analizować do bólu własny kod. A nawet będzie lepiej jeśli analiza tak prostych kodów zacznie wychodzić bez korzystania z DEBUGERA - bo sam chyba zdajesz sobie sprawę jak szybko wpłynie to na podniesienie twojej praktyki programowania.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2012, o 09:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

No tak, muszę przyznać, że nie pomyślałem o zmianie sposobu definiowania zmiennej "i", nawet jak kolega DidekxD mnie nakierował. Ba, co tu dużo gadać, wręcz zaprotestowałem! Nie wpadłem na to, że "i" może przyjąć wartość ujemną. A pewnie wynika to z niezrozumienia działania pętli FOR.

No cóż panowie, dziękuję za pomoc. Sprawdzę wszystko jeszcze raz po powrocie z pracy.
Zapewne jeszcze nie raz będę sięgał po debuger. Najlepszy debuger, a nazywający się FORUM Atnel.pl :D

Po wprowadzeniu poprawek zgodnie z sugestiami kolegów programik zaczął działać zgodnie z oczekiwaniami. Mogłem go wreszcie dokończyć i teraz wygląda tak, jak poniżej. Oczywiście nic szczególnego, ale od czegoś trzeba zacząć. Jeszcze raz dziękuję za pomoc "debugerom" ;)

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 lut 2012, o 23:16 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

Nie chciałem tworzyć nowego tematu, dlatego napiszę tutaj. Otóż mam taki problem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dioda powinna się zapalić 3 razy i koniec (tak myślę), a ona miga cał czas. Kombinowałem z pętlą while , for oraz z miejscem deklaracji zmiennej i. W którym miejscu robię błąd?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 23:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

według mnie pętla 'for' jest wewnątrz nieskończonej pętli 'while' i stąd ten problem...

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2012, o 23:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 gru 2011
Posty: 449
Pomógł: 4

No i bardzo dobrze, że dioda miga cały czas. Taki program kolega napisał, żeby migała cały czas. A "sprawcą" tego migania cały czas jest pętla nieskończona while.

Dioda mignie trzy razy, po czym program zacznie działanie od nowa.

Żeby się o tym przekonać proponuję w linijce 26 wstawić wartość opóźnienia 3000.
Wtedy kolega zobaczy na żywo działanie swojego programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 00:53 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

worner napisał(a):
Żeby się o tym przekonać proponuję w linijce 26 wstawić wartość opóźnienia 3000.
Wtedy kolega zobaczy na żywo działanie swojego programu.


ja tylko dodam, że to bardzo cenna uwaga bo wskazuje także jak coś sobie sprawdzać, testować .... warto więc z niej skorzystać.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 14:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

Klucha napisał(a):
.....Kombinowałem z pętlą while , for oraz z miejscem deklaracji zmiennej i. W którym miejscu robię błąd?


to chyba jeszcze nie było takiej kombinacji żeby while przenieść na koniec programu i zająć procesor 'nic nie robieniem' gdy już skończy migać np:


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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 14:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Sonix napisał(a):
Klucha napisał(a):
.....Kombinowałem z pętlą while , for oraz z miejscem deklaracji zmiennej i. W którym miejscu robię błąd?


to chyba jeszcze nie było takiej kombinacji żeby while przenieść na koniec programu i zająć procesor 'nic nie robieniem' gdy już skończy migać np:


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


Tak tylko jak już to można się obejść bez tego nop ;) - po prostu tak - wyjdzie na dokładnie to samo:

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


albo i tak:

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 15:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 paź 2011
Posty: 307
Lokalizacja: Lbt
Pomógł: 8

Sonix napisał(a):
to chyba jeszcze nie było takiej kombinacji żeby while przenieść na koniec programu i zająć procesor 'nic nie robieniem' gdy już skończy migać np:



Albo wstawić drugie while(1) po pętli for.

_________________
Ujemna delta to dopiero początek zabawy...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2012, o 15:07 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No to autor pytania dostał teraz mnóstwo pomysłów więc niech wypróbuje i da znać jak poszło ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2012, o 19:24 
Offline
Nowy

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

Można uzyskać ten efekt z diodą która zapala się trzy razy również w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przy okazji jako nowy użytkownik forum chciałem pozdrowić kolegów. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2012, o 21:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Witamy witamy nowego użytkownika ciepło ;)

Ale przytoczony program mignie tylko 3 razy i się zakończy na śmierć - taki był twój cel ? Jeśli tak to OK, ale jeśli myślałeś że to się powtórzy to nie dobrze.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2012, o 21:40 
Offline
Nowy

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

Dzięki Mirku za powitanie. Taki był cel. Żeby dioda migała cały czas to należy zawrzeć tę instrukcję w pętli nieskończonej. Jestem początkujący jeżeli chodzi o język C i mikrokontrolery. Wszystko się jeszcze plącze, ale cały czas eksperymentuję i poszerzam wiedzę. Pozdrawiam



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: 23 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO