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



Teraz jest 19 kwi 2024, o 19:19


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 17 lip 2020, o 18:04 
Offline
Użytkownik

Dołączył(a): 22 mar 2017
Posty: 80
Pomógł: 5

Witam,
Piszę prosty program który ma sterować elektrozaworem hydraulicznym. Dawno nie pisałem w C, więc wybaczcie może prosty temat...
Po włączeniu zasilania modułu, jeśli nawet sygnał sterujący jest podany to elektrozawór nie może się włączyć. (chodzi o to, gdyby ktoś zostawił przełącznik w pozycji załączony a maszynę wyłączył, to po ponownym uruchomieniu nie może się ten zawór otworzyć, tylko trzeba cofnąć przełącznik sterujący do pozycji wyłączony i załączyć ponownie).
Poniżej warunek który to sprawdza (gdy wraz z zasilaniem podany jest sygnał sterujący, ma sygnalizować to miganiem dwóch diod LED):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jest on umieszczony zaraz na początku funkcji main, po inicjalizacji portów, przetwornika ADC, zmiennych itd.
Chodzi o to, że gdy nie dam tego _delay_us(1); lub jakiejkolwiek innej instrukcji to procek wchodzi w pętlę, ale nie wykonuje się instrukcja if, układ jest resetowany przez WDT, nawet jak ustawię WTD na 2s... Ale w pętlę wchodzi, ponieważ gdy zabiorę sygnał sterujący, to ładnie wychodzi z tego warunku i działa dalej normalnie. Sprawdziłem to wyłączając WDT - jest w pętli, tylko nie wykonuje instrukcji warunkowej. Zmienną "tog_led" ustawiam w przerwaniu od ADC w trybie FreeRun. Dlaczego musi być dosłownie "cokolwiek" dopisane w samej pętli żeby to działało?
Program pisany w AtmelStudio 6.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2020, o 20:36 
Offline
Użytkownik

Dołączył(a): 09 lut 2017
Posty: 73
Lokalizacja: 51°03′22″N 15°45′48″E
Pomógł: 18

zmienna "tog_led" jest zdefiniowana jako volatile?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2020, o 20:43 
Offline
Użytkownik

Dołączył(a): 22 mar 2017
Posty: 80
Pomógł: 5

Nie, jako zwykła zmienna.
Ale dzięki wielkie za podpowiedź, zadeklarowałem jako volatile i zaczęło działać poprawnie! :)
Pytanie tylko dlaczego wcześniej nie chciało - chodzi mi o przyczynę, i dlaczego dodanie jakiejkolwiek instrukcji do tej pętli spowodowało, że już działała dobrze?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2020, o 21:15 
Offline
Użytkownik

Dołączył(a): 09 lut 2017
Posty: 73
Lokalizacja: 51°03′22″N 15°45′48″E
Pomógł: 18

Kompilator optymalizuje instrukcje ze zwykłymi zmiennymi. Obstawiam, że jeśli zmienna "tog_led" ma na początku wartość zero i nie zmienia się w głównym programie to kompilator wyrzuca z kodu wszystkie instrukcje, które nie mają szansy się wykonać. W tym wypadku pewnie cały pokazany przez Ciebie kod zaczynający się od if (ON_SIG). Dodanie jakiejkolwiek instrukcji w pętli while wymusza jej bezwarunkowe wykonanie więc kompilator dołącza resztę instrukcji i zaczynają działać normalnie. Dlatego zmienne używane w przerwaniach powinny być deklarowane jako volatile, nie są one wtedy optymalizowane i pomijane w głównym programie.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lip 2020, o 21:25 
Offline
Moderator
Avatar użytkownika

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

arturssp napisał(a):
zadeklarowałem jako volatile i zaczęło działać poprawnie!

W ikonkach widać że masz Bluebooka - sięgnij do niego i poczytaj o volatile, poza tym dodatkowo rozszerzenie tej wiedzy o szczegóły na blogu (gdzie akurat jest opisany nomen omen - praktycznie twój przypadek)

https://mirekk36.blogspot.com/2011/08/test.html

i na przyszłość zapamiętaj to o czym mowa w BB n/t volatile ;) będzie mniej rwania włosów z głowy


Autor postu otrzymał pochwałę

_________________
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: 17 lip 2020, o 21:47 
Offline
Użytkownik

Dołączył(a): 22 mar 2017
Posty: 80
Pomógł: 5

Mirku! - Wszystko się zgadza, mam BB, GB.. chodzi o to, że nie pisałem nic od 2 lat (niestety praca, brak czasu itd.).. A jak się czegoś nie robi, to z głowy wylatuje i później taki niby błahy ale problem..
Dzięki za podpowiedź.
Jedynie interesuje mnie jedna rzecz - dlaczego dodanie jakiejś dowolnej instrukcji w pętli spowodowało, że działało? Chodzi o optymalizację kompilatora, coś nagle innego "zobaczył" ?

W zasadzie zauważyłem, że nie jest potrzebne dawanie tego warunku if(ON_SIG) a za chwilę pętli while(ON_SIG)... wystarczy sama pętla, też działa poprawnie.
Ale może niech mnie ktoś poprawi jeśli się mylę ...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lip 2020, o 05:05 
Offline
Moderator
Avatar użytkownika

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

Wyżej ci kolega Adam12 wyjaśnił - jak nie było volatile to kompilator uznał że w ogóle nie jest potrzebne całe wnętrze wahile bo po co ? skoro nic nie robi. Masz zawsze plik *.lss w folderze RELEASE po kompilacji, to wersja twojego programu w Asemblerze, wystarczy zajrzeć i przekonać się co i jak zoptymalizował kompilator i co zniknęło.


Autor postu otrzymał pochwałę

_________________
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: 18 lip 2020, o 08:18 
Offline
Użytkownik

Dołączył(a): 22 mar 2017
Posty: 80
Pomógł: 5

Wszystko się zgadza, przeoczyłem post Kolegi Adam12..
Dziękuję za odpowiedzi, wszystko jest już jasne :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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