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] Wybudzanie uC przez INT0 oraz INT1

tombus 18 Kwi 2011 21:19 1711 9
REKLAMA
  • #1 9415946
    tombus
    Poziom 15  
    Witam. Już mnie krew zalewa. Nie potrafię sobie poradzić z problemem. Prawdopodobnie ktoś szybko znajdzie błąd, ale ja już nie mam siły do tego.
    Problemem jest wybudzenie mikrokontrolera z power_down przez przerwanie zewnętrzne INT1. INT0 działa bez problemu, natomiast nie potrafię zmusić do tej czynności INT1. Celem jest wybudzanie mikrokontrolera przez INT0 oraz INT1.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9416382
    dondu
    Moderator na urlopie...
    INT1 działa tylko na poziom, a nie na zbocze:

    [Atmega32] [C] Wybudzanie uC przez INT0 oraz INT1

    EDIT:
    Ale teraz zauważyłem, że jednak chyba ustawiasz INT1 na właściwy tryb w przerwaniu od przepełnienia Timera.
    Odnoszę wrażenie, że masz strasznie przekombinowany kod. Możesz napisać co on robi i co chcesz osiągnąć?
  • REKLAMA
  • #3 9416459
    tombus
    Poziom 15  
    Jest to szkielet i mocno okrojona programu, który będzie odpowiadał za licznik rowerowy :) Sporo tam liczenia i używania TIMERów. INT0 odpowiada za zliczanie impulsów z kontaktronu a INT1 miał odpowiadać tylko za przycisk. Problem pojawił się, gdy licznik wyciągnę z podstawki z roweru gdy licznik jest już uśpiony. Chcąc go przeglądać i spisać dane musiałbym zwierać końcówki od INT0. Przecież mógłbym wykorzystać INT1 jako przycisk, który dodatkowo odpowiadałby za wchodzenie i wychodzenie z menu :)
  • REKLAMA
  • REKLAMA
  • #5 9416544
    tombus
    Poziom 15  
    TIMER0 - ma przerwanie co 0,2sekundy dla sprawdzenia różnych ustawień w zależności od menu. Takie różne opcje potrzebne w liczniku rowerowym :)
    TIMER1 - potrzebny do odliczania czasu między impulsami pochodzącymi od kontaktrona odłączonego pod INT0.

    Próbowałem według Twoich sugestii ustawiać INTy w mainie, ale również nie daje to efektu.
  • Pomocny post
    #8 9416604
    dondu
    Moderator na urlopie...
    Jak masz ustwaiony pin PD3 (INT1)?
    Nie widzę abyś ustawiał go jako wejście, istotne ponieważ muszą być wejściami gdyż:

    Cytat:
    The External Interrupts are triggered by the INT0, INT1, and INT2 pins. Observe that, if enabled, the interrupts will trigger even if the INT0..2 pins are configured as outputs. This feature provides a way of generating a software interrupt.
  • #9 9416673
    tombus
    Poziom 15  
    Działa :) Miałeś rację. Należało tylko to ustawić i poszło gładko. Widać, że brakuje mi jeszcze cierpliwości, doświadczenia i spostrzegawczości w przedzieraniu się DSie :)
    Dodam tylko, że musiałem:

    MCUCR &= ~(1<<ISC11) | (1<<ISC10);

    zostawić w przerwaniu, bo inaczej wybudzanie działało tylko raz. Prawdopodobnie da się to jeszcze naprawić, ale już nie dzisiaj :)
    Dziękuję i pozdrawiam.
REKLAMA