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



Teraz jest 8 lis 2024, o 22:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 30 maja 2015, o 18:24 
Offline
Nowy

Dołączył(a): 25 mar 2015
Posty: 5
Pomógł: 0

Witam,

Mam problem z projektem, który muszę wykonać na uczelni, gdyż przyznam szczerze, nie do końca ogarniam temat przerwań w mikroprocesorach, a tym bardziej w Arduino Uno, w które sam się niestety wkopałem...
Do wykonania mam Sterownik diod RGB. Do czasu, gdy nie musiałem używać przerwań, to wszystko było w miarę `okej`. Jednak prowadzący uparł się, bym te przerwania wykorzystał. Powiedział, bym w moim programie do opóźnień pomiędzy zmianami kolorów diod nie używał funkcji delay(), a zastosował przerwania właśnie. No i nie bardzo potrafię to wykonać. Jeśli byłby ktoś w stanie pomóc, to byłbym niezmiernie wdzięczny :)

Zamieszczę poniżej poglądowy schemat układu oraz kod programu, który aktualnie posiadam. W programie jest if() zmieniający wartośc zmiennej `i`, która służy do wybrania podprogramu za pomocą switch'a.
Dla case'a 6 wykonywana jest funkcja miganie(), która oparta jest o delay'e.
W case'ie 7 próbowałem w funkcji policja() jakoś pozbyć się delay'a za sprawą funkcji opoznienie().
Jednak poza tym, że nie chce to działać odpowiednio (kolory czerwony i niebieski świecą się cały czas, a przynajmniej tak to wygląda), to w dodatku prowadzący zwrócił uwagę, iż ponownie zamykam się w podprogramie i zajmuję czas procesora.
Nie bardzo wiem w jaki sposób odłączyć ten podprogram od pętli głównej, by nie zajmować czasu procesora (by w teorii można było równolegle wykonywać inne czynności)...

Prosiłbym o pomoc w rozwiązaniu tego problemu.. Każda sugestia wykonania byłaby niezmiernie dla mnie cenna :)


Schemat: (wejścia diod różnią się od aktualnego położenia, ponieważ tamte wykorzystywane są przez Timer1)
Obrazek


Kod:
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: 30 maja 2015, o 22:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

MarcineQ napisał(a):
a tym bardziej w Arduino Uno, w które sam się niestety wkopałem...


Dlaczego wszyscy macie jakieś ale negatywne do Arduino ?? To zaczyna być plagą ....
To tylko płytka z prockiem nic więcej jak nie radzisz sobie z AVR to nie zwalaj na arduino ...

a teraz ....
możesz też tak ... topic161.html ....

Arduino UNO obsługuje
--- przerwania wewnętrzne od timerów co masz zrealizowane a opis np tu http://www.instructables.com/id/Arduino ... nterrupts/


--- przerwania zewnętrzne na pinach 2 i 3 odpowiednio INT0 i INT1 do ich obsługi służy funkcja attachInterrupt() ,a przykład użycia może wyglądać np tak :

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


gdzie na INT0 (pin2) podajesz np OUT z RTC

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2015, o 00:39 
Offline
Nowy

Dołączył(a): 25 mar 2015
Posty: 5
Pomógł: 0

chodzi głównie o język arduino, do którego osobiście nic nie mam :) ale w tym przypadku trochę on przeszkadza, bo prowadzący raczej mi nie przyjmie programu z funkcją Millis, gdyż na początku chciał, bym pisał w assemblerze, albo ewentualnie w czystym C :) jednak kupiłem wtedy już Arduino i się uparłem na to rozwiązanie ;)

przerwania zewnętrzne mógłbym zaimplementować jako podprogram do zmiany wartości `i`, który wybiera case'a... tylko że przez drgania styków i tak musiałbym użyć jakiegoś opóźnienia.. być może to w przyszłości to zrobię, chociaż i tak się obawiam o to, czy prowadzący zaakceptuje funkcję attachInterrupt... narazie wolałbym jednak przeskoczyć problem użycia przerwań do wykonania opóźnienia...

tak jak pisałem wcześniej - timer1 mam ustawiony, lecz to co chciałem z nim zrobić kompletnie nie działa.
założenie co do wykonania tego opóźnienia miałem takie, by wysyłać program do funkcji opoznienie(), która oczekiwałaby na pojawienie się po 500ms (albo sekundzie.. już nie pamiętam dla ilu to wyliczałem, ale nawet przy ustawieniu OCR1A na 15111 nie chce działać) flagi OCF1A, a następnie wracała do programu.

To niestety nie działa, w efekcie czego świecą się jednocześnie obydwa kolory (a przynajmniej sprawiają takie wrażenie optyczne)

kolejnym problemem jest to, że mój prowadzący nie chce bym zamykał się w podprogramie i zajmował czas procesora.. jak to pięknie zobrazował w obrazku podobnym do załączonego poniżej, jestem w sytuacji takiej jak po lewej, a on chce, bym zrobił to tak jak po prawej, czyli odłączył się od pętli głównej z tym opóźnieniem... tak, by w teorii procesor mógł w tym czasie wykonywać inne programy..

jak już mówiłem, przerwania to troche dla mnie magia.. założenie ogólne ich rozumiem, jednak wykonania tego nie daje rady ogarnąć i prosiłbym o pomoc :)


Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2015, o 10:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Nikt ci karze pisać w ArduinoIDE ....

topic2622.html zobacz to ... zanim ci podpowiemy więcej

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2015, o 05:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

Tez czytam ta nagonke na arduino i sie dziwie... Wydawalo mi sie ze to tez nie jezyk arduino tylko po prostu c++. Sam kupilem sobie arduino mini i nano bo to fajne male gotowe plytki, ale programuje na nie w eclipse w c. Za to przydatny jest bootloader w nich bo nie musze programatorka wozic :)
Kolego popatrz na poradniki Mirka i temat timerow programowych...
A swoja droga co tam klecisz na zaliczenie? Moze jeszcze warto zmienic srodowisko i jezyk na inne...

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2015, o 20:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Cytuj:
Tez czytam ta nagonke na arduino i sie dziwie...


wynika ona z kilku faktów ...

1. Heretyków nie brakuje na różnych eleblogozgrozach
2. Brak wiedzy czym jest tak naprawdę arduino
3. Brak chęci zadania sobie trudu by poznać i zrozumieć

Ale tu na forum każdy następny negatyw- w stronę arduino będzie nagradzany warnem
może wreszcie każdy zrozumie że to nie arduino jest złe tylko banda The Billi która pisze farmazony a nie ma pojecia o czym
:)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 cze 2015, o 02:15 
Offline
Nowy

Dołączył(a): 25 mar 2015
Posty: 5
Pomógł: 0

SunRiver napisał(a):
Nikt ci karze pisać w ArduinoIDE ....

topic2622.html zobacz to ... zanim ci podpowiemy więcej

no tak, głupi błąd :)
jednak dalej nie działa...

w starym kodzie gdy zaprowadziłem zmiany gdy kliknę przycisk SWdwn BARDZO szybko miga mi czerwony i niebieski po czym nic się nie dzieje. jeśli przytrzymam ten przycisk miga cały czas, bardzo szybko... a gdy przycisnę do tego jeszcze inny przycisk, to wtedy wykonuje się to, co niby według tego powinno.. ale bardzo szybko..
wygląda to tak, jakby timer inkrementował mi cały czas zmienną `i`

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



Spróbowałem więc rozwiązać to w inny sposób... (przy okazji przesiadając się na program Eclipse i próbując się z nim oswoić)

Próbowałem zastąpic funkcję policja() funkcją/wektorem ISR w którym przy pojawieniu się odpowiedniej wartości `i` wykonywałaby się naprzemienna zmiana kolorów(świecenia/nieświecenia) czerwonego i niebieskiego..
Jednak w ten sposób również nic nie uzyskałem, gdyż dla wartości zmiennej `i` równej 1 żadne widoczne efekty się nie pojawiały.. Natomiast zepsuła się funkcja rozjaśniania/przyciemniania koloru czerwonego - po jednym kliknięciu rozjaśniania rozjaśnia i gaśnie od razu, a później nic więcej się nie da zrobić..


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



spróbowałem też całkowicie testowo zrobić proste miganie diodą, które również nie wyszło.. :(
dioda świeci się cały czas (co odpowiada stanowi niskiemu)

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: 5 cze 2015, o 14:50 
Offline
Nowy

Dołączył(a): 25 mar 2015
Posty: 5
Pomógł: 0

a więc jak.. pomoże lub chociaż podpowie ktoś coś? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2015, o 18:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

no dobrze ....

https://www.pjrc.com/teensy/td_libs_TimerOne.html
https://arduinodiy.wordpress.com/2012/0 ... nterrupts/
http://blog.oscarliang.net/arduino-time ... -tutorial/
powinno ci rozjaśnić :)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2015, o 13:23 
Offline
Nowy

Dołączył(a): 25 mar 2015
Posty: 5
Pomógł: 0

no dobra, jakoś sobie poradziłem.. mam nadzieję, że ten typ rozwiązania przejdzie :)

pojawił się jednak problem z kolorem niebieskim :(
otóż gdy chciałem zrobić rozjaśnianie/przyciemnianie kolorów na przyciskach, to czerwony i zielony działały bez problemu.. jednak niebieski bez żadnego przejścia, zaraz po kliknięciu włączał się na maxa..

poszukałem przyczyn i okazało się, że tak naprawdę niedziałające piny PWM są zajęte przez TIMERy 1 i 2, a działające działają dlatego, że nie używam TIMERA 0... (http://playground.arduino.cc/Learning/Pins )

rozwiązałem problem poprzez brutalne pozbycie się TIMERa 1 ;)

Chciałbym jednak zapytać, czy jest możliwość utworzenia własnego PWMa np na pinach 0,1,2 lub 3? (te akurat + analogowe mam wolne :) )Tak, bym był w stanie jednak ten TIMER1 odzyskać? :)

wrzucę wersje `mini` programów do zaprezentowania problemu i jego rozwiązania:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



a tutaj po usunięciu TIMERa1

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2015, o 14:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

oczywiście , możesz przecież zrobić sobie PWM programowy ....

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


:)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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

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