Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Czy przerwanie jest "przechowywane"? Uszkodzona Atmega?

Templarious 03 Jul 2019 11:43 945 21
  • #1
    Templarious
    Level 22  
    Witam,

    Zmagam się z problemem przerwania w Atmega 8. Bez zagłębiania się w szczegóły mojego projektu, dajcie mi prosze znac czy to normalne zachowanie:

    1. Przycisk S1 oraz Impulsator z przyciskiem S2.
    Impulsatorem "chodzę" sobie po menu i klikam przycisk impulsatora S2, który akurat w tej pętli nic nie robi, przerwania sa wyłączone cli(); ale uruchomione jest detekcja zbocza dla INT0 i dla INT1.



    Dopiero gdy zatwierdzam wybór w menu przyciskiem S1, czekam chwile używając metody debounce tak aby nie bylo drgan na stykach przycisku, wychodze z pętli i dopiero uruchamiam przerwania sei();.

    Pojawia się nagle przerwanie od przycisku S2 impulsatora.... czy to normalne?

    Sytuacja w której to się nie pojawia jest taka, ze jak nie nacisne przycisku S2, to tego przerwania po wybrania czegos tam z menu nie ma.

    Dajcie mi prosze znać bo zaczynam podejrzewać ze Atmega8 jest uszkodzona.

    PS. identyczny kod działa w innym moim projekcie z identyczna deklaracja rejestrów, pinów i pętlą z uruchamianiem przerwań...
  • #3
    Templarious
    Level 22  
    Czesc,

    No niestety nie hula... probowałem tego. Myśle ze atmega jest zryta jakos... Mimo tego, ze mam obsługe przerwań i tak, wiem ze to musi działać bo skopiowałem to z mojego poprzedniego projektu, to mi się restartuje atmega. Zwrać na płytce nie ma.

    Code: c
    Log in, to see the code
  • #4
    dondu
    Moderator on vacation ...
    Po pierwsze wklej kod prawidłowo, by go można było przeanalizować.
    Po drugie zadałem konkretne pytanie, ale nie odpowiedziałeś.
    Po trzecie ponowię: Nie dopatruj się przyczyny w ATmedze, tylko szukaj błędu w swoim programie.
  • #5
    Templarious
    Level 22  
    dondu wrote:
    Zamiast obwiniać ATmegę, zaglądnij do dokumentacji :)
    Jak rozumiesz ten opis:

    Czy przerwanie jest "przechowywane"? Uszkodzona Atmega?


    Rozumiem go w ten sposób, że jak napisze:

    Code: c
    Log in, to see the code

    to wyczyszczę Flagę globalnego przerwania (dla INT0), która bedzie "obsłużona" po deklaracji sei(); czyli odblokowanie globalnych przerwań.

    Wydaje mi się, że Atmega 8 jest popsuta.
  • #6
    dondu
    Moderator on vacation ...
    1. W kodzie nie ma włączenia rezystorów pull-up, a brak schematu nie pozwala stwierdzić, czy prawidłowo generowany jest sygnał na pinach INTx.

    2. Jeśli wszystko powyżej jest prawidłowo (pokaż schemat), to zrób sobie kopię programu i wywal wszystko pozostawiając tylko to, co jest potrzebne do sprawdzenia przerwań na INTach i dodaj jakieś diody by sprawdzić działanie. Tak przygotowany program przetestuj, a w razie problemów pokaż go.
  • #7
    Templarious
    Level 22  
    Czesc,

    Załączam dodatkowa bibliotekę ioinit:
    Code: c
    Log in, to see the code


    Schemat:

    Czy przerwanie jest "przechowywane"? Uszkodzona Atmega?

    Dzisiaj kolo 19.00 sprawdzę jak piszesz aczkolwiek.... nie wróżę sukcesu. Chce miec potwierdzenie ze kod jest ok i to powinno działać a ubita jest atmega.
  • #8
    BlueDraco
    MCUs specialist
    To pomyliłeś adresy. Na tym forum raczej szuka się prawdziwych przyczyn problemów, a nie potwierdza małoprawdopodobne tezy o usterkach układów i kompilatorów. Ja na schemacie widzę masę zbędnych rezystorów, źle podłączony wyświetlacz i zbyt duże wartości rezystorów podciągających (abstarahując od tego, że rozciągnięcie schematu i dziwne pozycjonowanie elementów znakomicie go zaciemnia). W drogocennym i tajnym kodzie spodziewam się podobnych kwiatków.
  • #9
    Templarious
    Level 22  
    BlueDraco wrote:
    To pomyliłeś adresy. Na tym forum raczej szuka się prawdziwych przyczyn problemów, a nie potwierdza małoprawdopodobne tezy o usterkach układów i kompilatorów. Ja na schemacie widzę masę zbędnych rezystorów, źle podłączony wyświetlacz i zbyt duże wartości rezystorów podciągających (abstarahując od tego, że rozciągnięcie schematu i dziwne pozycjonowanie elementów znakomicie go zaciemnia). W drogocennym i tajnym kodzie spodziewam się podobnych kwiatków.


    Rozumiem, dlatego prosze o pomoc. Które rezystory są zbedne ? Dlatego założyłem temat. Nie prosze o gotowe rozwiązanie ale o pomoc w zwróceniu uwagi na istotne elementy.

    Co do wyświetlaczy, dlaczego są źle podłączone? Przecież działają.

    Co do kodu - tak, profesjonalista nie jestem dlatego jak pisze - prosze o pomoc.
  • #11
    Templarious
    Level 22  
    dondu wrote:
    Templarious wrote:
    Dzisiaj kolo 19.00 sprawdzę jak piszesz

    Czekam na rezultat i program, który przygotujesz.


    Kod programu:

    Code: c
    Log in, to see the code


    Rezultat: działa. Tzn. klikam przycisk enkodera, włączam buzzer, przyciskam przycisk "abort" i wyłącza buzzer.

    Teraz pytanie czy działa mi kasowanie "pending interrupt FLAG". Nie za bardzo mam pomysł jak to sprawdzić.
  • #12
    Strumien swiadomosci swia
    Level 43  
    Templarious wrote:
    Pojawia się nagle przerwanie od przycisku S2 impulsatora.... czy to normalne?

    Podejrzewewam że naciśnięcie S2 uaktywnia globalne przerwania.
  • #13
    Templarious
    Level 22  
    Strumien swiadomosci swia wrote:
    Templarious wrote:
    Pojawia się nagle przerwanie od przycisku S2 impulsatora.... czy to normalne?

    Podejrzewewam że naciśnięcie S2 uaktywnia globalne przerwania.


    Idzmy głównym wątkiem bez cofania sie. Tak, uaktywnia ale już wiem, ze było ono przechowywane w SREG. To jest wyjaśnione.

    Pytanie które teraz musimy wyjasnic w ramach tego tematu, jest to, zeby odpowiedziec czy działa mi kasowanie tej flagi globalnego przerwania.

    Chce używać przycisku S2 (impulsatora) do zaznacznia pewnych rzeczy w menu, a po wyjsciu z menu triggerowac pewne zachowania.... i tutaj pojawia się problem bo mi to po prostu nie działa gdyż kasowanie flagi w SERG mi nie działa (wręcz resetuje mi uC).
  • #14
    krzysiek_krm
    Level 40  
    Bardzo przepraszam ale z głupia frant zapytam: czy nie lepiej zrobić to wszystko zgodnie z zasadami sztuki ?
    Mam na myśli "macanie" wszystkich mechanicznych elementów w przerwaniu zegarowym, maskowaniu drgań, itp, itd.
  • Helpful post
    #15
    dondu
    Moderator on vacation ...
    Templarious wrote:
    Idzmy głównym wątkiem bez cofania sie. Tak, uaktywnia ale już wiem, ze było ono przechowywane w SREG. To jest wyjaśnione.

    W SREG przechowywana jest informacja o fladze I, czyli fakt włączenia lub wyłączenia przerwań globalnych. Nie ma to nic wspólnego z "przechowywaniem" informacji o przerwaniach INTx.

    Instrukcjami operującymi na fladze I w SREG są:
    - sei(), która włącza przerwania globalne ustawiając bit I
    - cli(), która wyłącza przerwania globalne zerując flagę I.

    Rejestrem przechowującym informację dot. przerwań INTx jest GIFR i stosujesz go w swoim głównym programie.

    Templarious wrote:
    Pytanie które teraz musimy wyjasnic w ramach tego tematu, jest to, zeby odpowiedziec czy działa mi kasowanie tej flagi globalnego przerwania.


    cli() na pewno zadziała prawidłowo. Sprawdź najpierw kasowanie flagi INT1.
    Program, który wkleiłeś powyżej zmodyfikuj tak:

    Code: c
    Log in, to see the code


    Buzzer nie powinien się uruchomić jeśli na INT1 wywołasz zbocze opadające w czasie trwania delaya.
    Po upływie delaya wywołanie zbocza opadającego na INT1 włączy buzer, a na INT0 wyłączy go.

    Jeśli efekt będzie inny to powinieneś sprawdzić, czy nie ma zwarcia pomiędzy INT0 i INT1.
  • #16
    Templarious
    Level 22  
    Dondu, działa. Tzn efekt jest zamierzony. Przed delayem dałem jest właczenie diody na wyświetlaczu a wyłączam diode w pętli while(1) aby mieć pewność, że naciskanie enkodera jest przed delayem.
    ============================
    Code: c
    Log in, to see the code

    edit.
    Mam problem jeszcze z enkoderem, mianowicie jedno kliknięcie jest liczone jako 2. kod jest z ksiazki Tomasza Francuza. Gdzie mogłbym szukać błędu?

    Pieknie dziękuje za całą pomoc!
  • #17
    tmf
    Moderator of Microcontroller designs
    Templarious wrote:
    Mam problem jeszcze z enkoderem, mianowicie jedno kliknięcie jest liczone jako 2. kod jest z ksiazki Tomasza Francuza. Gdzie mogłbym szukać błędu?

    Niekoniecznie jest to błędem. Zależy to od budowy enkodera - są takie, które generują nawet 4 impulsy na jedno "kliknięcie" - po prostu trzeba podzielić wynik przez 4 lub 2 w zależności od typu enkodera.
  • #18
    Templarious
    Level 22  
    tmf wrote:
    Templarious wrote:
    Mam problem jeszcze z enkoderem, mianowicie jedno kliknięcie jest liczone jako 2. kod jest z ksiazki Tomasza Francuza. Gdzie mogłbym szukać błędu?

    Niekoniecznie jest to błędem. Zależy to od budowy enkodera - są takie, które generują nawet 4 impulsy na jedno "kliknięcie" - po prostu trzeba podzielić wynik przez 4 lub 2 w zależności od typu enkodera.


    Jak moge podzielić wynik na 2, jeżeli mam konwersje kodu graya:

    0 0 ->enc_delta=0
    0 1 ->enc_delta=-1
    1 1 ->enc_delta=1
    1 0 ->enc_delta=1

    Czy mogę prosić o podpowiedź? Mam impulsator który na obrót (jedno klikniecie) tak jakby 2 kroki.
  • #19
    tmf
    Moderator of Microcontroller designs
    Konwersja jest ok, to co dzielisz to wynikową liczbę zliczonych impulsów. Czyli enc_delta dodajesz to jakiejś zmiennej, przechowującej różnicę pomiędzy ostatnio odczytaną, a bieżącą pozycją enkodera i tak zliczoną liczbę impulsów dzielisz przez dwa. Reagujesz tylko na wartości parzyste lub nieparzyste.
  • #20
    Templarious
    Level 22  
    tmf wrote:
    Konwersja jest ok, to co dzielisz to wynikową liczbę zliczonych impulsów. Czyli enc_delta dodajesz to jakiejś zmiennej, przechowującej różnicę pomiędzy ostatnio odczytaną, a bieżącą pozycją enkodera i tak zliczoną liczbę impulsów dzielisz przez dwa. Reagujesz tylko na wartości parzyste lub nieparzyste.


    Coś takiego? Aczkolwiek mam warning compilatora, że funkcja nie zwraca żadnej wartości.

    Code: c
    Log in, to see the code
  • #21
    Templarious
    Level 22  
    BlueDraco wrote:
    To pomyliłeś adresy. Na tym forum raczej szuka się prawdziwych przyczyn problemów, a nie potwierdza małoprawdopodobne tezy o usterkach układów i kompilatorów. Ja na schemacie widzę masę zbędnych rezystorów, źle podłączony wyświetlacz i zbyt duże wartości rezystorów podciągających (abstarahując od tego, że rozciągnięcie schematu i dziwne pozycjonowanie elementów znakomicie go zaciemnia). W drogocennym i tajnym kodzie spodziewam się podobnych kwiatków.


    Nie lubie ludzi którzy wtrącaja swoje 5 groszy i nie tłumacza się potem z tego co napisali. Zadałem pytanie z prosba o wyszczególnienie dlaczego wyświetlacz jest źle podłaczony? Jezeli ktoś nie ma zmaiaru kontynuowac rozmowy to po co w ogole odpisywac na forum?

    PS. wyświetlacz działa i ma się świetnie.
  • #22
    maciej_333
    Level 37  
    Rzeczywiście należałoby zrobić to zgodnie z zasadami sztuki tzn. próbkować co jakiś tam czas wszystkie klawisze i enkoder w przerwaniu timera. Na tej podstawie robi się odtłumianie drgań styków. Na przerwaniach trudno zrobić to prawidłowo.

    Odnośnie schematu, to kolega Dondu ma rację. Jest narysowany niezbyt czytelnie. Ogromna większość rezystorów i kondensatorów jest niepotrzebna. Są to np. R35, R15, R32, R33 itd. Podobnie C6, C14, C5 itd. Nie ma też sensu np. R16. Takie rezystory stosowało się w TTL, kiedy napięcie zasilania mogło przekroczyć 5,5 V. Właściwie to po co te rejestry przesuwne ? Można to było zrobić przez multipleksowanie i 7447, co wymagałoby raptem 6 linii mikrokontrolera plus kropki. Nie wiem do czego też są T1 i T2, skoro wyświetlacze są sterowane statycznie ? Inna sprawa to wartość R28 i R29. Są też takie układy jak MAX7219. Kolejny zbędny rezystor to np. R27, R31, R26. Symbol dla VO14642A jest niepoprawny, co wprowadza w błąd. Zresztą nie wiem do czego ten układ, skoro rezygnujesz z izolacji galwanicznej. Dlaczego nie zastosowałeś jakiegoś tranzystora, albo jakiegoś ULN ? R30 i R34 mają za duże wartości. Dla odmiany R14 i R37 znacznie za małe. Wg. producenta prąd diody VO14642A powinien wynieść 0,5 mA dla załączenia. Ty dałeś aż 50 mA, czyli jest to wartość maksymalna. Pomijam już obciążalność pinów Atmegi. Zresztą w ogóle nie mogę pojąć jak VO14642A mają tu działać. Skoro zostały wolne linie Atmegi, to dlaczego dołączyłeś klawisz do pinu ISP ? Co jak naciśniesz klawisz w trakcie programowania pamięci ?

    Cóż każdy się kiedyś uczył.