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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 28 lip 2025, o 15:51


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
    Autor Wiadomość
    PostNapisane: 19 lis 2013, o 17:32 
    Offline
    Nowy

    Dołączył(a): 19 kwi 2012
    Posty: 9
    Lokalizacja: Częstochowa, woj. Śląskie
    Pomógł: 0

    Proszę o pomoc.

    Mam olbrzymi problem z przerwaniami w atmega8. :( Poniżej wklejam prosty program, który z założenia miał: po naciśnięciu przycisku podpiętego pod port PD2 (INT0) zwiększyć zmienną licznik o 1. NAstępnie zmienna miała być wyświetlona na 7-segmentowym wyświetlaczu. Podczas kompilacji wyrzuca błędy.

    Error 1 static declaration of '__vector_1' follows non-static declaration
    Error 2 previous declaration of '__vector_1' was here


    Proszę o pomoc w znalezieniu błędów.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    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: 19 lis 2013, o 17:38 
    Offline
    Moderator
    Avatar użytkownika

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

    Panie kolego masz Bluebooka ?

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

    coś mi się wydaje że nie ... dlatego polecam bo popełniasz mega kardynalne błędy - nie rozumiesz np co to jest funkcja :(

    w tym konkretnym przypadku umieściłeś funkcję obsługi przerwania wewnątrz funkcji main - to jest niedopuszczalne i nie ma prawa nie tylko działać ale i się poprawnie skompilować. Wyrzuć to poza funkcję main ...

    drugi babol jaki będziesz miał to fakt że zmienną licznik robisz jako lokalną a tymczasem chcesz aby była widoczna w przerwaniu - no i znowu przydałoby się poczytać w Bluebooku na temat nie tylko funkcji ale zakresu widoczności nazw

    no takie PODSTAWY PODSTAW w C

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

    łech i kolejne babole :( jeśli PD2 to INT0 - to nigdy nie zadziała przy takim kodzie ... wiesz co to znaczy ustawianie kierunków pinów? i podciąganie do VCC ? chyba nie - jeśli nie masz książki jeszcze to zajrzyj tutaj - zobaczysz o co chodzi

    http://mirekk36.blogspot.com/2012/01/av ... stawy.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: 19 lis 2013, o 18:33 
    Offline
    Nowy

    Dołączył(a): 19 kwi 2012
    Posty: 9
    Lokalizacja: Częstochowa, woj. Śląskie
    Pomógł: 0

    Dzięki za odpowiedź.

    Może to mnie pogrąży, ale mam niebieską książkę. Jest świetna. Jednak nie mogę zrozumieć tych przerwań.

    Masz rację z tymi błędami. Przejrzałem jeszcze raz kod i naniosłem poprawki.
    - wyrzuciłem Funkcę obsługi przerwania poza funkcję main.
    - poprawiłem deklarację portów jeśli chodzi o port PD2.
    - wywaliłem deklarację zmiennej volatile licznik poza funkcję main.

    Przy kompilacji nie zgłosiło żadnych błędów. PROGRESS. Jednak nie działa dalej. Wyświetla mi "0", a gdy naciskam przycisk nic się nie dzieje.

    Czy prawidłowo odblokowałem i skonfigurowałem przerwania wewnętrzne?
    Gdzie powinienem szukać błędu?

    Poniżej aktualny poprawiony kod programu. Z góry dziękuję za zainteresowanie problemem i pomoc.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    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: 19 lis 2013, o 19:47 
    Offline
    Moderator
    Avatar użytkownika

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

    a ja jeszcze dodam - że o ile rozumiem np że chcesz cały taki kod ot tak dla pierwszego zrozumienia przerwań zrobić to ok ... niech będzie ale na przyszłość ZAPOMNIJ raz na zawsze o takim sposobie obsługi klawisza OK ?

    poza tym zrób poprawki o których napisał wyżej kolega ...

    no i rzeczywiście widać PROGRESS ;) czyli coraz lepiej

    _________________
    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: 19 lis 2013, o 20:23 
    Offline
    Nowy

    Dołączył(a): 19 kwi 2012
    Posty: 9
    Lokalizacja: Częstochowa, woj. Śląskie
    Pomógł: 0

    Uwagi wprowadziłem w życie. Dalej nie hula. Co do linii 4,5 to mam pytanie. Dlaczego tak się nie robi? Czy przez to może nie działać program? W takim razie jak to powinienem zrobić?

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


    Wciąż po wgraniu programu wyświetla mi "0", a przycisk jest "martwy" :(

    Program, którym Was męczę ma jedynie za zadanie uruchomienie przerwania zewnętrznego i przeanalizowanie istoty jego działania, a dalej tym tropem uruchomienie timera. Tak więc będę wdzięczny za pomoc, nawet szkic jakiegoś najprostrzego programu byle wykorzystywał przerwanie na przykładzie, którego mógł bym uruchomić ten.

    Drogi kolego Mirku. Zasugerowałeś, że obsługa przycisku jaki zaproponowałem jest zła. Czy chodzi Ci o to, że powinienem uwzględnić drganie styków? Czy też błędem jest w ogóle używanie przerwania pod przycisk?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lis 2013, o 20:30 
    Offline
    Moderator
    Avatar użytkownika

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

    marcin2287788 napisał(a):
    Co do linii 4,5 to mam pytanie. Dlaczego tak się nie robi?


    Ty może lepiej spróbuj powiedzieć skąd te linie wytrzasnąłeś i co one wg ciebie mają znaczyć .... tak się powinno zadać pytanie - bo czasem jak coś doprecyzujesz w pytaniu i wyjaśnisz co miałeś na myśli to sam sobie zdążysz odpowiedzieć na takie np pytanie ok ?

    Więc ja ci odpowiem ale najpierw ty powiedz skąd ten przedziwny pomysł i co to ma robić - to będzie można lepiej ci to wyjaśnić ok?

    Poza tym warunek:

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


    zmień na

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


    ale nie łudź się że ten kod będzie ci dobrze działać i pięknie będą się zapalać różne kombinacje diod po każdym kliknięciu bo nie bierzesz TOTALNIE pod uwagę drgań styków, które w przypadku takiej masakrycznej obsługi klawisza będą powodować czasem kilkukrotne wywołanie przerwania przy wciskaniu lub zwalnianiu klawisza .... jedyne co zobaczysz to to że czasem może uda ci się zmienić stan diod na PORTB

    No i wywal że te linie 4,5 zamiast wciąż się dziwić że nie działa i nie działa ok ;) ?

    _________________
    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: 19 lis 2013, o 21:37 
    Offline
    Nowy

    Dołączył(a): 19 kwi 2012
    Posty: 9
    Lokalizacja: Częstochowa, woj. Śląskie
    Pomógł: 0

    Zrobiłem wg wskazówek. Rezultat. Raz udało mi się zmienić stan wyświetlacza z 0 na 1. Hmmm rozumiem, że w takim razie program zadziałał, ale to, że Ciężko zmienić stan wyświetlacza wynika z tych drgań styków.

    Kilka pytań:
    1) Wyeliminowanie wpływu drgań styków.

    - Wiem, że stosowanie opóźnień w przerwaniu to zły pomysł, ale nic nie przychodzi mi do głowy poza:
    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 naprowadzenie mnie mniej więcej gdzie mam szukać rozwiązania :) Czy pomysł z wyłączeniem przerwania jest ok i tylko wyrzucić opóźnienie poza funkcję obsługi przerwania?

    2) Definiowanie F_CPU.

    - Czy pisząc kod w "C", jeśli korzystamy z np. TIMER0, INT0, a procesor taktujemy zegarem wewnętrznym to polecenie np. "#define F_CPU 1000000" jest konieczne? Czy używamy je tylko wyłącznie gdy korzystamy z kwarcu?


    Co do linii 4 i 5, to zaczerpnięte zostały z bluebook'a ze strony 193. Mój błąd w zrozumieniu tekstu spowodował, że wydawało mi się, że linie te są do umieszczenia w programie. Jako na swoją obronę napiszę, iż wcześniej programowałem w "Bascom College ....C2051" i o ile w język tennie sprawiał mi trudności to po długiej przerwie w elektronice AVR'y postanowiłem programować w C. Jednak sprawia mi on duże trudności w zrozumieniu składni. I tak zamiast zająć się obsługą TWI ja wciąż od kilku miesięcy tkwię na marnym przerwaniu.

    Liczę na pomoc w zrozumieniu :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 lis 2013, o 22:15 
    Offline
    Moderator
    Avatar użytkownika

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

    No widzisz jak sobie sam wyjaśniłeś linie 4 i 5 ;) i bardzo słusznie ...

    ale co do np pkt.2 - to hmmm i w bluebooku piszę o tym kilkakrotnie (ale ok pewnie przeoczyłeś)

    NIGDY ale to NIDY w kodzie programu nie umieszczamy

    #define F_CPU xxxxxx

    to jest zgroza i co chwilę tępię to na forum .... niestety niektóre kocie blogi i strony robią złą robotę wciąż wciskając początkującym aby to wpisywali a potem mają same ZONKI. Zapamiętaj sobie raz na zawsze - F_CPU masz w makefile a tam ono się znajduje automatycznie gdy w ECLIPSE we właściwościach projektu określisz taktowanie procka i co więcej to F_CPU z makefile masz dostępne w KAŻDYM PLIKU PROJEKTU - ZAWSZE TAKIE SAMO I AUTOMATYCZNIE USTAWIANE ....

    a w czym to przeszkadza - no to już doczytaj proszę w bluebooku albo w co trzecim poście na forum ok?

    PUNKT1. ..... wyeliminowanie drgań styków - a może jednak kolega przeczyta chociaż RAZ - tak JEDEN RAZ CAŁĄ książkę - bo coś mi się zdaje że zabierasz się do niej na mocne wyrywki i ani razu jej w całości nie przeczytałeś a to ważne. I stąd twoje opisy że ciężko ci idzie zrozumienie składni C .... hmmm to nie dziwne jeśli robisz to na wyrywki i pomijasz pewne rozdziały

    bo w Bluebooku masz w pierwszym ćwiczeniu z klawiszami takie ala pseudo klasyczne wyjaśnienie na czym polega eliminacja drgań styków i ciekaw jestem dlaczego nie zajrzysz do książki - Ba! w dalszych rozdziałach masz to pokazane jeszcze w zaawansowany sposób na timerach programowych itp

    do tego na moim blogu masz pokazaną piękną obsługę ale prostszą na początek nieblokującą co ważne - klawiszy i drgań styków:

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

    no weź że proszę przeczytaj ten artykuł na blogu ok ?

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

    a o wstawianiu _delay_ms() do obsługi przerwania nawet nie będę dyskutował bo to już kompletna NIEDORZECZNOŚĆ i nic się nie nauczysz tak podchodząc do przerwań niestety :( daruj sobie ćwiczenie przerwań i ich zrozumienie na takim przykładzie bo to hmmm totalnie nietrafiony przykład .... zajrzyj sobie lepiej do rozdziału

    "Multipleksowane LED na wyświetlaczu 7-segmentowym" w bluebooku

    _________________
    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: 19 lis 2013, o 23:40 
    Offline
    Moderator
    Avatar użytkownika

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

    Cytuj:
    Mirku, troszkę zrozumienia dla kolegi


    No ale gdzie u mnie widać niezrozumienie - ja się ani nie denerwuję ani nie ironizuję - podpowiadam tylko jaką warto iść drogą i w jakiej kolejności

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

    GwynBleidD napisał(a):
    Odnośnie delaya w przerwaniu, też napisał, że to tylko "demonstracja" i oczywiście wywalić trzeba delay z przerwania


    W przerwaniu nie tylko błędem jest delay ale i to włączanie i wyłączanie przerwania int0 ... niestety i to sporym błędem, dlatego jeszcze raz powtórzę że to niedobra droga do zrozumienia przerwań. Oczywiście nie każdy musi się ze mną zgadzać ...

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

    GwynBleidD napisał(a):
    Co do samego kodu, przestaw sobie przerwanie ze zbocza na stan niski


    To też uważam za nieszczęśliwy pomysł i może kolega też jeszcze nie do końca rozumie przerwania - ale spoko widzę że muszę też zrobić o tym kiedyś poradnik.

    ------------------------ [ Dodano po: 10 minutach ]

    GwynBleidD napisał(a):
    Bo nie wiem dlaczego, ale zbocze nie lubi drgań styków i nie wywołuje się za każdym razem...


    Gwyn - no sorki ale teraz to już troszkę fantazjujesz ;) co ma przerwanie do lubienia albo nie lubienia drgań styków ...

    Jak najbardziej się nadaje ale np gdy robimy jakąś obsługę klawiatury matrycowej i bramkujemy wiersze czy tam kolumny klawiszy ... i wtedy można odpalać takie przerwanie, które zasygnalizuje konieczność przeskanowania klawiatury po oczywiście jakimś czasie zwłoki przy pomocy byle timera .... I zdecydowanie wtedy tak można używać przerwania - wyzwalanego zboczem ... ale nie do obsługi pojedynczych klawiszy bo nawet jak się rozbuduje kod do przedziwnej postaci - z delajami w środku i nie wiadomo czym jeszcze to jaki to da obraz na końcu początkującej osobie panie kochany ?

    ano taki - że sam się taki początkujący przeżegna lewą nogą po plecach i stwierdzi że to jakaś głupota te przerwania całe i że lepiej je omijać szerokim łukiem ....

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

    a już żeby wyjaśnić - wyzwalanie poziomem stosuje się w bardzo ale to bardzo rzadkich sytuacjach - no chociażby wybudzanie procka wręcz ma wymóg aby przerwanie było ustawione na wyzwalanie stanem niskim .... ale po obudzeniu przełącza się to albo na poziom jeśli ma być do czegoś innego wykorzystywane albo w ogóle wyłącza do czasu uśpienia

    inne przypadki na razie mi do głowy nie przychodzą - a warto wiedzieć - że wyzwalanie poziomem będzie wciąż ustawiało flagę przerwania i po jego opuszczeniu zaraz nastąpi kolejne, kolejne kolejne - aż do zatkania procesora jeśli ktoś sobie z tego sprawy nie zdaje i nie wie jak to obsłużyć w programie.

    ------------------------ [ Dodano po: 11 minutach ]

    reasumując - Gwyn nie wciskaj mi na siłę ;) ok? że ja nie mam zrozumienia - bo mam go sporo inaczej bym chyba tylko coś tam odburknął a nie podpowiadał i tłumaczył.

    _________________
    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 19 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