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



Teraz jest 9 lip 2025, o 13:49


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: 27415
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: 27415
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: 27415
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: 27415
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: 27415
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 11 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