Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 lut 2026, o 09:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 3 lut 2016, o 16:04 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Witam,

po raz pierwszy buduję układ bateryjny i do tej pory dobrze sobie radziłem z utrzymaniem prądu na poziomie 2-3uA. Jednak przyszedł czas na pomiar napięcia przy pomocy wbudowanego ADC. No i wiadomo, że włączam pomiar - prąd skacze ostro w górę więc chcę wyłączyć ADC i tu pojawia się problem. Prawdopodobnie brakuje mi wiedzy... czytam notę i wygląda na to, że wystarczy wyzerować bit 7 (ADEN) rejestru ADCSRA i przetwornik powinien się wyłączyć. Robię to tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety prąd nie maleje. Czy coś pominąłem? Czy mój tok rozumowanie jest prawidłowy? Będę wdzięczny za wszelkie sugestie.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2016, o 16:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Pisząc z pamięci - poszukaj PRR (PRR |= (1<<PRADC); )



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2016, o 17:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

tec-dive napisał(a):
Czy coś pominąłem?

pewnie

domyślnie ADC jest wyłączony więc po pomiarze - oczywiście poprawnie go wyłączasz


ale zapomniałeś że z kolei domyślnie włączony jest KOMPARATOR i jego trzeba wyłączyć gdy się nie używa - od razu spada pobór prądu

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2016, o 17:54 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Może nie doprecyzowałem ale komparator mam wyłączony i do czasu zainicjalizowania ADC pobór prądu jest OK (na poziomie 3 uA) w momencie uruchomienia ADC rośnie. I wtedy jak gdyby nie ma reakcji na jego wyłączenie.
Wieczorem wrzucę kod programu to może wtedy będzie można konkretniej podyskutować :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2016, o 13:44 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Niestety nie udało mi się wieczorem wstawić kodu - okazuje się, że czasami elektronika przegra w starciu z codziennością ;)

Poniżej zamieszczam kod programu testowego, który uruchomiony bez zainicjalizowania ADC zużywa ~2-3uA prądu, a po zainicjalizowaniu około 800uA.
W pętli głównej (procek wybudza się co 8 sekund - tryb asynchroniczny - rezonator 32kHz i wewnętrzny 8MHz) staram się wyłączyć przetwornik ale bez efektu :(
Wykorzystanie rejestru PRR podobnie nie daje spodziewanego efektu. Nie potrafię się doszukać swojego błędu.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


oraz inicjalizacja ADC:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2016, o 14:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Ale tutaj w pętli while wchodzisz w ADC Noise Reduction Mode a nie w Power Save Mode, bo w adc_init() zmieniasz mode dla sleep_mode().

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2016, o 15:20 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

No oczywiście :oops:
to był ten błąd. Teraz już wszystko działa tak jak powinno.
Przy okazji zapytam o jeszcze jedną rzecz związaną z trybem asynchronicznym Timera2.
Inicjalizuję go tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I teraz zgodnie z notą:

If Timer/Counter2 is used to wake the device up from Power-save or ADC Noise Reduction
mode, precautions must be taken if the user wants to re-enter one of these modes: If reentering
sleep mode within the TOSC1 cycle, the interrupt will immidiately occur and the
device wake up again. The result is multiple interrupts and wake-ups within one TOSC1 cycle
from the first interrupt. If the user is in doubt whether the time before re-entering Power-save or
ADC Noise Reduction mode is sufficient, the following algorithm can be used to ensure that
one TOSC1 cycle has elapsed:
a. Write a value to TCCR2x, TCNT2, or OCR2x.
b. Wait until the corresponding Update Busy Flag in ASSR returns to zero.
c. Enter Power-save or ADC Noise Reduction mode.

trzeba poczekać na wyzerowanie flagi Update Busy Flag
Z paskudnym delayem wygląda to u mnie tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i pojęcia nie mam jak to zamienić na pętlę oczekującą na wyzerowanie tej flagi.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2016, o 17:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

tec-dive napisał(a):
i pojęcia nie mam jak to zamienić na pętlę oczekującą na wyzerowanie tej flagi.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
o to chodzi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2016, o 18:39 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Hmmm... jeśli to rozumieć tak, że wykonuj tą pętlę do czasu aż bit TCR2UB w rejestrze ASSR się nie wyzeruje to chyba o to chodzi :)
Tylko moja jeszcze skromna wiedza nie pozwala mi ogarnąć zapisu "_BV"... Coś mi świta, że jest to jakieś makro Bit Value. Czy to jest zapis równoważny takiemu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To już odpowiem sobie sam... oczywiście o to chodziło :) tylko w przypadku ATmega88 zamiast TCR2UB mamy TCR2BUB.
A o _BV już doczytałem na http://forum.atnel.pl/topic4426.html
Niestety albo STETY ;) jak człowiek poczyta BB i oglądnie Mirkowe poradniki o przesunięciach bitowych to potem już nie wie co to znaczy _BV ;)

Dziękuję wszystkim za pomoc

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 26 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO