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] Attiny13 BASCOM - Procesor nie przechodzi w tryb power down, co robić?

xdcer 06 Wrz 2011 19:18 5378 22
REKLAMA
  • #1 9901504
    xdcer
    Poziom 12  
    Posty: 114
    Pomógł: 2
    Ocena: 26
    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
    Posty: 7074
    Pomógł: 877
    Ocena: 1488
    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.
  • #4 9901697
    xury
    Specjalista automatyka domowa
    Posty: 7074
    Pomógł: 877
    Ocena: 1488
    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  
    Posty: 114
    Pomógł: 2
    Ocena: 26
    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?
  • REKLAMA
  • #6 9960111
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 10063332
    xdcer
    Poziom 12  
    Posty: 114
    Pomógł: 2
    Ocena: 26
    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  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    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  
    Posty: 1629
    Pomógł: 76
    Ocena: 2360
    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  
    Posty: 114
    Pomógł: 2
    Ocena: 26
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 114
    Pomógł: 2
    Ocena: 26
    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  
    Posty: 114
    Pomógł: 2
    Ocena: 26
    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.

Podsumowanie tematu

✨ Użytkownik napotkał problem z mikrokontrolerem Attiny13, który nie przechodzi w tryb power down po zaprogramowaniu. W odpowiedziach zasugerowano, aby unikać używania instrukcji WAIT w obsłudze przerwań i zamiast tego stosować flagi do sygnalizacji zdarzeń. Użytkownik wprowadził zmiany w kodzie, ale nadal występowały problemy z miganiem diod oraz zbyt wysokim poborem prądu. Wskazano na konieczność sprawdzenia podciągania pinów, wyłączenia Watchdoga oraz detektora brown-out. Ostatecznie, po zastosowaniu odpowiednich ustawień rejestrów MCUCR, udało się osiągnąć pobór prądu na poziomie 5 µA.
Wygenerowane przez model językowy.
REKLAMA