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



Teraz jest 10 lut 2025, o 19:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 28 sie 2013, o 12:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Witam
Załóżmy, że aktywujemy sobie przerwanie jeśli na INT1 będzie zbocze opadające

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



Teraz dołączymy sobie z książki projekt 7 (Rsa, który używa przerwań aby wysłać i odebrać dane)

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


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


Niech mi ktoś wytłumaczy czy to ma prawo działać i w jaki sposób będzie to działało.
Z tego co wiem, na czas wykonywania się przerwania inne przerwania są blokowane?
Oraz jeśli pojawi się flaga przerwania program od razu skacze do funkcji obsługującej przerwanie.
Załóżmy, że na INT1 pojawia się stan niski.
W tym momencie program przechodzi do obsługi tego przerwania i:
1. blokuje inne przerwania
2.Zwiększa zmienną licznik
3.dodaje do buforu z uarta tą zmienną i włącza falgę przerwania UCSRB |= (1<<UDRIE);
4.Niestety są wyłączone inne przerwania, więc program nie skoczy NATYCHMIAST do ISR( USART_UDRE_vect)
5.Program zmienia stan na PD7
6.Wychodzi z przerwania i zezwala na inne przerwania
7.W tym momencie robiona jest obsługa przerwania ISR( USART_UDRE_vect)
Albo obsługa tego przerwania ISR( USART_UDRE_vect) nie zostanie w ogóle zrealizowana?

Czy dobrze myślę ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 12:43 
Offline
Moderator
Avatar użytkownika

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

Po pierwsze to nie ustawiaj pinu INTx jako WYJŚCIE ;)

DDRD |=(1<<PD3);

Po drugie - dzięki temu pytaniu może zrozumiesz lepiej co to są flagi sprzętowe przerwań ;)

Toż jeśli trwa osbługa INTx to wiadomo że inne przerwania nie ruszą - ale ZAPALĄ się flagi tych przerwań. I dlatego właśnie po ukończeniu obsługi INTx ... procek wie, że ma zrealizować kolejne przerwanie bo widzi, że flaga od UDRE jest zapalona - no to BACH, wykonuje jedną instrukcję z pętli głównej i natychmiast w kolejnym cyklu rzuca się aby obsłużyć przerwanie UDRE i zgasić tę flagę

teraz jaśniej ? ;)

_________________
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: 28 sie 2013, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

mirekk36 napisał(a):
Po pierwsze to nie ustawiaj pinu INTx jako WYJŚCIE

Pisane na szybo, błąd się wkradł ;)

No ok,dużo się wyjaśniło, ale pokombinujmy jeszcze bardziej ;)
Z tego co wiem to nie da się ustawić priorytetów przerwań.

Pokaże to krokowo o co mi chodzi.
1.Tak jak poprzedni INT leci na stan niski,
2.Wchodzimy w przerwanie ISR( INT1_vect )
3.Zwiększamy zmienną licznik
4. TERAZ DOSTAJEMY COŚ PO RSIE
4a. Ustawiana jest flaga aby wykonać przerwanie ISR( USART_RXC_vect )
5.dodaje do buforu z uarta tą zmienną licznik i włącza falgę przerwania UCSRB |= (1<<UDRIE);
....
6.Zmienia stan diody
7.Whcodzi z przerwania INT.

I teraz moje pytanie, które przerwanie zostanie najpierw obsłużone RX, czy TX?

Wiem, że kombinuje jak mogę, ale mnie to ciekawi :D

Czy zostanie to obsłużone wg. tej tabelki:?
Obrazek

Czyli najpierw RX?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2013, o 13:54 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Czy zostanie to obsłużone wg. tej tabelki:?


dokładnie flagi są sprawdzane i wykonywane powiązane z nimi przerwania wg tej tabelki czyli wg kolejności wektorów przerwań

_________________
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: 9 lis 2014, o 18:42 
Offline
Nowy

Dołączył(a): 25 sie 2014
Posty: 5
Pomógł: 0

Witam. Napisałem program, który co określoną ilość czasu wysyła pomiary z ADC oraz czas z zewnętrznego zegara PCF poprzez BTM222 na mój komputer. Do odliczania czasu chcę użyć przerwanie od PCF na INT0. I teraz moje pytanie dlaczego przerwania od obsługi UART-a całkowicie blokują mi przerwanie INT0? Wygląda to tak że jeśli nie wyślę nic na port RS to przerwanie pięknie zlicza mi sekundy natomiast jeśli cokolwiek chcę wysłać na port to po 1 wysłaniu przerwanie INT0 przestaje działać a działa tylko to od UART. Napisałem nawet testowy program tak jak powyżej kolega i doda on tylko raz 1 do licznika po czym przestaje działać. Zablokowałem wszystkie nieużywane rzeczy w mkuart.c i też to nic nie dało. Czytam czytam i kompletnie nie rozumiem czemu nie chce on dalej wykonywać przerwania od INT0.
Dla mnie ważne jest aby własnie to przerwanie wykonywało się pewnie ponieważ ważny jest odpowiedni interwał czasu pomiaru a wygłąda to tak jakby przerwanie od UARTA się nigdy nie kończyło skoro nie pozwala na kolejne wyzwolenia INT0. Cała obsługa UARTA z niebieskiej książki zaczerpnięta.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2014, o 21:23 
Offline
Moderator
Avatar użytkownika

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

cugu napisał(a):
I teraz moje pytanie dlaczego przerwania od obsługi UART-a całkowicie blokują mi przerwanie INT0?

Odpowiedź jest niestety banalnie prosta - musiałeś STRASZNIE namieszać sobie w kodzie ... czyli inaczej mówiąc zrobić potwornego babola albo wiele baboli naraz ....

albo nie rozumiesz jeszcze jak działają w ogóle przerwania w prockach

ale po tak zadanym pytaniu to TYLKO tyle można odpowiedzieć. Wiesz ? ... tak wyglądają pytania z serii "do jasnowidza" czyli - "nie działa mi - powiedzcie dlaczego?" ... a po co tam pokazywać swój kod źródłowy no nie ? ;)

_________________
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 lis 2014, o 17:17 
Offline
Nowy

Dołączył(a): 25 sie 2014
Posty: 5
Pomógł: 0

Poniżej zamieszczam kod. ATMEGA328, Eclipse indigo. Mirek zdecydowanie zgadzam się z tobą że nie rozumiem do końca przerwań mimo że obydwie twoje książki przeczyłem. Ale uczę się codziennie;)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dzięki za info, nie zauważyłem że taki miszmasz się z kodem zrobił bez -C



Ostatnio edytowano 10 lis 2014, o 20:23 przez cugu, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2014, o 19:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Kolego najpierw zapoznaj się z tym tematem topic7402.html i wstaw poprawnie kod. Bo tego się nie da czytać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2014, o 09:12 
Offline
Nowy

Dołączył(a): 25 sie 2014
Posty: 5
Pomógł: 0

Tak jak widać to co jest w komentarzach na dole to właśnie to co proponujesz i tak miałem na początku(ten rs w int0 to tak tylko do testu napisałem). Objaw taki że po całym odczycie adc oraz uśrednieniu przy 1 wejściu w uart przerwanie od INT0 przestaje działać( naliczy zawsze do 2 lub 3 i koniec)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO