logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8] Obsługa przerwań zewnętrznych. Jedno przerwanie następujące po drugim.

Apff 28 Paź 2011 19:42 6296 48
  • #1 10075515
    Apff
    Poziom 9  
    Witam

    Otóż mam taki dylemat ...
    Mam taki prosty programik robiący mi za licznik modulo 8. Samo liczenie odbywa się w przerwaniu timer'a ale to nie jest kwestia którą chce poruszyć.

    Po wywołaniu zewnętrznego przerwania, nie da się go przez czas paru/parunastu sekund wywołać. Czego to może być wina ? (pomijając że moja). Czy przypadkiem nie powinno to wyglądać tak że przerwaniami mogę sobie spamować do woli?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziękuję za wszelką pomoc :)
  • #2 10075547
    11111olo
    Poziom 42  
    Czym je wywołujesz? Przyciskiem?
    Po przerwaniu na czas jego wykonania wyłącz przerwania przez CLI a potem włęcz ponownie przez SEI.
  • #3 10075592
    dondu
    Moderator na urlopie...
    11111olo napisał:
    Po przerwaniu na czas jego wykonania wyłącz przerwania przez CLI a potem włęcz ponownie przez SEI.

    Wejście w przerwanie przy takim kodzie jak powyżej, automatycznie powoduje wyłączenie przerwania na czas jego realizacji, więc nie trzeba tego robić dodatkowo.
  • #4 10075601
    11111olo
    Poziom 42  
    Jeśli tak to by takie cyrki nie wystąpiły, chyba że program w przerwaniu jest tak krótki że się zdąży wykonać 1000x na sekundę.
  • #5 10075607
    Apff
    Poziom 9  
    tak, przyciskiem.
    Cytat:
    Po przerwaniu na czas jego wykonania wyłącz przerwania przez CLI a potem włęcz ponownie przez SEI.

    niestety nie pomogło.

    Dodam jeszcze że te przerwania się właściwie potem wykonują... teraz dopiero to zauważyłem.
    Przykładowa sytuacja
    1) Licznik odlicza w górę. Przerwanie. Następuje zmiana kierunku licznika
    2) Licznik odlicza w dół (wszystko ok). Kolejne naciśnięcie przycisku nic nie daje
    3) po paru sekundach licznik odlicza tak jakby miał dylemat. Tzn zmienia kierunek mniej więcej tyle razy ile się przycisk wcisnęło :)

    Trochę paradoksalne zachowanie ale co zrobić
  • #6 10075616
    11111olo
    Poziom 42  
    To proste rozwiązanie. Jak przerwanie może być wywołane nie częściej niż raz na sekundę to na samym końcu przerwania daj opóźnienie 1s i po sprawie).
  • #7 10075646
    dondu
    Moderator na urlopie...
    11111olo napisał:
    Jeśli tak to by takie cyrki nie wystąpiły, chyba że program w przerwaniu jest tak krótki że się zdąży wykonać 1000x na sekundę.

    Oj, czytaj kolego datasheety, czytaj bo warto:

    ATmega8 Datasheet napisał:
    The I-bit is cleared by hardware after an interrupt has occurred, and is set by the RETI instruction to enable subsequent interrupts
  • #8 10075658
    11111olo
    Poziom 42  
    Dobra fakt.
    Ale tu problemem jest to że autor nie daje kodu i ciężko stwierdzić jak to ma działać.
    Na moje to to wszystko tak krótko trwa że jeszcze nie zdąży puścić przycisku i znowu się włącza przerwanie.
  • #9 10075669
    Apff
    Poziom 9  
    Cytat:
    Na moje to to wszystko tak krótko trwa że jeszcze nie zdąży puścić przycisku i znowu się włącza przerwanie.

    A jak ci powiem że jeżeli wciskam przycisk co pół minuty to mi śmiga całość ?... i to bez pomyłki ?
  • #11 10075739
    Apff
    Poziom 9  
    w jeden pin VCC około 4.5V ( z programatora mi tyle wychodzi ).
    pin po przeciwnej stronie idzie do INT1. Piny razem nie są ze sobą zwarte (na przycisku są 4 ale jeszcze nie odkryłem po co).

    Sprawdzałem sobie multimetrem i normalnie przy naciśnięciu pojawia się napięcie na INT1.

    Tyle wiem. Szczerze mówiąc nawet na tym się nie znam więc jak coś to proszę się nie śmiać ;d
  • #12 10075773
    dondu
    Moderator na urlopie...
    Oj, kolego zacznij od narysowania schematu, bo z Twojego opisu to trudno coś wywnioskować. Czas, który tracisz na szukanie błędów będzie znacznie mniejszy, gdy taki schemat opracujesz i sam sprawdzisz lub załączysz tutaj. Taki shemat pozwala nie stać na pierwszym stopniu: Piekła początkujących

    Pull-up - to jest coś o czym powinieneś poczytać.
  • #13 10075853
    Apff
    Poziom 9  
    Tam nic więcej nie ma
    [atmega8] Obsługa przerwań zewnętrznych. Jedno przerwanie następujące po drugim.
  • Pomocny post
    #14 10075866
    dondu
    Moderator na urlopie...
    O i dzięki schematowi od razu widać błąd:

    [atmega8] Obsługa przerwań zewnętrznych. Jedno przerwanie następujące po drugim.

    Przyciski podłącz do GND, a nie Vcc, a w programie włącz pull-up, i ustaw reakcję INT na zbocze opadające.
    Tylko czy wiesz dlaczego Twój układ nie działał?

    Osobna sprawa do drgania styków przycisku: http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html

    Rysunki załączaj przyciskiem Dodaj obrazek - zrobiłem to za Ciebie.
  • #15 10075882
    Apff
    Poziom 9  
    ok... nie wiem dlaczego nie działa ale w ten sposób na pewno też da się to zrobić.

    Tylko powiedz mi jak włączyć Pull-Up w programie ?
    Poprzez bit w PORTC czy coś konkretnego ?

    o drganiu styków to wiem... i przyjdzie na to pora
  • #16 10075898
    dondu
    Moderator na urlopie...
    Apff napisał:
    ok... nie wiem dlaczego nie działa ale w tą stronę też da się to pewnie zrobić.

    Sposób zaproponowany przeze mnie, jest najlepszy dla mikrokontrolerów AVR, ponieważ mają wewnętrzne rezystory pull-up włączane programowo.

    Aby schemat w Twojej wersji działał, musi być rezystor pull-down. Niestety ten mikrokontroler go nie ma, więc musiałbyś dodać zewnętrzny.


    Apff napisał:
    Tylko powiedz mi jak włączyć Pull-Up w programie ?
    Poprzez bit w PORTC czy coś konkretnego ?

    PORT tak, ale nie C tylko D, bo tam masz INT1.


    Apff napisał:
    o drganiu styków to wiem... i przyjdzie na to pora

    Ale pamiętaj, że będą Ci już teraz wywoływać kilka przerwań podczas jednego przyciśnięcia lub puszczenia.
  • #17 10075915
    Apff
    Poziom 9  
    Cytat:
    Ale pamiętaj, że będą Ci już teraz wywoływać kilka przerwań podczas jednego przyciśnięcia lub puszczenia.

    Tyle zdążyli mnie już nauczyć :D

    tak czy siak dzięki ci bardzo :)
  • #19 10076043
    janbernat
    Poziom 38  
    A teraz opis tego co się dzieje.
    Wciskając przycisk dostarczasz ładunek na pojemność wejściową procesora.
    Ta pojemność jest mała- ale oporność wejściowa układu CMOS jest bardzo duża.
    Ten ładunek powoli się rozładowuje- głównie zresztą przez oporność między ścieżkami na płytce a nie w krzemie.
    Jeśli szybko ponownie wciśniesz przycisk to nie będzie żadnego zbocza- pojemność wejścia "pamięta" poprzednie napięcie.
    Jeśli odczekasz- te pół minuty- to zdąży się rozładować i pojawienie się nowego ładunku spowoduje pojawienie się zbocza.
    Na to oczywiście nakładają się drgania styków.
    Te drgania trwają 1-20ms- zależy od przycisku.
    Co jakiś czas nie ma ich wcale.
    A Twoje przerwanie "na oko" wykonuje się kilka- kilkadziesiąt us.
    Czyli jest to różnica czasów 1-100.
    Dopóki nie opoanujesz deboucingu- tylko bez delay() bardzo proszę- możesz się ratować dodaniem kondensatora między pin a masę i opornikiem ok. 100ohm w szereg z przyciskiem.
  • #20 10076751
    Fredy
    Poziom 27  
    janbernat napisał:

    Dopóki nie opoanujesz deboucingu- tylko bez delay() bardzo proszę- możesz się ratować dodaniem kondensatora między pin a masę i opornikiem ok. 100ohm w szereg z przyciskiem.


    A po co ten rezystor szeregowy 100Ohm ? Przy kondensatorze rzedu 100n chyba sklejenia styków się nie ma co obawiać ? :D :D
  • #22 10077278
    dondu
    Moderator na urlopie...
    Fredy napisał:
    A po co ten rezystor szeregowy 100Ohm ? Przy kondensatorze rzedu 100n chyba sklejenia styków się nie ma co obawiać ? :D :D

    Nie chodzi o sklejenie styków, ale o generowane szpilki przy prądzie zwarcia kondensatora do masy, które mogą uszkodzić mikrokontroler. Ale dla pełni bezpieczeństwa, potrzebna jest jeszcze dioda.

    Od tej chwili już jest nowa wersja pod linkiem załączonym przez janbernat powyżej, tłumacząca po co ten rezystor, o którym wspomniał oraz po co dioda.
  • #23 10077463
    mirekk36
    Poziom 42  
    Fredy napisał:
    janbernat napisał:

    Dopóki nie opoanujesz deboucingu- tylko bez delay() bardzo proszę- możesz się ratować dodaniem kondensatora między pin a masę i opornikiem ok. 100ohm w szereg z przyciskiem.


    A po co ten rezystor szeregowy 100Ohm ? Przy kondensatorze rzedu 100n chyba sklejenia styków się nie ma co obawiać ? :D :D


    No no ;) coraz częściej na forum elektrody widać dziwne porady na temat tych rezystorów szeregowych - widać masowo zaczęły się wypalać styki w mikrosłiczach u co niektórych. O ile można jeszcze zrozumieć konieczność budowania TAKICH układów przy resecie typu: zewn. rezystor podciągający, dioda do VCC (bo na tym akurat pinie nie ma jej wewnątrz w przeciwieństwie do innych pinów), kondensator 100nF plus ten nieszczęsny ;) rezystor 100R w szereg - to już przenoszenie tego typu układów (śmiało tak już można nazwać taką KUPĘ elementów zewnętrznych do każdego przycisku typu microsłicz dodawanego do mikrokontrolera - to już jest PARANOJA niestety :( i to taka dosyć mocna.

    Pomijam już to że pozostałe piny posiadają wbudowaną diodę do VCC zabezpieczającą wejście przed takimi przepięciami/szpilkami to wydumane wypalanie się styków mikrosłicza od rozładowywanego kondensatora - normalnie podziwiam pomysłowość i radosną niefrasobliwą twórczość.

    Od lat stosuje się zwykły pojedynczy słicz na wejściu nawet niekoniecznie z zewnętrznym podciąganiem do VCC i to bez żadnych kondensatorów 100nF do obsługi klawiszy - a drgania styków obsługuje się programowo i jeszcze nigdy nie zdarzył się nikomu przypadek żeby to nie działało. Ale też nikomu się nie zdarzył przypadek uszkodzenia czy to mikrosłicza czy procka nawet jeśli się stosuje taki kondek 100nF na wejściu i nawet na wejściu RESET.

    Za to - fajna sensacja rozdmuchana do granic zdrowego rozsądku.

    Dodano po 15 [minuty]:

    janbernat -> nie obraź się proszę bo moja wypowiedź nie miała tego na celu (może to ja czegoś nie wiem? a na pewno uważam takie rozwiązania za mocno naciągane i przesadzone) - ale tak szczerze powiedz czy spotkałeś się w swojej (przecież bogatej praktyce zawodowej) z tym, żeby słicz się wykończył takim wypalaniem styków zanim się ew w ogóle nie rozleciał z uwagi na mechaniczne wykorzystanie/zużycie materiału ?
  • #24 10077562
    dondu
    Moderator na urlopie...
    mirekk36 napisał:
    O ile można jeszcze zrozumieć konieczność budowania TAKICH układów przy resecie typu: zewn. rezystor podciągający, dioda do VCC (bo na tym akurat pinie nie ma jej wewnątrz w przeciwieństwie do innych pinów), kondensator 100nF plus ten nieszczęsny ;) rezystor 100R w szereg - to już przenoszenie tego typu układów (śmiało tak już można nazwać taką KUPĘ elementów zewnętrznych do każdego przycisku typu microsłicz dodawanego do mikrokontrolera - to już jest PARANOJA niestety :( i to taka dosyć mocna.


    Kol. Mirek36 ma rację, że w mikrokontrolerach AVR (jak i na przykład PIC) diody na wejściach są wbudowane wewnętrznie, i pozwalają na eliminację zjawiska prawie całkowicie. I prawdą jest, że w przypadku pinu RESET dla AVR i MCLR dla PICów takiej diody nie ma, i takie zabezpieczenie jakie zaleca Atmel, warto stosować.

    Warto także być świadomym zachodzących zjawisk, które mogą przenosić się z innych części (przycisk nie koniecznie musi być podłączony do mikrokontrolera bezpośrednio) układów na mikrokontroler, by ustrzec się od niechcianych problemów.

    Tutaj mamy przypadek pinu INT1 na AVR-ku, który taką diodę posiada, więc jest w dużej mierze zabezpieczony przed niepożądanym zjawiskiem. Czy jednak nie warto zadbać o to aby zjawisko wyeliminować całkowicie przez dołożenie sugerowanego przez kolegę janbernat rezystora? To takie samo zabezpieczenie jak porządne filtrowanie zasilania, na które często zwracamy wszyscy uwagę.

    W końcu w swojej nocie AVR042 Atmel nie sugeruje dodać do pinu RESET tylko diody, aby zrównać go ze zwykłym pinem, ale sugeruje dodać diodę i rezystor w szereg z przyciskiem i wyjaśnia dlaczego.
  • #25 10077794
    janbernat
    Poziom 38  
    No spotkałem się z opornikami 100ohm w szereg.
    Np. na płytkach prototypowych z propoxu.
    W normalnych urządzeniach w których klawiatura jest nieco oddalona od płytki takie oporniki są zwykle jednym z elementów zabezpieczenia przed zewnetrznymi zakłóceniami i nawet nie zwraca się na nie uwagi.
    I wcale nie chodzi o sklejenie styków.
    Taki np. miniaturowy przekaźnik ma oporność styków 50mohm w momencie włączenia.
    Podobnie mikroprzełącznik.
    No to oblicz jaki początkowy prąd popłynie z 5V na kondensatorze.
    Krótko- bo to tylko 100nF no i jeszcze oporność ścieżek itp.
    Ale impuls będzie- teoretycznie 100A.
    Zakłocenie posieje niezłe.
    To zakłócenie nie da zwykle żadnych objawów- bo to reset- zanim procesor ponownie wstanie zakłócenie zniknie.
    No i teraz- nota Atmela na temat podłączania resetu- i tylko resetu- jest stara jak świat.
    Łącznie z tą diodą zabezpieczającą,
    A pisałem o "zastępczym" debouncingu z kondensatorem.
    Chyba nikt z wyjątkiem początkujących tak tego nie robi.
    Chociaż nie- początkujący wogóle nie wiedzą o co chodzi.
    No i to nie jest reset- w tym czasie procesor pracuje.
    Dioda zabezpieczająca nie pozwoli na uszkodzenie pinu.
    Ale zakłoćenia będą.
  • #26 10077937
    mirekk36
    Poziom 42  
    janbernat - ja się nie pytałem czy się spotkałeś z takimi rozwiązaniami - bo to oczywiste, że się takie znajdą. Pytanie było czy spotkałeś się z jakimiś drastycznymi skutkami nie stosowania takich rozbudowanych układów dla obsługi mikrosłicza albo nawet pinu reset ;) a to zasadniczo inne pytanie.

    No a ten teoretyczny impuls 100A sam mówi za siebie ;)

    Tak samo jak z tymi zakłóceniami o których piszesz na końcu. Takich zakłóceń to jest pełno wokoło nas ;) emituje je wszystko co nas otacza a szczególnie jeśli coś co nas otacza ma coś wspólnego z prądem.

    Więc nie dość tego (że jak sam twierdzisz i słusznie iż to głównie początkujący radzą sobie z deboncigiem za pomocą kondensatora 100nF zamiast programowo) - to jeszcze uważasz, że warto ich straszyć tymi impulsami 100A i zakłóceniami ? żeby jeszcze bardziej rozbudowywali swoje klawiatury na mikrosłiczach ? Tym bardziej, że te diody są niepotrzebne....

    Nie dajmy się zwariować ;)
  • #27 10078013
    janbernat
    Poziom 38  
    Diody są niepotrzebne.
    Opornik w szereg z mikroprzełącznikiem jest niekonieczny jeśli nie ma tam kondensatora.
    Gdy mamy tłumienie drgań styków przy pomocy kondensatora jest bardzo wskazany.
    Kondensatory przy zasilaniu procesora nie są niezbędne- ale bardzo wskazane.
    Skręcanie przewodów do silników i przekaźników nie jest niezbędne- ale bardzo wskazane.
    Zresztą- chyba co parę dni pojawia się pytanie- dlaczego układ z procesorem działa dziwnie albo co jakis czas nie działa.
    A wystarczy przypomnieć sobie laboratorium z teorii pola albo wykłady o stanach nieustalonych w układach.
    No nie wszyscy- niektórzy są naprawdę początkujacy.
    No i takim się daje odpowiedź- tak zrób bo tak trzeba.
    A jak chcesz się dowiedzieć dlaczego- to szukaj albo dać link.
    No bo po co się użerać ze sprzętem- to jest proste i nudne.
    Lepiej uczyć się programować.
    P.S.
    A jak się komuś chce- zrobić można sobie układ z przekaźnikiem przełączanym co np. 1s.
    Kondensator równolegle do styków- ładowany przez opornik na tyle mały aby przez 1s się naładował.
    Bo pstrykać mikroprzełącznikiem to trochę nudne i palce bolą.
    Pewnie z godzinę styki wytrzymają.
    A potem się skleją- ale raczej wypalą.
  • #28 10078082
    mirekk36
    Poziom 42  
    janbernat --> słusznie prawisz, ale z jednym się nie zgodzę.

    Owszem - kondensatory przy zasilaniu procka (filtrowanie zasilania) są ALE NIEZBĘDNE a nie tylko wskazane. Bez nich w zdecydowanej większości przypadków będziemy mieli ewidentne problemy i początkujący co i rusz je mają.

    Ale już na temat rezystorów w szereg ze słiczami przy zastosowaniu kondka 100nF - to moim zdaniem już przesada a szczególnie gdy porównuje się uzasadnienie ich stosowania albo stawia się na równi do prawidłowego sposobu filtrowania zasilania.

    Ja jestem gotów z kolegą założyć się o skrzynkę dobrego trunku że gdybyśmy zasiedli do testów przygotowując sobie laboratorium z tysiącem słiczy i mikrokontrolerów, które będziemy pstrykać 24h/dobę, że prędzej one się rozkruszą i zniszczą fizycznie niż im coś się stanie od tych gigantycznie teoretycznie wielkich szpilek, albo jeśli miałby się od tego pstrykania zawiesić chociaż jeden z tego tysiąca mikrokontrolerów ;)

    Chociaż taki test bardziej przypominałby te ostatnio pokazywane testy urządzeń ZELMER'a w reklamach telewizyjnych ;)....

    Ale spokojnie nawet jakbym wygrał ten zakład ( a na pewno bym wygrał - to i tak byłaby okazja żeby razem usiąść i rozpić tą skrzynkę trunku - podyskutować ) ;)
  • #29 10078242
    janbernat
    Poziom 38  
    Nawet perspektywa rozpicia skrzynki dobrego trunku nie skłoni mnie- ani Ciebie- do wydania majątku na przyrządy pomiarowe do takiego laboratorium.
    Zresztą- takie laboratoria są- mają je dobre firmy produkujące przekaźniki, styczniki czy inne przełączniki.
    To jest ogromny biznes- elementy stykowe.
    Ale my mówimy o tym jak zrobić coś dobrze- na podstawie tego co wiemy i co producenci podają.
    Po to aby mieć jak najmniej kłopotów później.
    Zresztą- trzeba by mieć sporo parametrów na wejściu zeby to obliczyć.
    Oporność, indukcyjność, pojemność:
    Scieżek, kondensatora, mikroprzełącznika, opornika.
    A jestem prawie pewien że debouncig robisz od dawna programowo a nie z kondensatorem.
    Telewizji nie używam- więc nie wiem o co chodzi z Zelmerem...
  • #30 10078283
    mirekk36
    Poziom 42  
    janbernat napisał:

    A jestem prawie pewien że debouncig robisz od dawna programowo a nie z kondensatorem.


    Oczywiście ;)


    janbernat napisał:
    Telewizji nie używam- więc nie wiem o co chodzi z Zelmerem...


    No szkoda, te reklamy warto zobaczyć i się pośmiać troszkę, ale z drugiej strony to racja - ja też TV używam od wielkiego dzwonu ;)
REKLAMA