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



Teraz jest 27 lip 2025, o 04:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 27 mar 2013, o 13:39 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

wywołuję przerwanie stanem niskim, wykonuje się np. jedno mignięcie diody,
ale stan niski utrzymuje się nadal i dioda miga sobie na okrągło

a ja bym chciał aby procesor po tym jednym mignięciu na jakiś czas nie
reagował na przerwanie

jakieś cli(), zmiana kierunku na INT0 po wykonaniu mignięcia w przerwaniu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 13:58 
Offline
Użytkownik
Avatar użytkownika

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

Nie lepiej przerwanie wywołane zboczem?

No ale odpowieadając na twoje pytanie.
W przerwaniu od INT(co masz tam miganie dioda) robisz tak:
0.migasz dioda
1.wlaczasz jakis timer i zliczasz czas
2.Wylaczasz przerwanie od int (Czyli w rejestrze GICR ustawiasz 0 na odpowiednim przerwaniu)

a w main
warunek
jesli timer>20sek
wlacz przerwanie od int (W GICR ustawiasz 1)
wylacz timer

KONIEC



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 14:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 mar 2013
Posty: 236
Lokalizacja: Warszawa
Pomógł: 5

Mi sie wydaje, że poprostu w przerwaniu dla licznika sprawdzasz np. co 20s czy wcisnales przycisk i tyle. I wtedy masz jakby przycisk nie reagowal. Zresztą pokaż ten swój kod, będzie łatwiej.

_________________
sig off ;(



Ostatnio edytowano 27 mar 2013, o 14:06 przez Paul Dirac, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 14:05 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

xamrex
zboczem nie mogę, bo w powerdown chcę ustawiać procek i nie wybudzę go (atmega88)

reszta cosik skomplikowana :), ale przebadam, jeśli prościej się nie da



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 14:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

Timer chyba nie będzie dobrym rozwiązaniem ale idąc tym tropem:

w przerwaniu:
- migasz diodą
- wyłaczasz przerwanie

w main:
- badasz czy sygnał który wywołuje przerwanie wrócił do stanu wysokiego (lub jest wysoki) i wtedy włączasz obsługę przerwania.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 14:21 
Offline
Moderator
Avatar użytkownika

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

Moim zdaniem troszkę mylisz podejście - bo jeśli używasz INTx do wybudzania procka a rzeczywiście to może się odbywać TYLKO za pomocą stanu niskiego a nie zbocza to:

1. nie pisz jakiejś dziwnej obsługi tego przerwania, tylko po wybudzeniu przekaż sterowanie do pętli głównej
2. zablokuj na ten czas działanie tego przerwania bo po co
3. obsłuż sobie zgłoszone przerwanie (zdarzenie) w tej pętli głównej
4. jak już będziesz mógł iść znowu spać (tzn procek) to znowu odblokuj przerwanie przed zaśnięciem

i sprawa załatwiona ;)

_________________
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: 27 mar 2013, o 15:36 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

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

coś robię nie tak bo funkcja nadawaj() wykonuje się bez przerwy,
a przecież cli() powinno ją wyłączyć - procesor atmega88



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 15:58 
Offline
Moderator
Avatar użytkownika

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

to nie jest pełny kod a pewnie popełniasz ten błąd - że u ciebie czynnik wywołujący przerwanie trwa dosyć długo, więc co z tego że zrobisz cli(); .... jeśli za chwilę jak domniemuję tylko uśpisz procka a przerwanie znowu nastąpi .... a zatem zaczyna tu występować takie jakby zjawisko drgań styków w klawiszach ;)

musisz zatem po nadaniu czegoś - a nadawaj to panie z tej pętli głównej - po co z przerwania ? .... w ogóle wtedy można nawet byłoby przerwania nie używać tylko sprzętowej flagi przerwania - ale ok o tym później żeby nie mieszać.

więc gdy nadasz coś - to zrób sobie jakiś _delay_ms(1000); zakładając że 1000ms wystarczy ci do usunięcia przyczyny wywołującej to przerwanie i dopiero wtedy połóż procka znowu spać ;) Gdy zaśnie to już przyczyna ustanie aż do czasu kiedy znowu KIEDYŚ tam się pojawi ;)

_________________
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: 27 mar 2013, o 16:36 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

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


no to brnę dalej ...
usypianie już dawno wyłączyłem, aby mnie nie myliło
wywaliłem nadawaj() do pętli głównej... i teraz ta funkcja w ogóle nie startuje :(
nic innego nie zmieniłem
oczywiście to nie cały kod, ale tego za dużo by było

przy okazji - uruchomiłem RFM73 - potrzebna jest tylko jedna zmiana w Twoich Mirek bibliotekach
i chodzi z takimi samymi parametrami jak RFM73, trzeba zmienić tylko jedną wartość



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 16:45 
Offline
Moderator
Avatar użytkownika

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

No ok - jasne taki fragment kodu jest przejrzysty - ale co to znaczy że funkcja nie startuje ? to co przerwanie nagle się nie wykonuje ? ... a nie wykasowałeś przypadkowo inicjalizacji tego przerwania ?

daj znać..

a jeśli chodzi o bibliotekę dla RFM73 - to możesz podpowiedzieć nawet tutaj co trzeba zmienić ? sam jestem ciekaw bo jeszcze się tym nie zająłem a pewnie innym też się przyda

_________________
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: 27 mar 2013, o 17:43 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

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

z tym moim programem to muszę pomyśleć, bo wiem, że to dziwnie wygląda :roll:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 18:12 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

W powyższym przykładzie brakuje sei(); a swoją drogą to powinieneś pokazać cały kod, bo przykładowo może nie podciągasz wejścia do plusa.
W atmega88pa dodane jest Pin Change Interrupt, które można wykorzystać do wybudzania mikrokontrolera z trybu PowerDown zboczem narastającym lub opadającym właściwie na każdym pinie mikrokontrolera.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 18:53 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

Krauser napisał(a):
W powyższym przykładzie brakuje sei(); a swoją drogą to powinieneś pokazać cały kod, bo przykładowo może nie podciągasz wejścia do plusa.
W atmega88pa dodane jest Pin Change Interrupt, które można wykorzystać do wybudzania mikrokontrolera z trybu PowerDown zboczem narastającym lub opadającym właściwie na każdym pinie mikrokontrolera.

sei oczywiście jest w bloku inicjującym rfm70 i przerwania, nie pokazałem ich tutaj, ale przerwanie INT0 działa,
podciągnąłem do plusa rezystorem 10k nawet
natomiast informacja o Pin Change Interrupt (zbocza) to dla mnie najlepsze rozwiązanie by było,
gdzie szukać jak to ustawić?
w DS znalazłem INT0 i INT1 jasno opisane, ale nie widzę tego samego do Pin Change Interrupt, ale pewnie słabo szukam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 20:25 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Jest zaraz za INT0/INT1. W skrócie:
- każde wyprowadzenie mikrokntrolera atmega88pa ma przypisaną funkcję PCINx (x=0...23). Dla PB x=0..7, dla PC x=8...14(15-nie ma bo nie ma PC7) i dla PD x=16...23
- jest tylko 3 wektory przerwań PCINT0_vect, PCINT1_vect i PCINT2_vect i każdy obsługuje po 8 (7) wejść
- które wejścia będą generować przerwanie wybieramy w rejestrach PCMSK0, PCMSK1, PCMSK2 ustawiając bity o nazwach PCINTx
- jeśli są wybrane przykładowo 2 wyprowadzenia z jednej grupy/portu to zmiana na którymkolwiek z nich generuje przerwanie, które jest wspólne dla całej grupy. Jeśli projektujemy urządzenie to rozsądnie wybierać wyprowadzenia z różnych portów, bo to uprości funkcję obsługi przerwania, gdyż nie trzeba wtedy dodatkowo np. w pętli głównej sprawdzać stanu pinów
- przerwania odblokowuje się w rejestrze PCICR za pomocą bitów PCIE0, PCIE1 i PCIE2
- rozsądnie skasować flagi przerwań w rejestrze PCIFR wpisując 1 na pozycje PCIFx
- każda zmiana stanu z wysokiego na niski i z niskiego na wysoki generuje przerwanie
- PCINTx podobnie jak INTx można wykorzystać do generowania przerwania programowego (wystarczy skonfigurować przerwanie i zmienić stan wyjścia). Można również zresetować w ten sposób mikrokontroler jeśli przerwanie jest ustawione, ale nie ma funkcji do jego obsługi

Przykład zastosowania :idea:
Jeśli potrzebujesz budzić mikrokontroler za pomocą USARTu jak to jest w najnowszych mikrokontrolerach to wystarczy pinowi, który pełni funkcję RXD dodać dodatkową funkcję PCINT16 i niemożliwe staje się możliwe. Tracimy jeden znak, ale to nic.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 mar 2013, o 21:02 
Offline
Użytkownik

Dołączył(a): 14 maja 2012
Posty: 518
Pomógł: 6

biorę się za studiowanie,

moje zapotrzebowanie to wykrycie zalania - zbocze malejące
i wyschnięcia - zbocze rosnące

nie wiedziałem, że mogę wybudzać się z POWERDOWN zboczami
i kombinowałem stanem niskim na INT0 i to mnie jak na razie przerosło

ale jak opanuje PCINT ze zboczami to już powinno pójść bez problemu

Twoje rady są bezcenne, zauważyłem już to nie raz, dzięki, duży szacunek
za takie podejście, tak trzymaj



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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