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



Teraz jest 23 lut 2025, o 20:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 9 wrz 2015, o 10:58 
Offline
Użytkownik

Dołączył(a): 19 lut 2015
Posty: 29
Pomógł: 0

Witam,
Mam problem z poprawnym działaniem programu i nijak nie potrafię go rozwiązać. Może ktoś rzuci świeżym, bardziej doświadczonym okiem i powie mi gdzie popełniłem błąd?

Program na Atmege32, taktowaną zewnętrznym kwarcem 8MHz.

Program powinien działać następująco:
1. Gdy przyjdzie sygnał na jeden z pinów INT0 lub INT1 na pinie PC0 ma pojawić się stan wysoki, a przerwanie to ma zostać wyłączone.
2. Gdy przyjdzie sygnał na drugi z pinów przerwań na pinie PC0 ma pojawić się stan niski, a przerwanie to ma zostać wyłączone.
3. Po 500 ms przerwania INT0 i INT1 mają zostać ponownie włączone i czekać na kolejny sygnał.

W czym problem?
1. Stan niski na pinie PC0 nie pojawia się "pionowo" lecz łagodnie jakby się rozładowuje. Czy to naturalne i tak powinno być?
Obrazek
2. Po upływie tych 500ms gdy przerwania się włączają na PC0 pojawia się niezamierzony pik.
Obrazek
Sytuacje zamieszczam na screenach.

Legenda:
zółty - INT0
niebieski - INT1
różowy - PC0

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

Kod wycięty z całości programu, mam nadzieję, że niczego nie pominąłem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2015, o 11:10 
Offline
Moderator
Avatar użytkownika

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

PJasinski91 napisał(a):
1. Stan niski na pinie PC0 nie pojawia się "pionowo" lecz łagodnie jakby się rozładowuje. Czy to naturalne i tak powinno być?

Powinno - tzn zależy jak zaprojektowałeś układ wyjściowy na którym to badasz ....

PJasinski91 napisał(a):
2. Po upływie tych 500ms gdy przerwania się włączają na PC0 pojawia się niezamierzony pik.

To też jest całkiem normalne, po prostu przed ponownym włączeniem przerwań skasuj sprzętowe flagi tych przerwań bo widać, że się wyzwalają po załączeni na skutek poprzedniego zgłoszenia przed wyłączeniem.


Autor postu otrzymał pochwałę

_________________
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 wrz 2015, o 13:05 
Offline
Użytkownik

Dołączył(a): 19 lut 2015
Posty: 29
Pomógł: 0

Nie mogę w tej chwili sprawdzić w praktyce. Czy chodzi o:
Cytuj:
Register – GIFR
Bit 7 – INTF1: External Interrupt Flag 1
The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it.

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

Tak?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2015, o 13:45 
Offline
Moderator
Avatar użytkownika

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

I tak i nie ....

tzn DOKŁADNIE chodzi o to żeby je wyzerować w GIFR ale uwaga nie można tego robić tak jak wyżej napisałeś .... trzeba tak ;)

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


dostrzegasz drobną różnicę ? to akurat jest bardzo istotne

_________________
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 wrz 2015, o 18:09 
Offline
Użytkownik

Dołączył(a): 19 lut 2015
Posty: 29
Pomógł: 0

Dostrzegam drobną różnicę.
W moim przypadku dodaję jedynki na bitach INTF1 i INTF0 pozostałych nie zmieniając. W Pana przypadku ustawiam jedynki na ww. bitach zerując pozostałe. Nie potrafię jednak zrozumieć jaki to ma wpływ. Czy to o czym Pan mówi ma znaczenie tylko gdy używam też przerwania INT2?
Z góry dziękuję za wyjaśnienia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2015, o 18:32 
Offline
Moderator
Avatar użytkownika

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

PJasinski91 napisał(a):
W Pana przypadku ustawiam jedynki na ww. bitach zerując pozostałe

Zrozum, ZEROWANIE wybranej flagi następuje nie przez wpisanie zera do bitu (bo to jest IGNOROWANE),

więc wpisując zera do pozostałych bitów NICZEGO NIE ZERUJESZ w przypadku rejestrów flag przerwań. Warto to zapamiętać, bo jeśli w programie będziesz używał kilku różnych przerwań a zechcesz sobie rozpisać na poszczególne kroki (tak jak pokazałem to na rysunkach w Bluebooku) to zobaczysz, że stosując tu operator OR czyli |= robisz sobie dopiero bigos ....

reasumując chcesz wyzerować konkretną flagę czy konkretne flagi żeby przypadkowo nie dziabnąć innych to nie stosuj w tym konkretnym przypadku |=

mam nadzieję, że 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: 9 wrz 2015, o 18:35 
Offline
Użytkownik

Dołączył(a): 19 lut 2015
Posty: 29
Pomógł: 0

Znacznie jaśniej. Jutro podłączę oscyloskop i zobaczę czy wszystko działa.
Dziękuję za podpowiedzi.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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