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



Teraz jest 14 lis 2024, o 02:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 51 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 30 gru 2012, o 01:56 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Witam! dzisiaj podczas pisania programu napotkałem bardzo dziwny problem... a mianowicie po włączeniu zegarka wszystko ładnie działa, lecz pojawia się problem po kilku/kilkunastu sekundach, program nie chce wejść w główną pętle... czyżby nie został spełniony warunek while(1){} ?! wszystko działa, miga kropka sekundy, ale nie chce wejść w główną pętle (przerwania działają) co skutkuje tym, ze cały czas jest wyświetlana stara godzina... powiem lepiej w momencie, gdy jeszcze program wchodzi w główną pętle wszystko działa z opóźnieniem, czyżby procesor nie wyrabiał z funkcjami? procesor ustawiony jest na wew. oscylator 8MHz (bawiłem się również z OSCCAL - zwiększałem wartość lecz bez rezultatów). Wg. mnie przerwania nie są na tyle skomplikowane, by aż tak nadwyrężały atmege...



Z góry mówię, że nie jestem mistrzem w C tak jak nasz guru z forum, tak więc proszę o wyrozumiałość i ew. podpowiedzi co zrobiłem zle.
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: 30 gru 2012, o 10:46 
Offline
Moderator
Avatar użytkownika

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

Piotrek121 napisał(a):
... procesor ustawiony jest na wew. oscylator 8MHz (bawiłem się również z OSCCAL - zwiększałem wartość lecz bez rezultatów).

Jakież to ludziom "fajne" pomysły przychodzą do głowy ;) a co z tym wszystkim ma wspólnego OSCCAL ??? powiedz mi ? ;) wiesz do czego służy ten rejestr? Wybacz mi to pytanie - nie jest ono złośliwe - po prostu po takim stwierdzeniu czuję że w ogóle nie wiesz do czego to jest albo rozumiesz to jakoś strasznie pokrętnie - bo jak inaczej można byłoby wiązać zmiany OSCCAL z tym co tu opisujesz ??? :(


Piotrek121 napisał(a):
Wg. mnie przerwania nie są na tyle skomplikowane, by aż tak nadwyrężały atmege...


Na atmegę nie ma mocnych ale ....

ale są programiści, którzy spokojnie ją załatwią swoim kodem - tzn może inaczej - nie załatwią atmegi ale tak napiszą program, że będzie ona robić wszystko DOBRZE i zgodnie z tym co napisał programista - tyle że nie będzie to działać tak jak on sobie tego życzy. I nie zależy to od atmegi ale od złego kodu jaki napisał programista....

proponuję wychodzić zawsze z takiego założenia - to łatwiej będzie analizować i poprawiać swoje programy (ja tak zawsze robię) .... zamiast szukać momentu kiedy to już się skończyły możliwości biednego procka. Taki program rozłożyłby na łopatki również silnego 32-bitowego ARM'a ;)

więc kilka porad, ja wprawdzie nie przeanalizuję tego kodu bo jest napisany hmmm no powiedziałbym baaaaardzo źle, ale to co się rzuca w oczy i co powinieneś od razu poprawić a pewnie sam dojdziesz gdzie porobiłeś babole:

1. powiedz mi po co u ciebie WSZYSTKIE zmienne opatrzone są specyfikatorem volatile ??? w tym nawet tablice ??? wytłumacz mi to ??? bo znowu czuję - że nie kojarzysz co oznacza volatile i tak na wszelki wypadek to dodałeś żeby było "lepiej" .... to znowu podejście do programowania "na macanego" .... czytałeś w książce mojej co to jest volatile ? powiedz mi ?

2. brak odpowiednich wcięć w kodzie .... przez co próba jego analizy to koszmar amerykańską piłą tarczową :( i już tu upatruję że mogłeś strzelić sobie pierwszy albo drugi raz w stopę jeśli chodzi o ten program

3. co to ma być ?????????? mam tu na myśli pętlę główną programu ??? to już jest NÓŻ w plecy i to wbijany co najmniej 4 razy z tępym ostrzem :( ...... jak najszybciej polecam obejrzeć poradnik VIDEO

http://mirekk36.blogspot.com/2012/12/ws ... a-bez.html

z którego (nawet jeśli jeszcze nie dotarłeś w książce do callbacków, struktur itp) to przynajmniej zobaczysz jak się tworzy projekt wieloplikowy - bo to co tu zrobiłeś to jak program w BASCOMIE :( .... i zajrzyj na to forum, niedawno inny kolega podobnie próbował i dziwił się że mu "coś" nie działa - zobacz tu:

topic1984.html

przeczytaj cały ten wątek do końca .... gdzieś w środku jest cały kod jaki w końcu pokazał autor tego wątku - mam nadzieję że i ty jak go zobaczysz jako osoba z zewnątrz to złapiesz się za głowę

4. powiedz mi co to jest za DZIWOLĄG u ciebie ????

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


czyżbyś nie czytał w książce o preprocesorze i #define ??? nie oglądałeś kodu np do multipleksowania na dołączonej do książki płycie DVD ???? przecież sam sobie szkodzisz takim pisaniem kodu :( .... wszystko pakujesz do jednego WIELKIEGO WORA a potem się dziwisz że nie możesz w nim klucza znaleźć.

to tyle - tak na gorąco - więc jak poczytasz ten wątek wyżej a szczególnie jego końcówkę to mam nadzieję, że podobnie jak autor tamtego wątku zrozumiesz że tak nie można i zaczniesz poprawiać kod zgodnie z sugestiami a wtedy zobaczysz że wszystko zacznie powoli tobie 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: 30 gru 2012, o 14:17 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

mirekk36 napisał(a):
Piotrek121 napisał(a):
... procesor ustawiony jest na wew. oscylator 8MHz (bawiłem się również z OSCCAL - zwiększałem wartość lecz bez rezultatów).

Jakież to ludziom "fajne" pomysły przychodzą do głowy ;) a co z tym wszystkim ma wspólnego OSCCAL ??? powiedz mi ? ;) wiesz do czego służy ten rejestr? Wybacz mi to pytanie - nie jest ono złośliwe - po prostu po takim stwierdzeniu czuję że w ogóle nie wiesz do czego to jest albo rozumiesz to jakoś strasznie pokrętnie - bo jak inaczej można byłoby wiązać zmiany OSCCAL z tym co tu opisujesz ??? :(


zwiększałem OSCCAL by zwiększyć "obroty" atmegi, gdyż na początku myślałem, ze to wina "zapchanego" procesora, który nie wyrabia i pomoże zwiększenie częstotliwości (generatora wewnętrznego, gdyż na wstawienie zewnętrznego było za późno :( ) ale później się okazało, ze i to nie pomogło :(

mirekk36 napisał(a):
więc kilka porad, ja wprawdzie nie przeanalizuję tego kodu bo jest napisany hmmm no powiedziałbym baaaaardzo źle, ale to co się rzuca w oczy i co powinieneś od razu poprawić a pewnie sam dojdziesz gdzie porobiłeś babole:


zdaje sobie sprawę z tego, ze program nie jest napisany tak jak jest to opisane w książce, ale staram się pisać tak by był zrozumiały dla mnie - a chyba o to chodzi... :)

mirekk36 napisał(a):
1. powiedz mi po co u ciebie WSZYSTKIE zmienne opatrzone są specyfikatorem volatile ??? w tym nawet tablice ??? wytłumacz mi to ??? bo znowu czuję - że nie kojarzysz co oznacza volatile i tak na wszelki wypadek to dodałeś żeby było "lepiej" .... to znowu podejście do programowania "na macanego" .... czytałeś w książce mojej co to jest volatile ? powiedz mi ?


co do volatile to jeszcze pozostałości po moim szukaniu... wrzuciłem wszystko pod volatile - jeden z pomysłów czemu nie działa i zapomniałem wywalić :(

mirekk36 napisał(a):
2. brak odpowiednich wcięć w kodzie .... przez co próba jego analizy to koszmar amerykańską piłą tarczową :( i już tu upatruję że mogłeś strzelić sobie pierwszy albo drugi raz w stopę jeśli chodzi o ten program


co do wcięć to wszystko było dobrze "na początku" wszystko zaczęło się od... a może to wina tego, ze to jest tu i robi to... zobaczymy czy jak to przeniosę tutaj pomoże, a jak kopiuje się część kodu w inne miejsce z zaznaczonymi tabulatorami to niestety wywala wszystko do przodu i właśnie tutaj jest ten problem... oczywiście wszystko będzie poprawione na koniec kodu co do estetyki, jak juz wszystko będzie działało - o ile do tego dojdzie :D

mirekk36 napisał(a):
3. co to ma być ?????????? mam tu na myśli pętlę główną programu ??? to już jest NÓŻ w plecy i to wbijany co najmniej 4 razy z tępym ostrzem :( ...... jak najszybciej polecam obejrzeć poradnik VIDEO


tak jak napisałem wcześniej nie jestem mistrzem w pisaniu programów, i dlatego pisze tak jak ja to rozumiem i by było dla mnie logiczne.

4. powiedz mi co to jest za DZIWOLĄG u ciebie ????

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


czyżbyś nie czytał w książce o preprocesorze i #define ??? nie oglądałeś kodu np do multipleksowania na dołączonej do książki płycie DVD ???? przecież sam sobie szkodzisz takim pisaniem kodu :( .... wszystko pakujesz do jednego WIELKIEGO WORA a potem się dziwisz że nie możesz w nim klucza znaleźć.[/quote]

książkę przerobiłem prawie całą i powiem tak... nie lubię mieć kodu porozwalanego po kilku plikach, zgadzam się z tym, ze sprawdzaniem kodu przez inna osobę w takim wypadku staje sie wręcz niemożliwe, no ale cóż poradzę, porostu takie pisanie na "kilka plików" sprawia mi sporą trudność dlatego pozostaje właśnie na jednym pliku

mirekk36 napisał(a):
to tyle - tak na gorąco - więc jak poczytasz ten wątek wyżej a szczególnie jego końcówkę to mam nadzieję, że podobnie jak autor tamtego wątku zrozumiesz że tak nie można i zaczniesz poprawiać kod zgodnie z sugestiami a wtedy zobaczysz że wszystko zacznie powoli tobie działać ;) ok ?


czytając to chyba wiem gdzie może być błąd i chodzi chyba o {}? za chwilę przeczytam cały temat i zobaczymy czy dojde do jakiegoś mądrego rozwiązania :)


GwynBleidD napisał(a):
masz w przerwaniu pętlę for, aj aj aj aj aj... Pomyśl sobie ile te 100 iteracji będzie trwało! Żeby to zlikwidować są 2 wyjścia: liczyć średnią poza przerwaniem, albo zrobić mały trick ze wzorem ;)

Obrazek

Po kolei mamy wzór na starą średnią arytmetyczną i nową, wyciągnąłem tam z sum po 1 składniku, odpowiednio 1szym i ostatnim, żeby uzyskać część wspólną dla obu równań. Później wyliczam samą część wspólną ze starej średniej, wstawiam do nowej i upraszczam. W ten sposób uzyskujemy prościutkie równanie, bez liczenia sumy (która wymaga pętli)

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


Kod ten oczywiście nie zadziała dla pierwszych pomiarów :) Znaczy zadziałać, zadziała ale dopełni sobie do 100 pomiarów zerami, po tych 100 pomiarach będzie już działał poprawnie.


Problem niestety nie leży po stronie pętli for :( na samym początku miałem regulacje jasności braną na bieżąco, ale przez to wyświetlacz strasznie "tańczył" dlatego dałem właśnie średnią arytmetyczną, dla pewności wczoraj jeszcze podstawiłem pod zmienna wartosc_PWM wartość 100 i wywaliłem dosłownie wszystko co było związane z ADC i było to samo :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2012, o 14:50 
Offline
Moderator
Avatar użytkownika

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

Piotrek121 napisał(a):
zdaje sobie sprawę z tego, ze program nie jest napisany tak jak jest to opisane w książce, ale staram się pisać tak by był zrozumiały dla mnie - a chyba o to chodzi... :)


Nie o to chodzi :( ... chodzi o to aby był napisany poprawnie a nie tak jak ty to rozumiesz - bo co? jeśli źle rozumiesz? Dlatego trzeba szukać , poprawiać i opierać się na dobrych przykładach no i na możliwościach języka C, ogromnych możliwościach .... no ale jeśli ty piszesz takie rzeczy hmm herezje wręcz:

Piotrek121 napisał(a):
książkę przerobiłem prawie całą i powiem tak... nie lubię mieć kodu porozwalanego po kilku plikach,


to ok, ale nie oczekuj w takim razie podpowiedzi i pomocy ode mnie ok? bo jeśli w książce opisuję jak się powinno pisać i ktoś czyta książkę to stara się stosować do jej porad. Ty robisz WSZYSTKO ODWROTNIE, baboli ci się przez to na maxa - i jeszcze piszesz, że nie lubisz pisać kodu (dzielić na pliki) tak jak się należy :( MASAKRA .... to w zasadzie tobie książka jest nie potrzebna - zostaw ją na boku i twórz dalej takie potworki. Widzę że się nie dogadamy. Jedni chcą się czegoś nauczyć i się uczą - ale jest też parę wyjątków - czyli osób które nie chcą się nauczyć i widzę że się do tych wyjątków zapisujesz.

Piotrek121 napisał(a):
zgadzam się z tym, ze sprawdzaniem kodu przez inna osobę w takim wypadku staje sie wręcz niemożliwe, no ale cóż poradzę, porostu takie pisanie na "kilka plików" sprawia mi sporą trudność dlatego pozostaje właśnie na jednym pliku


Ja bardzo dobrze rozumiem, że to może sprawiać trudność na początku, ale na ZEUSA przejrzyj sobie to forum, zobacz jak ludzie "rosną" powoli bo powoli czasem w bólach - ale brną dalej i uczą się dzielić projekt na pliki tak jak polecam w książce - a ty nie ? To nie ;) więc się nie dziw ... bo dokąd nie zrozumiesz - że to nie chodzi tylko o tych którzy mają analizować twój kod - TY SAM go przestajesz rozumieć i logicznie myśleć tworząc TASIEMCA co widać na załączonym obrazku.


Piotrek121 napisał(a):
Problem niestety nie leży po stronie pętli for :( ...


Ciekawe kiedy dotrze do ciebie, że w tym kodzie jest dużo błędów, nie tylko w pętli for, a GwynBleiD słusznie zwrócił ci uwagę i to jeszcze podał przykład jak do tego podchodzić - ale ty znowu jak widać wiesz lepiej .... to zastanów się czy jest sens w ogóle zadawać tu pytania hmmm ? i podawać ludziom do analizy takie koszmary bo ty uważasz że tak się pisze programy.

Sorry że tak podchodzę - ale albo współdziałamy i szanujemy swój czas nawzajem albo sobie nie przeszkadzamy. Nie uznajesz sposobów dobrego programowania ? - to poszukaj pomocy gdzie indziej. No chyba że zrozumiesz - że jednak nie tędy droga .... to zapraszam do dalszych pytań.

_________________
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: 30 gru 2012, o 15:12 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Tak, wiem chodzi o to, że próbujesz mi pomóc a ja się upieram, ze ja wiem lepiej... ok tak więc co proponujesz? podzielić program na podprogramy w innych plikach? i które elementy? mam multipleksacje w przerwaniu, w drugim odczyt z ADC, w trzecim miganie diody, w mainie: kontrole przycisków



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2012, o 16:24 
Offline
Moderator
Avatar użytkownika

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

Piotrek121 napisał(a):
Tak, wiem chodzi o to, że próbujesz mi pomóc a ja się upieram, ze ja wiem lepiej... ok tak więc co proponujesz? podzielić program na podprogramy w innych plikach? i które elementy? mam multipleksacje w przerwaniu, w drugim odczyt z ADC, w trzecim miganie diody, w mainie: kontrole przycisków


Dokładnie tak zrób, tzn próbuj robić i dziel się wtedy z nami swoimi kłopotami oraz pytaniami - jak widzisz każdy chętnie ci pomoże a ty przy okazji nabierzesz w tym doświadczenia .... a potem - jak już się nauczysz dzielić sam taki projekt na pliki - to jak spojrzysz wstecz - to aż cię ciarki przejdą po plecach jak kiedyś sam robiłeś ;)

Dlatego wspomniałem ci o wydzieleniu do plików - bo właśnie popełniłeś ten błąd o którym mówię w swoim ostatnim poradniku, OT tak na szybko po kolei wszystko dopisywałeś aż powstał potworek nad którym już ciężko zapanować. W książce masz przecież ładnie opisany rozdział o multipleksowaniu i jak DOKŁADNIE wyprowadzić całe multipleksowanie do oddzielnych plików - bardzo się na tym skupiłem w książce - a JESZCZE bardziej w swoim ostatnim poradniku VIDEO gdzie się aż SKLONOWAŁEM żeby DOBITNIE pokazać że warto a wręcz trzeba to robić.

Więc do dzieła - .... twórz i na gorąco pytaj - ja , ale pewnie nie tylko ja jestem do dyspozycji i chętnie pomogę.

_________________
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: 30 gru 2012, o 17:17 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Ok, rozumiem jak możesz to podpowiedz mi co mogę wywalić z głównego programu... wiem, ze na pewno obsługa przycisków, w tym momencie znika praktycznie cała pętla główna, ale teraz co z przerwaniem? tez jest rozległe, tam tez zastosować dzielenie? nie będzie żadnych problemów?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2012, o 17:51 
Offline
Moderator
Avatar użytkownika

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

To będzie dla ciebie na prawdę fajny poligon i jak go przejdziesz to będziesz widział C już przez bardziej różowe okulary.

No oczywiście że całe przerwanie multipleksowania i wszystko co z tym związane czyli także można funkcję inicjalizującą timer oraz definicje preprocesora wrzucić do oddzielnych plików - no dokładnie tak jak masz to w książce przecież ;)

NIC się nie będzie gryzło - a jak zacznie się gryźć to będziemy po kolei sobie tłumaczyć co i jak - bo ty na razie jeszcze w ogóle nie rozumiesz podziału plików widzę - ale nie przejmuj się - szybko zaskoczysz tylko doczytaj też w książce rozdział o dzieleniu plików - masz tam nawet taką tabelkę rozpisaną - no raczej warto sięgnąć po to do książki.

Obiecuję że żadnych problemów nie będzie na końcu jeśli będziesz wytrwały. Tylko rób to mniejszymi kroczkami - załóż nowy projekt i twórz go od początku kopiując i wklejając kod ze starego.

przy czym skoro ta całość u ciebie nie działa - to na początek jak mówię poćwicz to co w książce - czyli np napisz sobie w taki sam sposób multipleksowanie, a na przeróbki po swojemu przyjdzie czas później - żebyśmy się z tym nie kałapućkali przez rok czasu ;)

_________________
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: 30 gru 2012, o 18:23 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Można powiedzieć, ze rozdział z podziałem po trochu ignorowałem, bo "byłem mądrzejszy" ale bede musiał teraz doczytać i przekształcę trochę kod, jak skończę to wstawię go tutaj i powiem jakie są rezultaty



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2012, o 12:28 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Znalazłem w końcu trochę czasu na poprawę mojego kodu, ale na samym początku pojawił się problem, może nie tyle co problem ale pytanie... mój port D jest wykorzystywany do przerwania (INT0), multipleksowania (anodami) i przyciski.. w pliku *.h chciałem zapisać np. #define dir_D DDRD i teraz mam wątpliwość, bo chce zrobić osobne pliki dla multipleksacji, przycisków itd.. i w tych dwóch plikach byłoby wykorzystane dane dir_D i nie wiem, czy ten define dać w głównym main czy jakoś inaczej sobie z tym poradzić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2012, o 13:32 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Dziękuje za rade :)

oczywiście chciałem tak zrobić, ale tak jak wcześniej napisałem port D jest użyty do multipleksowania, do przerwania, i do przycisków, tak wiec jak podpisze go PRZYCISKI to tylko będzie bałagan :) tak wiec postanowiłem zostać przy DDRD albo dir_D

Poprawiając kod pojawiła się kolejna "rozkmina" mając plik *.h na początku dajemy #include.h i bez żadnych problemów program czyta nam również ten plik, lecz mając plik *.c (podprogram) nie ma żadnych "odsyłaczy" do danego pliku tzn. jeżeli w pliku *.c (podprogram) napiszemy przykładowo void program (void){ } i pozniej w głównym main-ie użyjemy program() to rozumiem, ze program skoczy do do tej funkcji, ale skąd on ma wiedzieć, ze jest akurat w xxx.c? i co się dzieje z kodem przed funkcją? na przykładzie multipleksacji z książki mamy void d_led_init(void) i w głównym mainie jest przekierowanie do tego, ale przed void d_led_init(void) jest jeszcze m.in. przypisywanie cyfr... kiedy uC do tego idzie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2012, o 13:44 
Offline
Moderator
Avatar użytkownika

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

Piotrek121 napisał(a):
D
Poprawiając kod pojawiła się kolejna "rozkmina" mając plik *.h na początku dajemy #include.h i bez żadnych problemów program czyta nam również ten plik, lecz mając plik *.c (podprogram) nie ma żadnych "odsyłaczy" do danego pliku tzn. jeżeli w pliku *.c (podprogram) napiszemy przykładowo void program (void){ } i pozniej w głównym main-ie użyjemy program() to rozumiem, ze program skoczy do do tej funkcji, ale skąd on ma wiedzieć, ze jest akurat w xxx.c? i co się dzieje z kodem przed funkcją? na przykładzie multipleksacji z książki mamy void d_led_init(void) i w głównym mainie jest przekierowanie do tego, ale przed void d_led_init(void) jest jeszcze m.in. przypisywanie cyfr... kiedy uC do tego idzie?


W takich przypadkach zwykle mówię, stop ;) w tył zwrot i odsyłam do książki do rozdziału ... ale wiem że już się za to wziąłeś i może z uwagi na pośpiech trochę ci się to miesza - więc przypomnę NAJWAŻNIEJSZE - a ty na spokojnie wrócisz do książki do tego rozdziału gdzie jest ta tabelka ładnie rozpisana z plikami *.c oraz *.h

ZAPAMIĘTAJ:

w pliku nagłówkowym *.h - trzymamy TYLKO I WYŁĄCZNIE same: DEKLARACJE zarówno funkcji jak i zmiennych oraz dyrektywy preprocesora.

w pliku nagłówkowym *.c - trzymamy DEFINIECJE zarówno funkcji jak i zmiennych

sam widzisz, że aby to zrozumieć to musisz na pewno wrócić do książki i doczytać czym różni się DEKLARACJA od DEFINICJI, dla pewności postaraj się nam tutaj powiedzieć to swoimi słowami i dopytać o to - bo 90% problemów z podziałem projektu na pliki mają te osoby, które nie rozumieją w czym jest ta różnica

i teraz w plikach projektu INKLUDUJEMY zawsze tylko pliki nagłówkowe *.h !!!!! NIGDY W ŻYCIU *.c !!!

czyli jak np piszesz sobie (hmmm ale teraz powtarzam już to co w książce - trochę to bez sensu) .... obsługę klawiatury i wymyślisz dwa pliki np kbd.c oraz kbd.h to od razu w kabd.c inkludujesz kbd.h. Dzięki temu nie ważne w jakiej kolejności będziesz miał pisane funkcje bo na górze zainkludują się ich deklaracje ...

Jak widzisz wciąż mówimy o mocnych podstawach języka C, które chyba też troszkę po macoszemu potraktowałeś co ?

ale spójrz do tego rodziału w książce i poświęć troszkę czasu i zobacz jak tworzę projekt ten w poradniku VIDEO (teraz to już przedostatni) bo ostatni wyszedł dziś w nocy ;)

http://mirekk36.blogspot.com/2012/12/ws ... a-bez.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: 31 gru 2012, o 14:11 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Wiem na czym polega różnica miedzy deklaracja a definicją (przynajmniej tak mi się wydaje) deklaracje (w *.h) możemy zamieniać dane komendy na swoje dowolne znaki np. wcześniej wspomniane #define A1 (1<<PA0) a w pliku *.c wszystkie funkcje odnosnie pliku *.h i nie tylko...

Ale wracając do mojego pytania, chodzi mi głównie o taka sytuacje: mam główny main.c miałem tam deklaracje zmiennych np. uint8_t zmienna1 = 1; i w momencie gdy wrzucę ja do tego mojego podprogramu np abc.c to rozumiem, ze danej zmiennej nie będę mógł używać w głównym main?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2012, o 14:21 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

W końcu ogarnąłem o co chodzi, za co dziękuje koledze GwynBleidD :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2012, o 14:34 
Offline
Moderator
Avatar użytkownika

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

Piotrek121 napisał(a):
Wiem na czym polega różnica miedzy deklaracja a definicją (przynajmniej tak mi się wydaje) deklaracje (w *.h) możemy zamieniać dane komendy na swoje dowolne znaki np. wcześniej wspomniane #define A1 (1<<PA0) a w pliku *.c wszystkie funkcje odnosnie pliku *.h i nie tylko...


Jeśli to było twoje wytłumaczenie różnicy pomiędzy DEKLARACJĄ a DEFINICJĄ to niestety przykro mi ale tylko ci się WYDAJE że wiesz na czym ta różnica polega i w związku z tym co chwilę będziesz robił duże ZONKI w C eeeh więc krótko

DEFINICJA zmiennej lub funkcji powoduje od razu rezerwację pamięci dla niej. Np:

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


Natomiast DEKLARACJA nie powoduje rezerwacji pamięci a pełni tylko rolę informacyjną o nazwie zmiennej czy funkcji z jej argumentami, np:

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


i teraz cała zasada tworzenia plików projektu sprowadza się w uproszczeniu mówiąc do używania DEFINICJI w plikach *.c natomiast DEKLARACJI w plikach *.h

i nie ma to NIC a NIC wspólnego z definicjami preprocesora #define - bo chyba z tym ci się to pomyliło

ale myślę - że pewnie byłeś przekonany że na tyle znasz podstawy C, że również pominąłeś czytanie początku opisu języka C w książce - oj niedobrze ..... może jednak warto wrócić i przeczytać to dokładnie od samego początku pewnie jeszcze wiele innych spraw ci się wyjaśni - zobaczysz.

_________________
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: 1 sty 2013, o 18:39 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Dziękuje Wam wszystkim za pomoc, już doczytałem i po przykładach +/- wiem o co chodzi... ale napotkałem jeden problem... z pamięcią eeprom, a mianowicie, znalazłem na googlach, ze gdy chce mieć zmienną w pamięci eeprom, i chce jej używać we wszystkich plikach *.c muszę w pliku *.h dać nie tylko extern, ale też na gorze #include <avr/eeprom.h> i wszystko działa jak powinno... ale nie do końca... czy jeżeli w programie mam TYLKO odczyt z pamięci eeprom to coś się dzieje z jej zawartością w uC? chodzi mi o to, czy jeżeli ją wgram a później zgram to powinno być to samo?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2013, o 18:52 
Offline
Moderator
Avatar użytkownika

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

Posłuchaj - pewnie nie oglądałeś tego poradnika a obiecuję że znajdziesz w nim WSZYSTKIE odpowiedzi na swoje pytania a nawet więcej, bo teraz to mnie ciarki przechodzą po plecach na myśl o tym co ty chcesz robić (to co piszesz na końcu) jakieś wgrywanie zmiennych , zgrywanie .... na prawdę - te poradniki tworzę nie ot tak sobie .... mówię ci obejrzyj go

http://mirekk36.blogspot.com/2012/11/av ... iazek.html

nie wspomnę że też będziesz miał uzupełnienie na temat tworzenia plików projektu.

Wspominam o tym poradniku bo ty piszesz że gdzieś tam znalazłeś coś w googlach na temat zmiennej itp ... a masz wszystko pod ręką na moim blogu.

_________________
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: 1 sty 2013, o 18:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 gru 2012
Posty: 530
Lokalizacja: Bydgoszcz
Pomógł: 8

Jeśli Twój program tylko odczytuje dane z pamięci EEPROM, to póki tych danych sam nie skasujesz lub nadpiszesz, to nic z nimi się nie stanie.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2013, o 18:59 
Offline
Moderator
Avatar użytkownika

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

kila napisał(a):
Jeśli Twój program tylko odczytuje dane z pamięci EEPROM, to póki tych danych sam nie skasujesz lub nadpiszesz, to nic z nimi się nie stanie.


Przy każdorazowym programowaniu procka zostaną skasowane, dzieje się tak dlatego że domyślnie fusebit EESAVE jest zaprogramowany i dobrze zresztą tak powinno być. Rozwiązaniem nie jest jego kasowanie tylko takie podejście np jak w poradniku który przygotowałem bo pokazuję sposób na rozwiązanie WSZYSTKICH problemów dotyczących trzymania zmiennych w EEPROM. Przy czym wspominam nie tylko o problemach które padły w pytaniu ale też przyszłe z którymi się autor spotka jeśli się nie zapozna z tym aby przetrzymywać zmienne w eeprom zebrane w struktury i jak z nimi postępować i dlaczego tak. Wybaczcie że tego tu nie będę opisywał ponownie skoro tak dokładnie pokazałem to w poradniku.

_________________
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: 1 sty 2013, o 19:07 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Poradnika jeszcze nie oglądałem... muszę go ściągnąć pod noc, bo tak mi wszystkie limity załatwi :) obiecuje, że jak będę miał chwilę (pod noc) to pobiorę go (w sumie to je, bo jest ich kilka) :) a pytam się, bo w momencie gdy wgrywam program dopiero po wgraniu eepromu wszystko działa, nawet jak wgram ten sam program. I w uC w magiczny sposób plik eep się rozrasta :D No ale dobrze.. aby nikogo nie denerwować nie zadaje więcej pytań przed obejrzeniem...



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

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

Piotrek121 napisał(a):
No ale dobrze.. aby nikogo nie denerwować nie zadaje więcej pytań przed obejrzeniem...


Nie nie - to nie o to chodzi że denerwujesz - jak go obejrzysz to się mocno zdziwisz i w TRY MIGA zmienisz swój program i dodatkowo ZOBACZYSZ będziesz miał ZERO danych po kompilacji w EEP ;) ... i to będzie dobrze a wszystko będzie działać .... tak zagadkowo ci na to powiem

bo już widać że idziesz TOTALNIE złą ścieżką i mam nadzieję że się ucieszysz z tego rozwiązania, które zobaczysz ;)

_________________
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: 1 sty 2013, o 21:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 gru 2012
Posty: 530
Lokalizacja: Bydgoszcz
Pomógł: 8

mirekk36 napisał(a):
kila napisał(a):
Jeśli Twój program tylko odczytuje dane z pamięci EEPROM, to póki tych danych sam nie skasujesz lub nadpiszesz, to nic z nimi się nie stanie.


Przy każdorazowym programowaniu procka zostaną skasowane, dzieje się tak dlatego że domyślnie fusebit EESAVE jest zaprogramowany i dobrze zresztą tak powinno być. [...]


A to pardon czyt. pardą :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2013, o 23:42 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Obejrzałem poradnik o eeprom, jednak nie obyło się bez moich problemów :D mam w pliku common.h :

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



w mainie dalem funkcje odczyt_eeprom(); a w common.c

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


i przy eeprom_read_block( &ram_dane, &ee_dane, sizeof(ram_dane) ); wywala mi:

Multiple markers at this line
- 'ram_dane' undeclared (first use in this
function)
- 'ee_dane' undeclared (first use in this
function)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 sty 2013, o 23:50 
Offline
Moderator
Avatar użytkownika

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

No a czy nie zapomniałeś dać w common.c inkluda

#include "common.h"

????

to jedno - jeśli nie zapomniałeś to teraz pomyśl

w common.h masz DEKLARACJE zmiennych

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


ale to są TYLKO DEKLARACJE - i ok - w poprawnym miejscu - jednak nie pokazałeś swojego common.c - więc można tylko podejrzewać że tam nie zrobiłeś DEFINICJI tych dwóch zmiennych ??? zgadza się ??? ( a teoretycznie już niby wiesz czym się różni deklaracja od definicji ;) tyle że teraz poznajesz to w praktyce wieloplikowej)

jak coś to podaj większe fragmenty tych twoich plików common.h i common.c bo jak widzisz z tych kawałków można się tylko próbować domyślać co masz a czego możesz nie mieć 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: 3 sty 2013, o 00:00 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

Aż wstyd sie przyznać, ale zapomniałem :oops: ale to i tak nie zmieniło za dużo, bo wywaliło teraz:

common.c:(.text+0x15a): undefined reference to `ram_dane'
common.c:(.text+0x15c): undefined reference to `ram_dane'
common.c:(.text+0x15e): undefined reference to `ee_dane'
common.c:(.text+0x160): undefined reference to `ee_dane'

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sty 2013, o 00:21 
Offline
Moderator
Avatar użytkownika

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

No dobrze nie ma się czego wstydzić ale teraz brakuje tych DEFINICJI zmiennych w *.c rozumiesz ?

_________________
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: 3 sty 2013, o 00:36 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

ajj i kolejny zonk... właśnie tak dawałem, i się dziwiłem czemu nie działa, tylko błąd wywala... a nie w tym pliku definiowałem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sty 2013, o 00:41 
Offline
Moderator
Avatar użytkownika

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

DEFINICJE tych zmiennych powi ienes miec w common.c natomiast DEKLARACJE miales dobrze przeciez w common.h ;)

_________________
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: 3 sty 2013, o 00:43 
Offline
Użytkownik

Dołączył(a): 18 mar 2012
Posty: 55
Pomógł: 0

chodziło mi o:
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: 3 sty 2013, o 00:48 
Offline
Moderator
Avatar użytkownika

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

No toz mowie ze to sa DEFINICJE tych zmiennych i powwinienes j dac w common.c a w pliku common.h zostawic tak jak miales ich DEKLARACJE rozumiesz ???

_________________
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: 51 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

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