Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmeg8 - Power down, Bascom

MICHAŁ6201 07 Paź 2013 19:49 2565 7
  • #1 07 Paź 2013 19:49
    MICHAŁ6201
    Poziom 16  

    Witam Wszystkich
    Chcę wprowadzić atmegę w power down za pomocą Int0, a także wybudzić go ze snu za pomocą Int0.

    Nigdy wcześniej tego nie robiłem i szukając w internecie też nie trafiłem na wsad, na którym mógłbym się wzorować.

    Program piszę w Bascom.
    Atmega8 ma wejść w stan power down jeśli na końcówce Int0 pojawi się 1, natomiast ma się wybudzić jeśli na Int0 pojawi się stan niski.

    Atmega8 taktowana zegarem wewnętrznym 1MHz.

    Ogólnie szkielet programy wyglądałby tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    I nie wiem teraz jak napisać część programu odpowiedzialną za wybudzenie procka jeśli na Int0 pojawi się stan niski.

    I jeszcze jedno pytanie - jeśli wprowadzę procek w power down i program będzie błędnie napisany, to jest taka możliwość, że procek zaśnie na wieki wieków?

    Z góry dziękuję za pomoc i sugestie.

    0 7
  • #2 07 Paź 2013 22:41
    Marek_Skalski
    Moderator Projektowanie

    Nie tak łatwo jest przejść na ciemną stronę mocy ;)
    Atmeg8 jest nieśmiertelna, a w razie zasłabnięcia reset zawsze ją ożywi. Bez obaw.
    Co do uśpienia, to nie mam pojęcia jak to wygląda w bascom'ie (ja znam tylko asm i trochę C), ale na ogół trzeba ustawić odpowiedni bit (zezwolić na uśpienie) i wykonać instrukcję "sleep". Jeżeli wykryjesz stan wysoki na pinie INT0 (możesz próbkować co jakiś czas), wtedy podejmujesz decyzję o uśpieniu. Możesz to zrobić w pętli głównej, możesz w podprogramie.
    Budzi się sama, o ile ma włączone zezwolenie na przerwanie od INT0, a INT0 jest ustawione na generowanie przerwania od niskiego stanu (nie zbocza!). Będzie kontynuować program za instrukcją usypiania. Nie trzeba nic szczególnego robić poza wyłączeniem możliwości uśpienia na czas wykonywania programu (ze względów bezpieczeństwa).

    0
  • #3 07 Paź 2013 22:42
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    Witam Wszystkich
    Chcę wprowadzić atmegę w power down za pomocą Int0, a także wybudzić go ze snu za pomocą Int0.

    Nigdy wcześniej tego nie robiłem
    Ogólnie szkielet programy wyglądałby tak:

    Code:

    $regfile = "m8def.dat"
    $crystal = 1000000
    .................

    ' konfiguracja przerwania:

    Config Int0 = Falling
    Enable Int0
    On Int0 ' -tu brakuuje kierunku do subrutyny co ma byc wykonane podczas wystąpienia interruptu.
    Enable Interrupts

    Config Portd.2 = Input : Portd.2 = 1 : P Alias Pind.2

    Do
    ' wykonuje jakąś czynność w pętli głównej...

    If P = 1 Then ' to nie jest subrutyna interruptu

    Powerdown

    End if
    Loop
    End



    I nie wiem teraz jak napisać część programu odpowiedzialną za wybudzenie procka jeśli na Int0 pojawi się stan niski.



    W pierwszym rzędzie zapoznaj się z tabelą 14 str. 35 w ATMega8 datasheet.
    Pod tabelą masz:
    Notes:
    3. Only level interrupt INT1 and INT0.
    znaczy to że interrupt skonfigurowany tylko "LEVEL" może wybudzic processor z "Powerdown".

    Poczytaj także Bascom Manual str. 636/637 na temat: "CONFIG POWERMODE"....
    Brak subrutyny wywołanej przez interrupt powoduje że ten interrupt nie jest atywny (enabled), pomimo że masz takie instrukcje!
    Enable Int0
    Enable Interrupts

    Aby interrupt był aktywny na zbocze (Falling/rising) musi byc także aktywny zegar a w 'Powerdown' CLK jest zatrzymany.
    Nawet przy poprawnej konfiguracji interruptów stosowanie tegosamego interruptu do powerdown i późniejszego wybudzenia (wake up) prowadzi do pewnego konfliktu; Jeżeli w interrupcie wprowadzisz processor w 'powerdown' to jednocześnie/formalnie zamykasz drogę do jego wybudzenia, ponieważ przed wykonaniem tej procedury wszystkie interrupty automatycznie są globalnie "disabled". Oczywiście jest szansa aby to obejśc przez przekonfigurowanie samego interruptu w jego subrutynie i enable interrupts, które były 'zawieszone'.
    Niemniej jednak umieszczenie w pętli gównej programu instrukcji:
    If P = 1 Then
    Powerdown

    spowoduje natychmiastowe ponowne wprowadzenie processora w powerdown nawet przy poprawnie skonfigurowanym INT0 i jego wybudzeniu.

    Zazwyczaj w praktyce te dwa źródła są różne i nie zachodzi potrzeba szukania wyjścia z tego rodzaju błędnej kombinacji.

    e marcus

    0
  • #4 08 Paź 2013 10:54
    MICHAŁ6201
    Poziom 16  

    Czyli błędnie rozumowałem, że mogę wybudzić procka przez Int0, bo jeśli będzie procek w power down, to Int0 nie będzie działać, więc nie zareaguje na pojawienie się tam stanu niskiego.

    Ale nadal nie wiem jak obudzić procek. W helpie bascoma nie ma na to odpowiedzi. Może to jest tak oczywiste, że nie trzeba tego tłumaczyć...

    A może dopiąć do procka jakieś zewnętrzne taktowanie, np. z sygnał INT z PCF8583?

    Nie bardzo jestem to w stanie sobie wyobrazić i tak szukam po omacku.

    0
  • #5 08 Paź 2013 11:20
    dondu
    Moderator Mikrokontrolery Projektowanie

    MICHAŁ6201 napisał:
    Czyli błędnie rozumowałem, że mogę wybudzić procka przez Int0, bo jeśli będzie procek w power down, to Int0 nie będzie działać, więc nie zareaguje na pojawienie się tam stanu niskiego.

    Ale nadal nie wiem jak obudzić procek. W helpie bascoma nie ma na to odpowiedzi. Może to jest tak oczywiste, że nie trzeba tego tłumaczyć...

    Zanim wyciągniesz wnioski zaglądnij do dokumentacji mikrokontrolera: http://www.atmel.com/devices/atmega8.aspx?tab=documents
    Znajdziesz tam odpowiedni rozdział "Power Management and Sleep Modes", a w nim punkt Power-down Mode, gdzie wszystko pisze.
    W rozdziale tym znajdziesz także tabelkę:

    Atmeg8 - Power down, Bascom

    Z niej także wyczytasz, co wybudza i w jaki sposób (patrz przypisy pod tablicą) z trybu, który potrzebujesz użyć.

    BTW. Porzuć BASCOM ... bo to ślepa ulica: http://mikrokontrolery.blogspot.com/2011/04/jaki-jezyk-wybrac.html

    0
  • #6 08 Paź 2013 11:40
    MICHAŁ6201
    Poziom 16  

    Czyli wychodzi na to, że można go obudzić przez INT0 za pomocą LOW LEVEL czyli stanem niskim podanym na INT0.

    To skoro po uśpieniu nie działa INT0, to jak można obudzić za pomocą INT0. Nic już z tego nie rozumiem.

    0
  • #7 08 Paź 2013 12:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zapewne:
    1. nie włączyłeś przerwań globalnych,
    2. lub nie włączyłeś przerwań z INT0,
    3. lub nie ustawiłeś reakcji INT0 na low level.

    Zobacz w dokumentacji mikrokontrolera tabelkę Table 32. Interrupt 0 Sense Control oraz rejestr GICR.

    Jak to zrobić w BASCOM nie wiem :)

    0
  • #8 08 Paź 2013 14:56
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    Czyli błędnie rozumowałem, że mogę wybudzić procka przez Int0, bo jeśli będzie procek w power down, to Int0 nie będzie działać, więc nie zareaguje na pojawienie się tam stanu niskiego.


    Nie bardzo jestem to w stanie sobie wyobrazić i tak szukam po omacku.


    Nie, nie rozumowałeś błędnie.
    Błędem jest to, że chcesz wykorzystac ten sam interrupt do 'POWERDOWN' processora i równocześnie tymsamym interruptem przy tej samej konfiguracji dokonac jego wybudzenia.
    To tak nie pracuje niezależnie od stosowanego środowiska BASCOM czy też "C" lub Assembler.
    oto masz przykład kodu (poprawiłem trochę ten twój)
    [code]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Aby wysłac processor w 'powerdown ' mode możesz wykorzystac setki różnych rozwiązań nie tylko stan logiczny określolnego pinu. Moze to byc jakaś wartośc zmiennej lub zawartośc timera... cokolwiek. Moższ także wykorzystac inny interrupt, wtedy w jego obsłudze należałoby ponownie uruchomic globalne interrupty o czym pisałem wcześniej.
    Tu akurat dla ułatwienia wyjaśnienia wybrałem pin D.1

    e marcus

    0