Antystatyczny napisał(a):
Hmm, ciekawy warunek... Przyznaję, że zaglądałem w ten kod, ale to mi umknęło. Myślę, że chodziło mniej więcej o to: Jeżeli licznik sekund jest różny od zero oraz naliczył taką ilosć, że operacja modulo 3 zwraca zero, to zresetuj bluetooth. Hmm, wydaje mi sie, że to moze działać, ale ja bym onawiasował obie części warunku, czyli:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ten warunek z sekundami działa, tylko chodzi mi o tą flagę i warunek flagi, który w przerwaniu powinien być (w tym przypadku) zawsze spełniony i wykonany. W moim szerszym projekcie urządzenie bt łączy się w trybie master automatycznie z różnymi urządzeniami BT. Chodzi o to, że w przypadku nawiązania połączenia z nieodpowiednim urządzeniem, takim jak jakiś telefon komórkowy przechodnia i w przypadku nieodebrania danych (ponieważ urządzenie takie nie należy do systemu) po 3 sek musi nastąpić automatyczne zerwanie połączenia bluetooth. W przypadku nawiązania połączenia z urządzeniem bt należącym systemu następuje wymiana danych i rozłączenie się. W funkcji odbiorczej używam standardowej funkcji odbioru danych zawartej w katalogu atmega32, która będzie czekała w tym miejscu kodu na odebranie danych.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nie mogę także na sztywno sparować moich obu układów z modułami BTM222, ponieważ do systemu należało będzie wiele układów z modułem BTM222 i zapisanie ich wszystkich w pamięci mikrokontrolera jest niemożliwe.
Niestety mogę załączyć tylko drobną część mojego kodu dotyczącą mojego problemu, jak ta wspomniana wcześniej w "Sposób 1", ponieważ jest to kawałek mojej pracy dyplomowej i nie mogę na obecną chwilę udostępnić pełnej jej zawartości.
Reasumując zastanawia mnie tylko dlaczego warunek if (flaga==1) sprawdzany co 1sek nie uruchamia się, mimo że cały czas w main w pętli while flaga=1. Trochę dziwna sytuacja, bo powinno to działać. Mogę prosić o pomoc? (tak na wszelki wypadek sprawdziłem czy ten warunek, o którym Pan wspomniał naprawi problem, ale nie niestety pomogło)
------------------------ [ Dodano po: 46 minutach ]mirekk36 napisał(a):
1. a po co kolega inicjalizuje zerami zmienne na początku kodu ? to kompletnie niepotrzebne - robi to kompilator
2. z tą flagą ustawianą w pętli głównej programu i próbą obsługi tego w przerwaniu to kolega przesadził o tyle - że widać, że nie rozumiesz na razie kompletnie idei działania tego typu programowych flag. Toż w pętli głównej wciąż milion razy na sekundę ją ustawiasz więc czego innego się spodziewasz w przerwaniu niż 1 ?
Na prawdę proponuję zacząć naukę C od książki:
http://atnel.pl/mikrokontrolery-avr-jezyk-c.htmlgwarantuję, że nie tylko kwestia flag się wyjaśni ale jeszcze mnóstwo innych rzeczy
PS jeśli zmienna licznik jest wykorzystywana TYLKO w przerwaniu to niepotrzebny jest specyfikator volatile, ba! nie ma sensu jej robić jako zmienną globalną - a dać jako statyczną właśnie w przerwaniu .... I o tym też jest w Bluebooku dlatego go polecam bo widzę, że sporo jeszcze przed kolegą
Ad.2) Spodziewam się tylko wartości flaga=1 i wykonania warunku w przerwaniu ISR if (flaga==1). Jest to miniprogram i chciałem tylko, aby w przerwaniu następowała reakcja na ustawioną flagę, jednak wtedy program nie reaguje i zastanawia mnie to dlaczego tak się dzieje. Z mojego punktu widzenia wynik działania programu przedstawionego w "sposób 1" powinien być taki sam jak wynik programu opisanego w "sposób 2", lecz zasada działania nieco inna.