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



Teraz jest 30 mar 2026, o 18:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 26 ] 
Autor Wiadomość
PostNapisane: 10 paź 2014, o 12:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Szanowni Państwo forumowicze. Po długich pertraktacjach z moim programem przegrałem batalię i w związku z powyższym proszę o wsparcie duchowe, fizyczne żebym mógł tego dziada pokonać.

Zatem od początku. Na samym początku programu mam zainicjowane niektóre zmienne w taki oto 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.


Następnie po inicjacji wyświetlacza, innych urządzeń peryferyjnych, ustawieniu wszystkich wejść i wyjść oraz włączeniu przerwań mam następujący kod:

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

I tu pojawia się problem. Otóż pętla wykonuje się tylko jeśli urządzenie jest <3 czyli tak for(urzadzenie=1;urzadzenie<3;urzadzenie++) (może to być 1, 2 lub 3. Powyżej tego pętla się zapętla w nieskończoność.
Żeby nie było niedomówień delay i PORTA dałem żeby migać i widzieć miganie. W podstawowej wersji programu tego nie było ale też pętla się nie kończyła i program nie przechodził dalej. Odczyt w ten sposób (i zapis) działa gdyż w innej części programu używam podobnych wyrażeń żeby odczytać (zapisać) każdą daną ze struktury i nawet ją wyświetlam po odczycie. Wartość jest poprawna.



Dodatkowo gdzieś w jednej z procedur mam taki zapis

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


Oczywiście wcześniej pobieram dane z RTC i są one poprawnie pobierane bo je też wyświetlam na ekranie. Niestety każda procedura (czy to obsługa timera czy jakaś inna) w ogóle nie chce działać jeśli jest tam ta linijka kodu. Usunięcie tej linijki powoduje, że procedura działa bez problemu. Dane struktury są typu uint8_t
Największa liczba jaką zapisuje do zmiennej teraz jest równa 23*60+59 czyli 1439 i mieści się w zmiennej typu uint16_t.


Cały program znajduje się na procesorze MEGA32 zajmuje około 8kb Flasha i 60% RAM także nie martwię się, że nadpisuje sobie stos (chyba).

Ma ktoś pomysł co spartoliłem?

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 12:21 
Offline
Moderator
Avatar użytkownika

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

Moim zdaniem ... ale mogę się mylić - to ta pętla się nie zapętla w nieskończoność bo nie ma jak się zapętlić ....

tylko program ci się gdzieś restartuje i masz taki efekt .... ale gdzie się restartuje ? kto wie ? może nie dałeś gdzieś procedury obsługi jakieś przerwania albo inne rzeczy

Pomijam już fakt , że obsługujesz eeprom jedną z najgorszych metod .... polecam obejrzeć mój poradnik na ten temat i TYLKO raz przy starcie wczytać dane z eeprom do identycznej struktury w RAM i na niej program może pięknie działać... A do eeprom można zawsze zapisać gdy przyjdzie taka potrzeba ...

_________________
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: 10 paź 2014, o 12:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Mirku, rzeczywiście może to być reset programu bo ostatnie mignięcie diody jest jakieś takie krótkie. Pętla w każdym razie nigdy nie przechodzi dalej bo po pętli następuje zapalenie czerwonej diody i zmazanie ekranu powitania. To nigdy nie nastepuje. Ba, dioda czerwona nawet nie myśli by mignąć, a jedna z diod mrugających lekko się zaświeca i gaśnie gaśnie. Tak, wygląda rzeczywiście to jak reset i dzieje się po ostatniej instrukcji w pętli.

Co do tego co mówisz - odczytywania do RAMu i tam działania na tym to właśnie po to utworzyłem tą strukturę. Ona jest wczytywana z eeprom tylko raz właśnie w ten sposób. Wiem, że to najgorszy z możliwych sposobów ale na początku miałem trochę inną wizję i nie chce mi się przerabiać kodu. W każdym razie ta pętla wykonywana jest tylko po resecie (brak zasilania) i nigdy więcej.

Więc co może być problemem?
Przy pięciu urządzeniach nie zahaczam nawet o połowę pamięci EEPROM

I co z ta zmienną "teraz"? Przecież obliczenie tego typu nie jest aż tak bardzo wymagające żeby procesor nie chciał nawet tego wykonać, a jak dla mnie procesor strzela focha i mówi, że nie będzie mnożyć :/

Dodam też, że mam wyłączoną jakąkolwiek optymalizację bo na początku myślałem, że to wina tego.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 12:50 
Offline
Moderator
Avatar użytkownika

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

Zrozum to wcale nie musi być reset po którejś linii pętli ... tylko jeśli zapomniałeś np jakiegoś wektora przerwań uzupełnić to może strzelać ten reset w różnych momentach programu

_________________
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: 10 paź 2014, o 12:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Mea culpa. Źle napisałem. Zajętość RAM 40% :) czyli 60% wolnego

Mirku, wszystko działa poprawnie po usunięciu pętli jak również przy 3,2,1 obiegach pętli. Wywala się jeśli urzadzenie >= 4. Co ciakawe obliczenia mignięć diod wskazują na zawsze ten sam moment +/- kilka mikrosekund :D.
Jeśli bym zapomniał uzupełnić jakiegoś wektora to wywalałoby się zawsze, prawda?

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:04 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Jeśli bym zapomniał uzupełnić jakiegoś wektora to wywalałoby się zawsze, prawda?


no tak ... więc to dziwne i pewnie na końcu okaże się to jakimś mega banalnym ale upierdliwym BUG'iem

_________________
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: 10 paź 2014, o 13:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Narazie będę z tym walczył w wolnych chwilach. Ale jakby ktoś miał jakiś pomysł... Czekam z zapartym (tu wpisz właściwe słowo)

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:26 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Zmienne 'urządzenie' i 'czas_dzialania' modyfikujesz w przerwaniu (są volatile)?

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Tak, dlatego są volatile.

------------------------ [ Dodano po: kilkunastu sekundach ]

Muszę mieć do nich dostęp z każdego punktu programu

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:33 
Offline
Moderator
Avatar użytkownika

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

WoodPaker napisał(a):
Muszę mieć do nich dostęp z każdego punktu programu


Ale możesz mieć dostęp z DOWOLNEGO punktu programu .... i nie musi być volatile jeśli nie ma potrzeby dostępu z przerwania. Więc jeśli nie działasz na nich w przerwaniu to na pewno możesz wywalić volatile

_________________
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: 10 paź 2014, o 13:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Wiem Mirku ale jak wspomniałem wyżej działam na tych zmiennych w przerwaniu.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

WoodPaker napisał(a):
Wiem Mirku ale jak wspomniałem wyżej działam na tych zmiennych w przerwaniu.


Rozumiem że tej pętli nie masz w ciele tego przerwania?

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:41 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Ale modyfikuje w przerwaniu? W takim razie pętla for to lipa bo nigdy nie wiadomo jaką zmienna urządzenie ma wartość w danym punkcie pętli. W jednej iteracji w najbardzije ekstremalnym przypadku może mieć inną wartość przy testowaniu wartości, inną przy inkrementacji, inną przy czytaniu z eeproma a jeszcze inną, w tej samej instrukcji, przy zapisywaniu do tablicy czas_dzialania.
Poza tym operacje typu "urzadzenie+10" wyglądają, nie dość że całkiem nieczytelnie, to po prostu podejrzanie. Jesteś pewien, że odczyt nie jest gdzieś "z buraków"
....ale zaraz....makro eeprom_read_byte oczekuje wskaźnika jako argument a ty wstawiasz char

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:45 
Offline
Moderator
Avatar użytkownika

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

xor napisał(a):
Poza tym operacje typu "urzadzenie+10"


Dokładnie o tym pisałem na początku, że to masakra - ale ok ... może i dane lecą z kosmosu - nie mniej jednak sama operacja odczytu niby nie powinna przeszkodzić ... ciężko coś powiedzieć nie widząc reszty kodu bo pewnie pies jest pogrzebany wcale nie w tej pętli

------------------------ [ Dodano po: kilkunastu sekundach ]

chyba że nadal wszyscy czegoś nie widzimy jeszcze :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: 10 paź 2014, o 13:48 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

mirekk36 napisał(a):
może i dane lecą z kosmosu - nie mniej jednak sama operacja odczytu niby nie powinna przeszkodzić

A jak się czyta z eeproma spod adresu którego nie ma to nie nastąpi właśnie resecik?

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

A ja tak przy okazji zapytam czy ten średnik na końcu pętli jest do czegoś potrzebny, czy niema on większego znaczenia na jej działanie?

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:51 
Offline
Moderator
Avatar użytkownika

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

xor napisał(a):
A jak się czyta z eeproma spod adresu którego nie ma to nie nastąpi właśnie resecik?


Nie powinien - ustawiany jest tylko wskaźnik do odczytu ... (adres) i jeśli będzie np za wysoki niż pojemność eeprom to co najwyżej zostanie pobrana jakaś głupota z komórki odpowiadającej niższej wartości w młodszej części adresu ... Więc nie widzę powodu ale też upierać się nie bę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: 10 paź 2014, o 13:53 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

kurnachatka napisał(a):
czy ten średnik na końcu pętli jest do czegoś potrzebny, czy niema on większego znaczenia na jej działanie?

Jest niepotrzebny ale nie ma znaczenia. Można tam wstawić choćby i 100 średników i nic to nie zmieni

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 13:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

xor napisał(a):
Jest niepotrzebny ale nie ma znaczenia. Można tam wstawić choćby i 100 średników i nic to nie zmieni


Podziękował!!!
Bo się już kilka razy spotkałem z takim zapisem i myślałem że czymś nie wiem.

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2014, o 23:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Dobrze, odpowiadając na niejasności i pewne spostrzeżenia.
Otóż. Każde z tych odwołań do eeprom wywoływane poza pętlą zwraca właściwą wartość zapisaną wcześniej (ściągałem nawet eeprom żeby zobaczyć co jest zapisane). Nawet jeśli wywołuje w przerwaniu zmienną urządzenie to nie ma ona wartości nigdy większej niż 5. Zmieniłem, żeby nie była volatile i wykorzystuje w przerwaniu inną zmienną - nadal się psuje.

Reasumując. Program wywala się nadal w tym samym momencie, o którym wspominałem wcześniej. Wartości odczytywane w sposób KOCI są właściwe więc odwołania nigdy nie są poza pamięcią EEPROM. Zmienna urządzenie NIGDY nie przyjmuje wartości większych od 5. I ostatnie najważniejsze, nadal się wywala.

Owszem, mogę zmniejszyć liczbę urządzeń do 3 ale skoro mam na płytce 5 wyprowadzeń chciałbym móc z nich korzystać

I nadal zmienna teraz wstrzymuje dziłanie wszelkich prcedur :/

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 02:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Z głupot to: brakuje ci jednej gwiazdki przy rzutowaniu na wskaźnik - w pierwszym odczycie i "czas_dzialania" zaczynasz zapisywać od adresu 1, czyli pod 0 marnują się niepotrzebnie puste 4 bajty ;) Ale to nie powinno powodować wysypywania się programu raczej.


Autor postu otrzymał pochwałę

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 09:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Nie marnują się. Zaczynanie od 1 jest zamierzone ale tak jak mówisz to nie powinno mieć wpływu :)
A co do tej gwiazdki to nie rozumiem.
Wszędzie piszą w poradnikach o jednej gwiazdce

------------------------ [ Dodano po: 4 minutach ]

np tu
http://www.societyofrobots.com/member_t ... t/html/309

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 11:39 
Offline
Moderator
Avatar użytkownika

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

WoodPaker napisał(a):
Wszędzie piszą w poradnikach o jednej gwiazdce


No a ty nawet tej jednej nie masz ... rzeczywiście kolega Federerer ma sokole oko

_________________
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: 11 paź 2014, o 12:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Masz racje :)
Tyle, ze przy patrzeniu w ekran nie zauważyłem. Dziękować. Wieczorem sprawdzę czy zadziałało bo teraz nie mam jak. Po sprawdzeniu napiszę co i jak.
A czy ktoś ma pomysł dlaczego linijka z "teraz" blokuje działanie każdej procedury w której się znajdzie?
:/

------------------------ [ Dodano po: 35 minutach ]

Dziękować, dziękować i jeszcze raz dziękować.
Brak tej gwiazdki był przyczyną źle działającej pętli i nieoczekiwanego resetu procesora. Po dodaniu gwiazdki pętla działa.
Niestety nadal nie działa teraz
Więc od początku


Mój kod wygląda mniej więcej tak

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



A następnie w timerze sprawdzam odpowiedni warunek zaproponowany przez Szanownego Pana mokrowskiego

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



Przerwanie mam wywoływane co 30 sekund więc myślę, że obliczanie warunku trwa krócej.

Problem, który się pojawia to taki, że procedura w której znajduje się linia teraz=(hr*60)+mn; //ustaw warunek w ogóle nie chce się wykonywać. Problem znika gdy linię tę usunę. Tylko, że wtedy nie mam w ogóle obliczanego warunku "z teraz" :/

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 13:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

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

Nie dostajesz tutaj warninga ani nic?

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2014, o 22:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Pisałem to z reki, a nie kopiowałem. W kodzie jest dobrze.
Reszta jest kopiowana.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



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

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