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



Teraz jest 25 kwi 2024, o 21:56


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 19 wrz 2020, o 17:58 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Witam,

Mam następujący problem z programem. Już wyjaśniam o co chodzi. Procek ATMega32 na zestawie ATB 1.05a taktowany kwarcem 16Mhz ma wygenerować impuls o określonej długości np. 10ms gdy na INT0 pojawi się zbocze narastające. Do INT0 doprowadzam sygnał 50Hz(z Timera2), docelowo z detektora zera sieci 230V. Przerwanie od INT0 normalnie jest zablokowane. Naciskając przycisk(switch) wywołuję funkcję której zadaniem jest tylko odblokować przerwanie INT0, a w funkcji obsługi przerwania blokuję obsługę tego przerwania, zmieniam stan na pinie PC7 na niski i ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms, zmieniam stan na wyjściu PC7 na wysoki i zeruję flagę a procek czeka na kolejne wciśnięcie switcha. Niby prosta sprawa, ale po podłączeniu analizatora jednym kanałem do generatora(pin PD7) oraz drugim kanałem do wyjścia PC7 obserwuję że po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach. Już myślałem że się walnąłem przy konfiguracji przerwania, ale według datasheeta jest ok. Poniżej kilka screenów i kod źródłowy.
ObrazekObrazekObrazekObrazekObrazek

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


Walczę z tematem już dość długo, dlatego proszę o jakieś sugestie jeżeli ma ktoś ochotę pomóc.
Z góry dziękuję :-)

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2020, o 19:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

Piotrek_P napisał(a):
po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach

Występuje zaraz po naciśnięciu buttona. Jeśli chcesz żeby przerwanie INT0 wykonało się przy następnym najbliższym zboczu po wciśnieciu buttona, przed aktywacją przerwania INT0 wyzeruj flagę INTF0.
Piotrek_P napisał(a):
ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms,

W ten sposób nie otrzymasz stabilnego i pewnego impulsu. W przerwaniu INT startuj timer, a w jego przerwaniu compare lub overflow, w zależności od konfiguracji, go zatrzymuj.


Autor postu otrzymał pochwałę

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2020, o 20:46 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

fofex napisał(a):
Piotrek_P napisał(a):
po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach

Występuje zaraz po naciśnięciu buttona. Jeśli chcesz żeby przerwanie INT0 wykonało się przy następnym najbliższym zboczu po wciśnieciu buttona, przed aktywacją przerwania INT0 wyzeruj flagę INTF0.
Piotrek_P napisał(a):
ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms,


W ten sposób nie otrzymasz stabilnego i pewnego impulsu. W przerwaniu INT startuj timer, a w jego przerwaniu compare lub overflow, w zależności od konfiguracji, go zatrzymuj.


Dodałem kasowanie flagi INTF0 i teraz zmiana stanu działa perfekcyjnie, choć nadal nie rozumiem dlaczego trzeba tą flagę kasować bo już kiedyś kombinowałem ze sprawdzaniem tej flagi w pętli i ją kasowałem ale nie było żadnego efektu, a do tego w datasheet znalazłem informację że flagi INTFx są kasowane automatycznie.
Docelowo wygenerowanie impulsu ma być przesunięte w czasie od wystąpienia najbliższego zbocza, tak aby włączać odbiornik w szczycie sinusa 230V. Funkcja do omierzania czasu działa precyzyjnie bo jest w oparciu o sprzętowy timer1.
@fofex Bardzo mi pomogłeś, bardzo dziękuję, ale jak byś mógł mi jeszcze wytłumaczyć dlaczego trzeba kasować tą flagę skoro w DS piszą że się sama kasuje, tylko nie wiadomo kiedy ;-)

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2020, o 08:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

Flaga jest automatycznie kasowana po wejściu w procedurę obsługi przerwania. Kiedy przerwanie INT jest wyłączone procedura nie jest wołana, a więc i nie ma kasowania. A, jak widać, flaga jest ustawiana niezależnie od tego czy przerwanie jest włączone czy nie.


Autor postu otrzymał pochwałę

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2020, o 13:56 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Teraz wszystko jasne. Jeszcze raz dziękuję.

_________________
Pozdrawiam
PP



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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