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

[Attiny13][BASCOM] nie wchodzi w tryb power down

xdcer 06 Wrz 2011 19:18 5309 22
REKLAMA
  • #1 9901504
    xdcer
    Poziom 12  
    Napisałem oto prosty programik dla attiny13.
    Po zaprogramowaniu jednego procka wszystko jest ok, program działa, a w spoczynku procesor pobiera kilka uA lecz po zaprogramowaniu kolejnego procesor albo w ogóle nie przechodzi w tryb power down albo sam się wybudza, sam nie wiem. Jestem bardzo początkujący i proszę o pomoc. Oto kod:

    
    $regfile = "attiny13.dat"
    $crystal = 1000000
    
    
      Config Portb = &B000101
      Config Int0 = Low Level
      Enable Int0
      Enable Interrupts
    
    On Int0 Up
    
     Do
      If Pinb.1 = 1 Then
       Powerdown
      End If
     Loop
    End
    
     Up:
    
     Waitms 80
    
    If Pinb.1 = 0 Then
    
       Set Portb.1
    
         Toggle Portb.2
         Waitms 150
         Toggle Portb.2
         Waitms 150
         Toggle Portb.2
         Waitms 150
         Toggle Portb.2
         Waitms 150
         Toggle Portb.0
         Waitms 150
         Toggle Portb.0
         Waitms 150
         Toggle Portb.0
         Waitms 150
         Toggle Portb.0
    
         Wait 45
    
         End If
    
    
    Return
    
    
  • REKLAMA
  • #2 9901547
    xury
    Specjalista automatyka domowa
    No ja rozumiem, ze to prosty program itd. ale Wait 45 w przerwaniu to aż prosi się o kłopoty.
    Proponuję zostawić tylko flagę w obsłudze przerwania, a resztę przenieść do pętli głównej. Przy okazji wyrobisz sobie dobry nawyk używania flag i jak najmniej kodu w obsłudze przerwania, a już na pewno żadnych WAIT i WAITMS.
  • REKLAMA
  • #4 9901697
    xury
    Specjalista automatyka domowa
    Flaga to zmienna bitowa. Ma ona za zadanie zasygnalizowanie jakiegoś zdarzenia.
    W Twoim przypadku chodzi o zasygnalizowanie wystąpienia przerwania.
    Wystarczy np. coś takiego:

    
    Up:
    Set flaga
    Return

    Oczywiście zmienna bitowa flaga musi być wcześniej zadeklarowana:
    Dim flaga as bit

    W pętli głównej sprawdzasz czy flaga jest ustawiona:
    If flaga = 1 then
    'to wszystko co miałeś w obsłudze przerwania, oraz:
    Reset flaga 
    End If

    Co zaś do zastąpienia Wait służą timery. Ich obsługa była już wielokrotnie omawiana na forum.
  • #5 9959870
    xdcer
    Poziom 12  
    Narazie odpuszczam tryb powerdown aż nie zrozumiem dokładnie o co chodzi z flagami.

    Zmieniłem troszkę kod:

    
    $regfile = "attiny13.dat"
    
    $crystal = 1000000
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    
    Config Portb = &B000101
    
    Flaga Alias Portb.1
    
    Dim Flaga As Bit
    Dim T As Byte
    
    Config Int0 = Low Level
    Enable Int0
    Enable Interrupts
    
    On Int0 Rob
    
       Do
         If Flaga = 0 Then
    
           For T = 1 To 4
           Toggle Portb.0
           Waitms 50
           Next T
           Waitms 50
           For T = 1 To 4
           Toggle Portb.2
           Waitms 50
           Next T
    
           Set Flaga
    
         End If
       Loop
    End
    
    Rob:
       Reset Flaga
    Return
    


    Teraz diody migają ale całkiem inaczej niż przewiduje program i dzieje się to niezależnie od stanu przerwania int0. Czy jeszcze gdzieś jest błąd?
  • #6 9960111
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 10063332
    xdcer
    Poziom 12  
    Dziękuję za wszystkie podpowiedzi.
    Na chwilę obecną mam coś takiego, ale pobór prądu po uśpieniu to ok 550µA.
    Proszę o dalsze porady.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 10068140
    SylwekK
    Poziom 32  
    Czy piny portu B po wejściu w uśpienie są podciągnięte ? Jeśli tak to ustaw na 0 i sprawdź pobór prądu.
  • #10 10068779
    manekinen
    Poziom 29  
    Do kompletu dodam też żeby wyłączyć brown out detector - ponieważ korzysta on z wew źródła napięcia odniesienia a one też swoje ciągnie. 0.5µA jest całkiem realne do osiągnięcia.
  • #11 10073257
    xdcer
    Poziom 12  
    BOD mam wyłączony, po wyłączeniu Watchdoga program nie działa, miga jedna dioda kilka razy na sekundę INT0 nie reaguje. Po zmniejszeniu częstotliwości z 9,6Mhz do 4,6Mhz pobór prądu wynosił 330µA, a po przejściu na 128 kHz 1mA i teraz to już procka nie można nawet odczytac ID a tym bardziej zaprogramować. Z Attiny 13 zawsze są takie problemy? Na Attiny 2313 to już zadziałało kilka razy bez problemów.
  • REKLAMA
  • #18 10073361
    dondu
    Moderator na urlopie...
    OK, czyli przyczyny sprzętowe (schemat) można uznać, za nie powodujące tych problemów:

    xdcer napisał:
    BOD mam wyłączony, po wyłączeniu Watchdoga program nie działa, ...
    ... a po przejściu na 128 kHz 1mA i teraz to już procka nie można nawet odczytac ID a tym bardziej zaprogramować.

    Uważam, że problem leży po stronie programu, ale niestety w tym Ci nie pomogę, bo BASCOM mnie nie lubi :)
  • #19 10073368
    xdcer
    Poziom 12  
    Mnie chyba też nie. Dzięki za pomoc, może inni koledzy coś podpowiedzą, czekam z niecierpliwością. A swoją drogą po włożeniu do pętli tylko Powerdown bez żadnego programu pobór prądu nadal nie maleje. Może procesory są uszkodzone fabrycznie?
  • Pomocny post
    #22 10074630
    Konto nie istnieje
    Poziom 1  
  • #23 10078774
    xdcer
    Poziom 12  
    Udało się. Pobór prądu jest na poziomie 5µA! Pomogły ustawienia rejestrów mcucr
    Kod: text
    Zaloguj się, aby zobaczyć kod


    przez e marcus
    Narazie to tyle, dziękuje za poświęcony czas.
REKLAMA