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



Teraz jest 18 sie 2026, o 01:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 30 paź 2014, o 00:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

Witam,
mam prośbę o pomoc w rozgryzieniu problemu z jakim się borykam. Atmega328 + OLED(I2C) + DS18B20 a wszystko ma pracować na akumulatorze 5V. Bez trybu power save działa wszystko ok ale chyba popełniam gdzieś błąd przy próbie ustawienia atmegi i pracy w trybie oszczędzania poboru prądu. Czy możecie proszę zerknąć na kod i wytknąć mi błędy jakie popełniam?

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

_________________
Karkołomne zadanie, ogarnąć C.



Ostatnio edytowano 30 paź 2014, o 08:41 przez adamekp, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 08:02 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Przyznam, że nie testowałem jeszcze oszczędzania energii ;-)
Ale może napisałbyś co złego się dzieje?
Zazwyczaj przerwania włącza się jak już wszystko jest poustawiane.
Tymczasem Ty włączasz przerwania a potem jeszcze inicjalizujesz
OLEDa i wywołujesz funkcję set_sleep_mode()
Nie wydaje mi się aby to przeszkadzało ale...

Poza tym może zmieniłbyś koncepcję.
Wysyłasz do czujnika rozkaz konwersji temperatury
i w delayu czekasz prawie sekundę na pomiar. A przecież
chcesz oszczędzać energię to czy nie lepiej wysłać rozkaz
do DSa i "pójść spać"? A potem tylko odebrać sobie gotową
temperaturę?
Używasz timera programowego to po co Ci w ogóle te delay'e
w pętli głównej? Zmień sobie rozdzielczość na 10ms i wtedy
wyliczysz każdy potrzebny w tym programie czas a będziesz miał
program nieblokujący.

Pokaż funkcje:
set_sleep_mode()
sleep_mode()

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 08:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

Wygląda na to, że wykonuje się pierwszy pomiar, wyświetla na wyświetlaczu procek "idzie spać" i to tyle jego pracy już nie wstaje.

Zdaje sobie sprawę z tych delay'ów ale na optymalizację przyjdzie czas. Póki co musi mi zacząć działać usypianie i wybudzanie.

Co do fukcji:
set_sleep_mode()
sleep_mode()

to są to funkcję default'owe.

_________________
Karkołomne zadanie, ogarnąć C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 08:44 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

To co ma wybudzać Twojego procka?
Jaki sygnał?
Jakie przerwanie?

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 09:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

No i kolega juz mnie oświecił. Chciałem budzić od przerwania timera ale widzę, że w tym trybie można wykorzystać przerwanie tylko od Timera2 a ja ustawiłem Timer1. W sumie to mógłbym użyć przerwania od TWI ale nie bardzo wiem jak to zrobić. W datasheet jest napisane "TWI Address Match" ale że co mam porównywać adres magistrali?

_________________
Karkołomne zadanie, ogarnąć C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 11:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

adamekp napisał(a):
No i kolega juz mnie oświecił. Chciałem budzić od przerwania timera ale widzę, że w tym trybie można wykorzystać przerwanie tylko od Timera2 a ja ustawiłem Timer1. W sumie to mógłbym użyć przerwania od TWI ale nie bardzo wiem jak to zrobić. W datasheet jest napisane "TWI Address Match" ale że co mam porównywać adres magistrali?


Kolego używasz Timera0 a nie 1 :) Do tego Timer 2 jest tylko 8bit'owy więc może ci dosyć często budzić procka... Może warto skorzystać z Watchdoga. Piszą że można ustawić przerwanie WDT co 8 sek. max.

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 11:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

eMCe2 napisał(a):
Kolego używasz Timera0 a nie 1 :) Do tego Timer 2 jest tylko 8bit'owy więc może ci dosyć często budzić procka... Może warto skorzystać z Watchdoga. Piszą że można ustawić przerwanie WDT co 8 sek. max.


Oczywiście masz rację miałem na myśli Timer0. Co do WDT to te 8sek. to i tak za dużo. W sumie pomiar i wyświtlenie temp. wystarczyłby co 1min. a może raz na 5min. Qrcze już się chyba pogubiłem w tym wszystkim.

Obecny pobór prądu to około 19mA to dość sporo jak na zakusy zasilania tego akumulatorem.

_________________
Karkołomne zadanie, ogarnąć C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 12:05 
Offline
Użytkownik

Dołączył(a): 19 gru 2012
Posty: 712
Lokalizacja: Opole
Pomógł: 23

No ale co 8 sek WDT ci generuje przerwanie które np obsłużysz sobie w programie tylko jako inkrementacja zmiennej. A w pętli główej programu będziesz sprawdzał czy już na tyle razy inkrementowało że można obudzić procka w innym przypadku usypiasz go.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 12:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

Wilu88 napisał(a):
No ale co 8 sek WDT ci generuje przerwanie które np obsłużysz sobie w programie tylko jako inkrementacja zmiennej. A w pętli główej programu będziesz sprawdzał czy już na tyle razy inkrementowało że można obudzić procka w innym przypadku usypiasz go.


Polecam punkt 9.10: Minimizing Power Consumption w Datasheet'ie.
Powyłączaj ADC którego nie używasz, komparator, BOD detector, wewnetrzne napiecie referencyjne itp to pewnie cos oszczędzisz :) A skoro masz budzic WDT to może lepszy będzie np.Power down
Nie mówisz też jaką procka pędzisz częstotliwością, jak zasilasz? Może tu ci więcej prądu ucieka...

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 13:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

eMCe2 napisał(a):
Polecam punkt 9.10: Minimizing Power Consumption w Datasheet'ie.


Instrukcją "power_all_disable();" wyłączyłem chyba wszystko co zbędne zostawiając włączone tylko sprzętowe TWI "power_twi_enable();". Nieużywane piny ustawione jako wyjście z ustaleniem pinów na 0.

eMCe2 napisał(a):
Nie mówisz też jaką procka pędzisz częstotliwością, jak zasilasz? Może tu ci więcej prądu ucieka...


Atmega została na wewnętrznym 1Mhz.
Zasilam akumulatorem 3,6V ~1200mAh. Używam regulatora low drop LM1117. Zapewne to też będę musiał zmienić na coś mniej obciążającego przed trawieniem płytki.

_________________
Karkołomne zadanie, ogarnąć C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 21:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

Ok udało mi się ogarnąć temat. Dziękuję wszystkim za pomoc i podpowiedzi.
Dla potomnych Atmega328 popędzana wewnętrznym oscylatorem 1MHz. Wykorzystałem przerwanie od watchdoga a atmega jest wybudzana tylko na czas pomiaru i wyświetlenie aktualnej temperatury. Ponieważ termometr ma działać wewnątrz pomieszczenia nie interesowały mnie temperatury ujemne dlatego brak skalowania oraz instrukcji w kodzie. Obsługa DS-a i OLED na Mirkowych bibliotekach.

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


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


I kilka fotek działającego "termometru"
ObrazekObrazekObrazek

_________________
Karkołomne zadanie, ogarnąć C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2014, o 22:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2014
Posty: 745
Lokalizacja: Warszawa
Pomógł: 32

No śliczna ta chmurka i słonko :-)
Gratuluję Koledze fajnego projektu.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 paź 2014, o 22:34 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Tak z ciekawości.
Czy linie 47 i 48 są potrzebne?
Z założenia wiesz, że w projekcie jest jeden czujnik to po co to sprawdzać?
50ms to może niedługo, ale... jak się przemnoży przez ileś tam pomiarów to
można by jeszcze troszeczkę prądziku zaoszczędzić ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2014, o 11:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2013
Posty: 65
Lokalizacja: Łódź
Pomógł: 4

MirkoT napisał(a):
Tak z ciekawości.
Czy linie 47 i 48 są potrzebne?

W sumie to chyba nie pytanie tylko czy czujnik zostanie wykryty jeśli je usunę. Co prawda w pliku .h mam ustawiony tylko jeden czujnik na magistrali.

_________________
Karkołomne zadanie, ogarnąć C.



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: 14 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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