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



Teraz jest 18 gru 2024, o 03:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 43 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 30 sty 2019, o 12:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Po poprawieniu w pliku menu.c nie mam błędów.
Nie kompiluje się do hex, ale w konsoli jest "multiple definition ...".
Obrazek
Nie wprowadzałem zmian w plikach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sty 2019, o 15:23 
Offline
Moderator
Avatar użytkownika

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

Wirnick napisał(a):
"multiple definition ...

no a co dalej po tych kropkach masz ? .... jak byk "of main"

czyli masz w projekcie co najmniej dwa pliki z funkcją main - to jak chcesz żeby ci się to skompilowało - czytaj komunikaty do końca ;)

_________________
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 sty 2019, o 16:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Znalazłem babol - w pliku "pwm.c" był drugi main. Skasowałem plik i jest OK.
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2019, o 11:06 
Offline
Użytkownik

Dołączył(a): 17 gru 2018
Posty: 29
Pomógł: 0

Sprawdziłem kod na płytce, przypisałem również klawisze do sterowania, natomiast wymagany jeszcze jest timer do odświeżania LCD , żeby to wszystko działało. No i za bardzo mi to nie wychodzi...Sprawdziłem w GB inicjalizację mechanizmu buforowania LCD void buf_lcd_init(void), natomiast wykorzystane jest tam zdarzenie barrel, którego nie mam swoim kodzie. Czy ktoś mógłby pomóc mi z timerem w inny sposób do moich bibliotek i funkcji?

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


menu.h :

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


przyciski do sterowania :

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


Będę wdzięczny za wszelką pomoc, trochę mnie czas goni, a ja już czuje zmęczenie z tego wszystkiego :|



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2019, o 15:15 
Offline
Użytkownik

Dołączył(a): 17 gru 2018
Posty: 29
Pomógł: 0

Próbowałem w taki 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.


oraz zdjęcie efektu przed i po timerze...
Obrazek

mam nadzieję, że jakaś świeża głowa to wyłapie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2019, o 15:31 
Offline
Moderator
Avatar użytkownika

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

Gammadion napisał(a):
mam nadzieję, że jakaś świeża głowa to wyłapie

Moja głowa nie jest już taka świeża bo latka lecą - no ale ten program z twoją funkcją main() nie ma prawa w ogóle działać, po starcie od razu się zawiesi, wyłączy przerwania i tak będzie wisiał w nieskończoność.

Zajrzyj jednak do Bluebooka do podstaw - polecam - tym bardziej, że masz Bluebooka ...

co MUSI być w funkcji main() ?

chyba pętla główna - a u ciebie jest ?

_________________
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 sty 2019, o 15:41 
Offline
Użytkownik

Dołączył(a): 17 gru 2018
Posty: 29
Pomógł: 0

Ajj teraz spojrzałem, nie wrzuciło mi się main.c po poprawkach. Wygląda to teraz tak:

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: 31 sty 2019, o 18:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1164
Lokalizacja: Kraków
Pomógł: 93

A gdzie włączasz timer? Masz zakomentowaną konfigurację. Może gdzieś w funkcji jest? Ale nie wywołujesz tego...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2019, o 13:35 
Offline
Użytkownik

Dołączył(a): 17 gru 2018
Posty: 29
Pomógł: 0

wywołuje w buf_lcd_init(), której timer jest opisany na samym dole w menu.c. Tamten chwilowo zakomentowałem, jego odkomentowanie nie pomaga.

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: 2 lut 2019, o 15:52 
Offline
Użytkownik

Dołączył(a): 22 kwi 2017
Posty: 99
Lokalizacja: Piła
Pomógł: 4

W procedurze obsługi przerwanie timer_flag ustawiasz na 1(co 16,38 ms) i w pętli głównej dwa posty wyżej timer_flag też ustawiasz na 1, a więc co obieg pętli. To chyba nie powinno tak być. Musisz sprawdzić czy odpala Ci się przerwanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2019, o 20:50 
Offline
Użytkownik

Dołączył(a): 17 gru 2018
Posty: 29
Pomógł: 0

timer_flag wyrzuciłem. Zrobiłem to w inny sposób. Zmieniłem funkcję lcd_refresh, w taki sposób aby mogła być wywoływana w pętli głównej i żeby można było sprawdzać flagę zajętości:

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


Co do timera0 - ustawiony na reagowanie na przepełnienie, przerwanie overflow:

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


pętla główna :

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


Wynikiem jest napis programator + ">" i litera "A" w 2 wierszu, 2 kolumnie.
Mogę się mylić ale brakuje jakiejś zmiennej w funkcji buf_lcd, źle rozpisaną mam obsługę przerwania albo brak zmiennej w pętli while(). Użyłem też takiego sformułowania : while(check_BF()!= 0x80). Po tym mam coś takiego:
Obrazek

Jeżeli ktoś miałby chwilę i chęci żeby rozpisać mi jak to powinno wyglądać, żeby menu zadziałało, innymi słowy dał tą przysłowiową "rybę", to będę niezmiernie wdzięczny. Pozwoli mi to ruszyć dalej z programem, a na tę chwilę jestem w kropce.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2019, o 21:58 
Offline
Moderator
Avatar użytkownika

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

No to żeś panie narobił sobie grochu z kapustą - że aż strach ... aż ciężko to analizować ... po prostu koszmar

pomijam już milczeniem to, że w procedurze obsługi przerwania wykonujesz tak drastycznie długotrwałe operacje jak wyświetlanie na LCD to jeszcze do tego można powiedzieć, że wyrżnąłeś "wątrobę" ze zdrowego organizmu :lol: czyli mechanizm sprawdzania flagi zajętości LCD i przyszyłeś tę wątrobę poza ustrojem, czyli gdzieś w kodzie głównym programu - no masakra ;) i ty się dziwisz że coś ci tam nie działa ... a jeszcze tą jakąś funkcją lcd_refresh() chlastasz jak maczetą po całym ciele ... oczywiście ciele programu nawet w przerwaniach ... Panie panie - taki program ma prawo a nawet obowiązek działać dokładnie jak teraz ci działa - czyli nie działa ...

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

ja bym na twoim miejscu - stworzył mały projekt testowy najpierw tego z czym masz problem i łatwiej byłoby ci testować - ale wywal że z tego testu ten cały zbędny balast czyli coś tam z silnikami nie silnikami itp

Już nie wspomnę, że w GB masz przykład takiego buforowanego wyświetlania, który działa idealnie i widziałeś tam gdzieś takie rzeczy jakie zrobiłeś w swoim kodzie czyli to wybebeszanie biblioteki LCD ? albo co gorsze wyświetlanie na LCD w przerwaniach ? Wszędzie się trąbi i na forum ale i w Bluebooku co i rusz piszę aby przerwania były jak najkrótsze a ty tam LCD zasadzasz - no to tak ... to jak tu w ogóle coś pomóc jak idziesz kompletnie pod prąd

_________________
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 lut 2019, o 13:23 
Offline
Użytkownik

Dołączył(a): 17 gru 2018
Posty: 29
Pomógł: 0

No nieźle, nieźle ;) Tak więc wziąłem sobie do głowy Wasze rady. Wywaliłem tę lcd_refresh i wróciłem do poprzedniej postaci :

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


Tak samo zrobiłem key_init, wyrzuciłem(zakomentowałem) niepotrzebne na razie funkcje, powołałem zmienną volatile uint8_t fRefresh i main.c wygląda następująco :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w menu.c timer (<- czy jest dobrze opisany?? )
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dziobak7 napisał(a):
Inna ważna rzecz. Jeśli masz 3 poziom zagnieżdżenia w funkcji, to jest coś nie tak z Twoim rozumieniem kodu (pominę wyjątki bo to nie jest na tyle skomplikowana aplikacja).
3 poziom zagnieżdżenia funkcji - który fragment masz na myśli?

dziobak7 napisał(a):

Następne... jeśli masz gdzieś zmienną typu flaga, z zasady powinna być ustawiana w 1 miejscu (znanym Ci) i testowana oraz ew. gaszona w 2. Dodatkowo, jej zmiana (czyli zapis), prawie zawsze powinna być zabezpieczona operacją atomową (poczytaj o ATOMIC_BLOCK). A jak jest teraz?


Trochę poczytałem o tym, ale czy to jest tak potrzebne do mojego kodu i nie można pozostać przy timerze? Ewentualnie opierając się na powyższym kodzie z timerem i przerwaniami, jakbyś to zrobił, wykorzystując ATOMIC_BLOCK?

dziobak7 napisał(a):
Dodaj do kompilatora flagi:

-Wall -Wextra -Wshadow -pedantic

Masz to wydzielone w opcjach kompilacji w eclipse. Inne flagi są także bardzo przydatne ale powyższe wystarczą by pokazać Ci kilka(naście) potencjalnych błędów jakie popełniłeś. Przyjmij zasadę (na początek) że kod ma się kompilować bez ostrzeżeń.
Gdzie dokładnie mogę to znaleźć w eclipsie? Co do samej kompilacji kodu, nie wyrzuca mi żadnych błędów i ostrzeżeń.



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: 43 ]  Przejdź na stronę Poprzednia strona  1, 2

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO