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

[ATmega32][c/WinAVR] Przerwania w ZL3AVR

clapik 07 Sie 2011 16:50 2135 16
REKLAMA
  • #1 9800603
    clapik
    Poziom 9  
    Witam wszystkich!

    Mój problem polega na tym, że przerwania nie chcą działać.

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


    Diody w ogóle nie gasną, a wydaje mi się, że wszystko napisałem w porządku.

    Proszę o pomoc.
  • REKLAMA
  • Pomocny post
    #2 9800628
    dondu
    Moderator na urlopie...
    1. Ustawiasz cały portD jako wyjścia a na nim są wejścia INT którymi chcesz generować przerwania.

    2. używasz starych wektorów przerwań, używaj nowych ISR: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

    3. pokaż schemat swojego układu.

    4. return(0) jest zbędne. Wystarczy:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 9800672
    clapik
    Poziom 9  
    1. Pomyłka w komentarzu, jak widzisz ustawiłem na 0, czyli na wejście.
    2,4. Nowy kod nic nie zmienił:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    3. Schemat i trochę opisu: Link

    Dzięki za informacje, zastanawiałem się dlaczego niektórzy korzystają z jakiegoś ISR.
  • REKLAMA
  • #4 9801459
    mirekk36
    Poziom 42  
    Cały kod z twojego pierwszego postu powinien normalnie zadziałać. Owszem zastosowane starsze makro SIGNAL, czy return 0; to jakieś drobiazgi, które nie mają żadnego wpływu na to że program miałby źle z tego powodu zadziałać. Taki program testowy.

    O ile jednak warto używać ISR() zamisst SIGNAL(), czy też nie ma sensu wpisywanie return 0; po pętli nieskończonej o tyle na pewno nie ma najmniejszej różnicy stosowanie pary nawiasów klamrowych w takim przypadku:

    while(1); ----> bo to jest w 100% dokładnie to samo co ----> while(1) {} .... i nawet po ostatnim nawiasie klamrowym żaden średnik nie jest potrzebny. Ale to też tylko czysto kosmetyczna uwaga.

    Dokładnie tak samo kosmetyczną uwagą może być to, że po resecie przy starcie procka nie trzeba ustawiać pinów jako wejścia (twoje DDRD=0;) ... bo domyślnie wszystkie są wejściami po resecie.

    Proponuję żebyś sprawdził czy podajesz stan zerowy na właściwy pin czyli PD2, bo podejrzewam, że tu może robisz jakiś prosty błąd - może niechcąco podajesz ten stan na jakiś pin obok, PD1 albo PD3 - sprawdź to dokładnie. Bo stan na porcie A powinien się na pewno zmienić na 0 - nawet jak pisałem w kodzie z pierwszego postu.
  • #5 9801815
    Brutus_gsm
    Poziom 25  
    Ustaw przerwanie dla poziomu niskiego, zamiast dla zbocza malejącego i sprawdź jaki wynik. Też kiedyś miałem problemy z tymi przerwaniami i mi to pomogło, do tej pory nie wiem dlaczego...
  • #6 9802039
    clapik
    Poziom 9  
    mirekk36: Dobrze mam wszystko podpięte.

    Brutus_gsm: Jeżeli powinienem to zrobić przez komendę MCUCR=0; to nie działa.

    Nie wiem czy to nie jakiś problem z operatorami przypisania, bo czasami widuję '=' a czasami '|='.
  • #8 9802065
    mirekk36
    Poziom 42  
    clapik napisał:
    mirekk36: Dobrze mam wszystko podpięte.


    Ja się z tobą nie spieram, chcę pomóc tylko - a wygląda to na błędy połączeń być może, bo kod jest poprawny.

    clapik napisał:
    Brutus_gsm: Jeżeli powinienem to zrobić przez komendę MCUCR=0; to nie działa.


    Bo ustawienie wyzwalania przerwania poziomem logicznym zamiast zboczem nie jest żadnym a już na pewno nie poprawnym rozwiązaniem. Nie poprawnym dlatego że nie równoważnym.

    clapik napisał:
    Nie wiem czy to nie jakiś problem z operatorami przypisania, bo czasami widuję '=' a czasami '|='.


    No to warto sobie jednak poczytać gdzieś dokładniej o tych operatorach, zresztą właśnie prawie w tym samym czasie podpowiadałem komuś w innym wątku w identycznej kwestii, w tym także na pytanie o te operatory, zobacz tu:

    https://www.elektroda.pl/rtvforum/topic2054846-30.html#9795763
  • REKLAMA
  • #9 9802069
    clapik
    Poziom 9  
    Fakt, zapomniałem powiedzieć. Mam wyjście JP13 podpięte pod PD2, a klawiaturę (JP23) podpiętą pod port C. Stąd ustawienia wartości dla tego portu (w tutaj podanym kodzie zakomentowane).
  • #10 9802077
    dondu
    Moderator na urlopie...
    clapik napisał:
    Fakt, zapomniałem powiedzieć. Mam wyjście JP13 podpięte pod PD2, a klawiaturę (JP23) podpiętą pod port C. Stąd ustawienia wartości dla tego portu (w tutaj podanym kodzie zakomentowane).

    I którym przyciskiem wywoływać chcesz przerwanie?
  • #11 9802079
    mirekk36
    Poziom 42  
    dondu napisał:
    Napisz konkretnie jak masz rozwiązany sprzętowo przycisk, czy inny system wywołania przerwania na INT0, bo z tego schematu nie bardzo to widzę.


    Dokładnie, a ze schematu widać jednak, że tylko klawisze w ramach tzw małej klawiatury S1, S5, S9 oraz S13 robią zwarcie do GND, czyli tylko w tym przypadku uzyskasz swoje zbocze opadające. A w przypadku pozostałych klawiszy nie, ponieważ trzeba je traktować już w całości jako klawiaturę matrycową (są tam diody) i zrobić całą obsługę. Warto panie autor czytać schematy dokładniej bo jednak za chwilę się okaże, że nie masz poprawnie podłączonego przycisku do PD2 (INT0)
  • #12 9802081
    clapik
    Poziom 9  
    No według opisu płytki na JP13 pojawi się stan niski, gdy jakikolwiek przycisk zostanie wciśnięty. Więc jakimkolwiek.
  • REKLAMA
  • #14 9802090
    mirekk36
    Poziom 42  
    clapik napisał:
    No według opisu płytki na JP13 pojawi się stan niski, gdy jakikolwiek przycisk zostanie wciśnięty. Więc jakimkolwiek.


    No i znowu się sprzeczasz. Tak pojawi się ale jeśli wcześniej na wejścia W1..W4 podłączysz do GND. (a one zapewne u ciebie wiszą w powietrzu, więc skąd oczekujesz tam stanu niskiego?)

    Sprawdź sobie po co jest złącze JP3 - to tu wystarczy że podasz GND a wtedy jeden z wyżej wymienionych przeze mnie klawiszy możesz podłączyć do PD2 (INT0)
  • #15 9802095
    clapik
    Poziom 9  
    Nie sprzeczam się, tylko napisałem swój post zanim przeczytałem Twój. Faktycznie przerwanie działa tylko i wyłącznie, dla JP3 zwartego. Elektronikiem jestem raczej słabym, więc schematy za dużo mi nie mówią. Czyli nie ma żadnej szansy na skorzystanie z JP13 dla pełnej klawiatury?
  • #16 9802105
    dondu
    Moderator na urlopie...
    A na koniec pamiętaj jeszcze o drganiach styków, które wywołają przerwanie kilka razy:
    http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html

    Choć dla zgaszenia diod nie będzie to miało znaczenia, ale zapewne to dopiero początek Twojego projektu :)

    No i jeszcze pull-up włącz bo na schemacie nie widzę rezystorów podciągających.
    EDIT. pull-up już masz tylko komentarz nieco mylący.
  • #17 9802180
    mirekk36
    Poziom 42  
    clapik napisał:
    Czyli nie ma żadnej szansy na skorzystanie z JP13 dla pełnej klawiatury?


    Ależ jest ;) ... po to to zostało zrobione, tyle, że obsługa tego musi wyglądać całkiem inaczej niż na razie ci się to wydaje (w porównaniu do wykorzystania pojedynczych klawiszy)

    Musisz poczytać o obsłudze klawiatury matrycowej, a wtedy JP13 rzeczywiście podłączysz sobie do któregoś wejścia INTx. A na dzień dzisiejszy jeśli jeszcze nie wiesz jak się programowo obsługuje klawiaturę matrycową - to podłącz sobie wejścia W1..W4 do GND i wtedy też będzie ci każdy klawisz wyzwalał to przerwanie. Tyle, że nie będziesz w stanie stwierdzić który z nich, więc za dużego sensu to nie będzie miało.
REKLAMA