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



Teraz jest 21 lut 2025, o 22:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 10 cze 2015, o 08:57 
Offline
Nowy

Dołączył(a): 14 lip 2014
Posty: 9
Pomógł: 0

Witam forumowicze :)

Chciałbym Was zapytać czy wiecie może jak usunąć błąd? W funkcji main ustawiam flagę zadeklarowaną jako zmienną globalną, natomiast w przerwaniu następuje sprawdzanie jej stanu co 1sek. Warunek sprawdzający czy flaga==1 nie działa poprawnie, mimo że warunek ten jest zawsze spełniony (flaga=1 w pętli nieskończonej while).

Sposób 1(działający, ale bez sprawdzania flagi, której potrzebuję):

Źle wstawiony kod - Różowo-zielony J.

Sposób 2(niedziałający nie działa if(flaga==1) w funkcji przerwania ISR):

Źle wstawiony kod - Różowo-zielony J.

W podglądzie mojego postu niepoprawnie wypisało define (bez PA7), dlatego tu zamieszczam jeszcze raz definicje:
#define reset_ON PORTA &=~(1<<PA7)
#define reset_OFF PORTA |= (1<<PA7)
Na pewno błędu nie powoduje _delay_ms(100) umieszczony w funkcji reset_BT (w przerwaniu), ponieważ w Sposobie nr1 nie powodował problemów. Macie może jakieś fajne pomysły? Wydaje mi się, że popełniam jakiś elementarny błąd. :)

P.S.
Za mądre odpowiedzi daję + :)

------------------------ [ Dodano po: 14 minutach ]

Ponownie wstawiam kod programu:

Sposób 1(działający, ale bez funkcji sprawdzania flagi w przerwaniu)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Sposób 2 (niedziałający - nie działa funkcja sprawdzania flagi w przerwaniu):
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: 10 cze 2015, o 09:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Tylko się nie śmiej: co to za warunek?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2015, o 09:59 
Offline
Moderator
Avatar użytkownika

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

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.html

gwarantuję, ż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ą

_________________
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 cze 2015, o 11:07 
Offline
Nowy

Dołączył(a): 14 lip 2014
Posty: 9
Pomógł: 0

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:
Składnia: [ Pobierz ] [ Ukryj ]
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.
Składnia: [ Pobierz ] [ Ukryj ]
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.html

gwarantuję, ż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.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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