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



Teraz jest 31 lip 2026, o 09:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 23 maja 2014, o 20:09 
Offline
Nowy

Dołączył(a): 06 mar 2013
Posty: 8
Pomógł: 0

Mam taki problem: program działa ale trzeba trzymać przycisk gdy się go puści to program się zawiesza, gdy się go znowu przytrzyma to działa dalej od miejsca w którym się zawiesił. Wklejam kod może coś zaradzicie.

Kod:
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{

DDRD |= (1<<PD5);
DDRD |= (1<<PD6);
DDRD |= (1<<PD7);
DDRB &= ~(1<<PB1);
DDRB |= (1<<PB2);
DDRB |= (1<<PB0);

        while(1)
        {
           if( !(PINB & (1<<PB1)) )
           {
                PORTD ^= (1<<PD5);
                _delay_ms(3000);

                PORTD ^= (1<<PD6);
                _delay_ms(3000);

                PORTD ^= (1<<PD7);
                _delay_ms(3000);

                PORTB ^= (1<<PB0);

           }
            else PORTB |= (1<<PB2);
        }
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 20:21 
Offline
Moderator
Avatar użytkownika

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

Nie dziw się, piszesz program totalnie LINIOWO - w ten sposób nie będzie innych efektów niż ten który teraz obserwujesz....

Polecam ci poczytać dokładniej Bluebooka

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

a w nim rozdział o wstępie do systemów czasu rzeczywistego .... żeby zobaczyć co to są np timery programowe ... i jak łatwo z nimi zrealizować wiele zadań NIE LINIOWO ...

jeśli jednak na razie nie masz Bluebooka - to posil się chociaż taką (nieblokującą) obsługą klawiszy a już będzie lepiej

http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html

_________________
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 maja 2014, o 20:39 
Offline
Nowy

Dołączył(a): 06 mar 2013
Posty: 8
Pomógł: 0

Tą książkę mam ale chce się dowiedzieć co zrobiłem źle; mógł bym prosić o poprawienie kodu, chce mieć się na czym wzorować. PS założenie programu było że wystarczy raz przycisnąć przycisk i program ma dalej lecieć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 20:40 
Offline
Moderator
Avatar użytkownika

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

no ale spróbuj sam określić co to wg ciebie oznacza:

micex123x napisał(a):
i program ma dalej lecieć


bo jest to iście tajemnicze założenie, które na razie pewnie tylko ty rozumiesz .... A jak widzisz - żeby coś dobrze podpowiedzieć to najpierw trzeba wiedzieć o co chodzi autorowi pytania ...

_________________
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 maja 2014, o 20:47 
Offline
Nowy

Dołączył(a): 06 mar 2013
Posty: 8
Pomógł: 0

Chodzi o to że po naciśnięciu przycisku przez krótką chwile ma po kolei co 3 sekundy otwierać się następujące porty PD5 PD6 PD7 PB0

------------------------ [ Dodano po: 2 minutach ]



------------------------ [ Dodano po: 7 minutach ]

Pod PD5 PD6 PD7 mam podłączone diody a pod PB0 przekaźnik i diody mają się kolejno zapalać co 3 sekundy a na samym końcu ma zadziałać przekaźnik



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 21:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Podciągnij pin przycisku do VCC programowo lub sprzętowo (rezystorem)

programowo - przez wpisanie jedynki do PORTB |= (1<<PB1)
sprzętowo - rezystor między przycisk a pin uC do VCC (np. 10k )

bo teraz możesz mieć na pinie przycisku stany nieustalony w momencie
kiedy przycisk jest puszczony a powinien być tam stan wysoki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 21:13 
Offline
Nowy

Dołączył(a): 06 mar 2013
Posty: 8
Pomógł: 0

Dodałem rezystor 10k i nadal ten sam problem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 21:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Ja bym to zrobił tak, że kiedy nacisnę przycisk to zmienna flaga_przycisk zmieni wartość na 1, to wtedy wykonywał bym ten warunek, który ty napisałeś, lecz tak jak koledzy Ci podpowiadają - wykorzystaj timery programowe.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Czy mógłbyś dokładnie opisać działanie układu krok po kroku (najlepszy byłby filmik).

Nie wiem czy zwróciłeś uwagę ,że teraz nie zapalasz diod tylko je toglujesz (przełączasz od stanu 0 do 1 i od początku )
za przekaźnikiem też bym wstawił opóźnienie bo teraz to może nie zareagować na stan załączenia.

Co znaczy że program się zawiesza ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 21:59 
Offline
Moderator
Avatar użytkownika

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

micex123x napisał(a):
Chodzi o to że po naciśnięciu przycisku przez krótką chwile ma po kolei co 3 sekundy otwierać się następujące porty PD5 PD6 PD7 PB0


Mam nadzieję, że pisząc "otwierać" masz na myśli ... że "mają zmieniać swój stan na przeciwny" (jak się patrzy na twój kod programu) ...

ale to jeszcze długa droga przed tobą ... na razie twój program działa tak panie kochany:


jeśli klawisz na PB1 nie jest wciśnięty to ma być CAŁY CZAS ustawiony stan wysoki na PB2

jeśli zaś wciśniesz klawisz na PB1 to .... w trakcie gdy będzie on cały czas wciśnięty ... pętla główna będzie realizowała kolejne polecenia w warunku IF gdy jest TRUE, czyli

1. zmieni stan na przeciwny na PD5
2. będzie CZEKAĆ masakrycznie DŁUGI CZAS - bo ok 3 sekundy (NIC NIE ROBIĄC)

3. zmieni stan na przeciwny na PD6
4. będzie CZEKAĆ masakrycznie DŁUGI CZAS - bo ok 3 sekundy (NIC NIE ROBIĄC)

5. zmieni stan na przeciwny na PD7
6. będzie CZEKAĆ masakrycznie DŁUGI CZAS - bo ok 3 sekundy (NIC NIE ROBIĄC)

7. zmieni stan na przeciwny na PB2 i znowu wróci do pkt.1

_________________
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 maja 2014, o 22:07 
Offline
Nowy

Dołączył(a): 06 mar 2013
Posty: 8
Pomógł: 0

Cytuj:
jeśli klawisz na PB1 nie jest wciśnięty to ma być CAŁY CZAS ustawiony stan wysoki na PB2

jeśli zaś wciśniesz klawisz na PB1 to .... w trakcie gdy będzie on cały czas wciśnięty ... pętla główna będzie realizowała kolejne polecenia w warunku IF gdy jest TRUE, czyli


Właśnie chce to zmienić żeby program nie działał gdy przycisk będzie cały czas wciśnięty tylko go raz nacisnąć i pętla będzie realizowała kolejne polecenia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 22:10 
Offline
Moderator
Avatar użytkownika

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

micex123x napisał(a):
Właśnie chce to zmienić żeby program nie działał gdy przycisk będzie cały czas wciśnięty tylko go raz nacisnąć i pętla będzie realizowała kolejne polecenia.


No właśnie - czyli trzeba się pouczyć troszkę dalej tego programowania .... Już podpowiadałem ... i podałem ci link do nieblokujących funkcji obsługi klawiszy, kolega wyżej podpowiedział ci o fladze ....

ale ty zatrzymałeś się w miejscu - nie chcesz dalej iść .... i dlatego pewnie nawet nie rozumiesz o czym mowa - co to flaga itp ... więc jak ci pomóc ?

na prawdę warto poczytać i poćwiczyć zgodnie z książką dalej - a zobaczysz że wiele rzeczy zacznie stawać się coraz bardziej jasnych

_________________
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 maja 2014, o 22:48 
Offline
Nowy

Dołączył(a): 06 mar 2013
Posty: 8
Pomógł: 0

Dobra posłuchałem rady mirka o nieblokującej obsłudze klawiszy i napisałem następujący kod i niestety nie działa i co zrobiłem źle:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 19 minutach ]

Jeśli ktoś by mógł to proszę niech napisze ten program poprawnie bo ja już nie wiem co mam źle przeczytałem o tym i mi się wydaje że zrobiłem wszystko dobrze. Za poprawny kod z góry dzięki.

Kod wklejamy przy pomocy syntax=c - Różowo-zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 07:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 lut 2012
Posty: 778
Pomógł: 9

@micex123x
A na czym tym ten program odpalasz ATB, stykówce ?
Pokaż schemat lub zdjęcie jak to masz podłączone.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 08:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Nie działa prawidłowo, czyli co się dzieje? Jak jak zachowuje się układ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2014, o 00:34 
Offline
Użytkownik

Dołączył(a): 08 maja 2014
Posty: 61
Pomógł: 1

Witaj, spróbuj czy to Ci zadziała, nie sprawdzałem bo już mi się nie chce podłączać wszystkiego.
Powinno być tak jak chcesz, a ponowne naciśnięcie przycisku powinno wyłączyć wszystkie te wyjścia (oczywiście po tym jak już się wszystkie załączą bo przez te twoje _delay_ms() procek nie widzi że ty wciskasz przycisk w momencie kiedy on czeka).
Znowu następne naciśnięcie od nowa to włączy. Przycisk musisz zwierać do masy. Więcej tutoriali Mirosława Kardasia polecam, nie powinieneś mieć z tym problemu po obejrzeniu kilku filmików ^^ Napisz czy działa, bo sam jestem początkujący :D
A w drugiej linijce kodu, gdzie Ci pisze "#define F_CPU 1000000UL" musisz wpisać swoje taktowanie
procka.
[ to jest bardzo zła podpowiedź ..... stałą F_CPU definiujemy albo w ustawieniach projektu jeśli środowisko w jakim pracujemy na to pozwala albo ...... albo w pliku sterującym kompilacją o nazwie "makefile" - mirekk36 ]

Jeśli nie wiesz jakie masz taktowanie i nie zmieniałeś żadnych Fuse bitów to taktowanie będziesz miał taki jak wpisałem.
Ale jeśli zmieniałeś to wpisz to w Hz tam gdzie Ci zaznaczyłem cyferki chyba na czerwono :D U mnie kompilowałem i błędów nie było
ani ostrzeżeń :)

Cytuj:
#include <avr/io.h>
#define F_CPU 1000000UL // <----- BABOL - TEGO NIGDY NIE DEFINIUJEMY W KODZIE! - (mirekk36)

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


Poprawione, zapomniałem o nieznanym wyjściu PB2 :D



Ostatnio edytowano 29 maja 2014, o 01:04 przez komandos332, łącznie edytowano 4 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2014, o 00:44 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

komandos332 napisał(a):
A w drugiej linijce kodu, gdzie Ci pisze "#define F_CPU 1000000UL" musisz wpisać swoje taktowanie


Pan Mirosław wielokrotnie to powtarzał, po co wpisujesz tam swoje taktowanie? taktowanie wybiera się w Eclipse w ustawieniach projektu! Koledze radzisz aby oglądał poradniki a sam ich chyba nie oglądałeś, co :)?

a ten kodzik:

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



można zapisać w jednej linii:)

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


prawda że lepiej;)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2014, o 00:50 
Offline
Użytkownik

Dołączył(a): 08 maja 2014
Posty: 61
Pomógł: 1

Oczywiście że lepiej przyjacielu ale ja już się tak nauczyłem i można powiedzieć że to mój nawyk ^^ Oglądałem, lecz nie korzystam z Eclipse ^^ nie krzyczcie na mnie! xD Oglądałem poradnik porównujący eclipse z Atmel Studio, ale pozostałem przy Atmel Studio :)
Poza tym, warto wiedzieć że da się to zrobić bez ustawień w eclipse, osobiście wolę napisać tę jedną linijkę więcej :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2014, o 00:54 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

o i tu babol:

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


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


Pin masz PB0 a na ustawiasz go na PORTD

------------------------ [ Dodano po: 1 minucie ]

Nikt nie krzyczy:) na tym forum uczymy się porządnych technik programowania:)

komandos332 napisał(a):
ale pozostałem przy Atmel Studio


Nie wiem jak jest w Atmel Studio, więc się nie wypowiadam:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2014, o 00:57 
Offline
Użytkownik

Dołączył(a): 08 maja 2014
Posty: 61
Pomógł: 1

Racja kolego, przepraszam. To przez tę późną godzinę :D Wyrazy uznania za spostrzegawczość! :)
Już poprawiłem :)

------------------------ [ Dodano po: 3 minutach ]

Autor chyba już zwątpił i postanowił podejść do tego jutro.
Na mnie też już czas, życzę owocnego programowania!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2014, o 05:45 
Offline
Moderator
Avatar użytkownika

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

komandos332 napisał(a):
U mnie kompilowałem i błędów nie było
ani ostrzeżeń


to że u ciebie błędów nie było - to nie oznacza że z tym #define F_CPU jest dobrze - tak jak to robisz i pokazujesz. Jest niestety ŹLE. NIGDY się tego w kodzie nie robi, nigdy.

komandos332 napisał(a):
Oczywiście że lepiej przyjacielu ale ja już się tak nauczyłem i można powiedzieć że to mój nawyk


To niestety BARDZO ZŁY NAWYK .... i na tym forum szczególnie go tępimy - więc bardzo proszę nie podpieraj się cały czas stwierdzeniami, że

"u mnie nie ma błędów"
"ja mam taki nawyk"

itp itd ... bo to do niczego nie prowadzi .... masz jak wspominałem wyżej zły nawyk, i pewnie jeszcze dużo czasu upłynie, zanim się nauczysz. Pewnie dopiero wtedy jak się kiedyś na tym sam "przejedziesz" .... no ale może być też tak, że nigdy ....

Dlatego na tym forum proszę więcej nie podpowiadaj nikomu aby ktoś tak robił ani nie tłumacz że to jest OK .... to taka moja gorąca prośba, dobrze ?

komandos332 napisał(a):
Poza tym, warto wiedzieć że da się to zrobić bez ustawień w eclipse, osobiście wolę napisać tę jedną linijkę więcej


No i niestety - już w tym miejscu to opowiadasz MEGA BZDURY, to nie jest żadne odkrycie, że "w Eclipse da się to zrobić bez ustawień projektu, że można dopisać jedną linijkę"

bo taką samą bzdurę popełniają SETKI początkujących wychowane na pewnym dziwnym blogu, czy na niektórych kursach C z internetu. Tzn ja wiem, że ty piszesz takie rzeczy z niewiedzy - więc to rozumiem z jednej strony .... ale musisz też zrozumieć i chociaż raz kiedyś w życiu spróbować dojść do tego - co robisz źle , a później sam wybierzesz - jak będziesz już miał PORÓWNANIE czy dalej wolisz robić źle bo masz taki kaprys czy może jednak się czegoś nowego nauczyć ...

dodam właśnie że ten bzdurny nawyk z tym #define F_CPU bierze się u tych początkujących co to wolą Atmel Studio. Jak widzisz nikt na ciebie za to tutaj nie krzyczy ... jak się wyraziłeś. Jak chcesz to pisz w Atmel Studio albo i nawet w Notepad.exe ... kto ci zabroni ??? ;)

Nawet nie wiesz, że tym "twoim" Atmel Studio - też można z tym F_CPU zrobić porządek w ustawieniach projektu tak aby nie pisać tego w kodzie. Bo można - tylko pewnie też nie chciało się nawet koledze spróbować dowiedzieć jak .... lepiej pójść na pozorną łatwiznę i wpisać w kodzie co ?

----------------------------------------------

Reasumując .... po raz ostatni przypominam - proszę prezentować na forum kody bez definiowania F_CPU w kodzie programu i tym bardziej nie opowiadać swoich niestworzonych teorii że tak jest niby 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: 29 maja 2014, o 07:40 
Offline
Użytkownik

Dołączył(a): 08 maja 2014
Posty: 61
Pomógł: 1

No i dostało mi się po uszach :D W takim wypadku uciekam się poprawiać ^^



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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