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



Teraz jest 14 lut 2026, o 03:53


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 6 kwi 2017, o 09:56 
Offline
Nowy

Dołączył(a): 10 sty 2014
Posty: 5
Pomógł: 0

Po stosownej przerwie wróciłem do nauki podstaw AVR C. Dzięki książkom p. Mirka Kardasia powoli zaczynam się przebijać przez to ciekawe zagadnienie. Tym razem zachciało mi się wykonać projekt latarki z diodą Power LED, która posiadałaby kilka trybów pracy. Zgodnie z sugestiami Autora postanowiłem wykorzystać sprzętowy Fast PWM (tryb 3) do regulacji jasności diody LED. Kod, który załączam zbudowałem na bazie kodu p. Mirka (co w kilku momentach wyraźnie widać), musiałem go jednak nieco zmodyfikować, aby był zgodny z kontrolerem Attiny13 (wykorzystałem fragmenty kodu z jakiegoś anglojęzycznego bloga). I tu nie jestem pewny, czy poprawnie ustawiłem Fast PWM. Jest jeszcze dugi problem do pokonania. Program działa, naciśnięcie przycisku powoduje zmianę jasności, ale... Cztery rosnące poziomy jasności zapisałem w czteroelementowej tablicy level[]. Początkowo mamy poziom zapisany w zerowym elemencie tablicy (LED nie świeci), potem w pierwszym, drugim, trzecim (maksymalna jasność) i... tu się dzieje coś niewłaściwego, ponieważ mam dodatkowy stan zerowy (LED nie świeci). Trochę kombinowałem z warunkiem, ale wyraźnie popełniam jakiś błąd logiczny. Proszę o wskazówkę, co należy poprawić.

Cytuj:
#define F_CPU 1000000UL <----- TEGO NIGDY nie stosujemy w kodzie programu - mirekk36


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

Chciałbym jeszcze dodać funkcję usypiania/wybudzania (np. długim przytrzymaniem przycisku) w celu oszczędzania akumulatora Li-Ion. Proszę o wskazanie jakiejś prostej literatury opisującej ten temat.

Pozdrawiam.



Ostatnio edytowano 6 kwi 2017, o 10:50 przez yogi009, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2017, o 10:35 
Offline
Moderator
Avatar użytkownika

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

Panie kolego jesteś z nami na forum od 2014 roku i nie wiesz jak się wstawia kod na forum ? Pomimo to, że już od iluś ładnych lat jest instrukcja? topic7402.html - proszę poprawić formatowanie kodu zgodnie z instrukcją.

Druga sprawa - też wiąże się z tym, że jesteś długo na forum i nie wiesz, że nie stosuje się w kodzie #define F_CPU ? a nawet jak się uprzesz i chcesz sobie stosować to nikt ci nie zabroni - ale nie wstawiaj takich rzeczy wtedy tego na forum tzn wytnij przynajmniej że tę linijkę - pewnie wtedy w wielu przypadkach i tak trudniej będzie ci pomóc bo nie na darmo mówię, że nie wstawia się tego w kodzie.


------------------------ [ Dodano po: 1 minucie ]

yogi009 napisał(a):
(0 << CS01)

przy okazji - to wyrażenie NIC nie robi - tego się nie wpisuje ... wystarczy w twoim wypadku ustawienie jednego bitu CS00

_________________
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: 6 kwi 2017, o 10:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 lut 2017
Posty: 48
Pomógł: 4

Jeżeli chodzi o tryby uśpienia to w ATtiny13 masz do wyboru 3 tryby uśpienia.
Wszystko opisane jest w nocie katalogowej pod roździałem:"Power Management and Sleep Modes".
Procesor ze stanu uśpienia wybudzasz dowolnym przerwaniem.Możesz zatem podłączyć przycisk do jakiegoś pinu INTx, i po naciśnięciu procesor rozpocznie pracę od momentu, w którym go uśpiłeś.
Do zarządzania poborem energii istnieją 2 biblioteki: avr/sleep.h oraz avr/power.h.
Znajdziesz w nich funkcje potrzebne do uśpienia.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2017, o 10:58 
Offline
Nowy

Dołączył(a): 10 sty 2014
Posty: 5
Pomógł: 0

Dziękuję za odpowiedź. Teraz po kolei:

Składnię kodu poprawiłem. Oczywiście chciałem sprostować ewidentne nadużycie, prawdopodobnie zarejestrowałem się dość dawno na tym forum, co nie oznacza, że na nim jestem od kilku lat. To mój drugi post, a wstawiany kod pierwszy, stąd zapewne błąd. Sądzę, że ten temat mamy z głowy

Teraz merytorycznie.

mirekk36 napisał(a):
yogi009 napisał(a):
(0 << CS01)

przy okazji - to wyrażenie NIC nie robi - tego się nie wpisuje ... wystarczy w twoim wypadku ustawienie jednego bitu CS00


Dziękuję za zwrócenie, uwagi, na pewno to poprawię. Nie jestem jeszcze w żadnym stopniu biegły w pisaniu tego kodu. Mam nadzieję, że to można sobie wyobrazić.

I kolejny punkt, czyli nie wstawianie w kodzie F_CPU... Na pewno moja wiedza nie pozwala mi jeszcze odgadnąć, dlaczego tej dyrektywy nie wstawiamy w kod, postaram się znaleźć odpowiedź na to pytanie. W moim przypadku (konsola linuksowa i czyste avr-gcc + avrdude bez żadnych nakładek graficznych i plików konfiguracyjnych - bo i projekty na razie proste) brak tej linijki kończy się komunikatem avr-gcc:

Kod:
In file included from a04.c:13:0:
/usr/lib/avr/include/util/delay.h:90:3: warning: #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]
 # warning "F_CPU not defined for <util/delay.h>"


Dlatego go (póki co) stosuję. Dodam, że to MUSI być pierwsza komenda w kodzie, inaczej też mam komunikat kompilatora o błędzie.


Kolego michaeleagle, dziękuję uprzejmie za "kierunkowskazy".

Czy mogliby Koledzy jeszcze podpowiedzieć mi w temacie "dodatkowego" (niechcianego) trybu? Musiałem coś w warunku chyba namieszać, ale z mojej analizy wynika, że składnia i logika jest poprawna.



Ostatnio edytowano 6 kwi 2017, o 11:42 przez yogi009, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2017, o 11:26 
Offline
Użytkownik

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

yogi009 napisał(a):
I kolejny punkt, czyli nie wstawianie w kodzie F_CPU... Na pewno moja wiedza nie pozwala mi jeszcze odgadnąć, dlaczego tej dyrektywy nie wstawiamy w kod, postaram się znaleźć odpowiedź na to pytanie. W moim przypadku (konsola linuksowa i czyste avr-gcc + avrdude bez żadnych nakładek graficznych i plików konfiguracyjnych - bo i projekty na razie proste) brak tej linijki kończy się komunikatem avr-gcc:

Kod:
In file included from a04.c:13:0:
/usr/lib/avr/include/util/delay.h:90:3: warning: #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]
 # warning "F_CPU not defined for <util/delay.h>"


Dlatego go (póki co) stosuję. Doam, że to MUSI być pierwsza komenda w kodzie, inaczej też mam komunikat kompilatora o błędzie.

To dlatego, że pracujesz w konsoli a nie używasz żadnego środowiska programistycznego.
Tą dyrektywę powinno się wstawiać w ustawieniach projektu. Wtedy ma zastosowanie >do wszystkich< plików projektu.
Wpisywanie jej w poszczególnych plikach jest złym stylem programowania i źródłem potencjalnych błędów.
W Twoim przypadku powinieneś ją wpisać w pliku make.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2017, o 12:48 
Offline
Moderator
Avatar użytkownika

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

MirkoT napisał(a):
To dlatego, że pracujesz w konsoli a nie używasz żadnego środowiska programistycznego.

To jedno ale nawet jak się pracuje w linuxie to i tak ma się plik sterujący kompilacją

makefile

i to w nim się ustawia F_CPU które później jest widoczne jedno i to samo w każdym module podczas kompilacji

Poza tym i pod linuxem można się nie męczyć tylko użyć ECLIPSE i wtedy nie ma takich problemów

_________________
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: 6 kwi 2017, o 13:12 
Offline
Nowy

Dołączył(a): 10 sty 2014
Posty: 5
Pomógł: 0

Rozumiem. Jak się domyślam, to tak zwany programista wybiera środowisko pracy. Od wielu lat jestem zwolennikiem pracy w konsoli, dotyczy to wielu tematów, nie tylko AVR C. Na razie tak jest mi wygodniej. Podobnie staram się nie korzystać z żadnych wizardów, ceniąc "rozumny" sposób tworzenia. Plik makefile wykonam, skoro jest zalecany, do tej pory (przy moich niewielkich doświadczeniach) go nie stosowałem. Sądzę, że z czasem odpalę też Eclipse.

Czy ktoś z Kolegów miałby jeszcze chęć spojrzeć w ostatni niejasny dla mnie temat, czyli nieplanowane dodanie jeszcze jednego trybu. W zamyśle miało to wyglądać tak:

Kod:
ciemno - lekkie światło - średnie światło - pełne światło (i powrót na początek).

Tymczasem mam tu taki system:

Kod:
ciemno - lekkie światło - średnie światło - pełne światło (niby powrót na początek) - ciemno - ciemno (NIEPOTRZEBNY TRYB) - lekkie światło - średnie światło - pełne światło...


Nurtuje mnie, gdzie zasadziłem błąd w rozumowaniu...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2017, o 13:51 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1085
Pomógł: 73

W Twoim kodzie zmienna "i" przybiera czasem wartość 4 więc przypisuje do OCR0B wartość spod piątego elementu tablicy (licząc od zera), którego nie ma. Spróbuj tak:

------------------------ [ Dodano po: 2 minutach ]

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2017, o 13:59 
Offline
Moderator
Avatar użytkownika

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

yogi009 napisał(a):
ceniąc "rozumny" sposób tworzenia

Rozumiem, że profesjonalne środowiska jak Eclipse i każde inne, Atmel Studio, Keil, itp itd to "bezrozumny" sposób tworzenia ;)

yogi009 napisał(a):
Podobnie staram się nie korzystać z żadnych wizardów

Jeśli dla ciebie środowiska typu Eclipse którego jak widać nawet nie zechciało ci się poznać, to wizzardy - to nie ma co się dziwić, że masz więcej problemów niż inni - szczególnie na początku jakiejś drogi - np z nauką programowania procków w C.

yogi009 napisał(a):
Plik makefile wykonam, skoro jest zalecany,

można i bez makefile - jak się upierasz na takie masohistyczne wywoływanie ręczne całego łańcucha kompilatora to rzeczywiście - kto ci zabroni ;) ? Każdy może się męczyć jak chce - ale zrozum, że podpowiedzi które tu padają mają na celu pokazanie jak można wygodnie pracować i na co warto zwracać uwagę nie zaś droczenie się o rozumne albo bezrozumne sposoby.

_________________
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: 6 kwi 2017, o 15:03 
Offline
Nowy

Dołączył(a): 10 sty 2014
Posty: 5
Pomógł: 0

Jarecki napisał(a):
W Twoim kodzie zmienna "i" przybiera czasem wartość 4 więc przypisuje do OCR0B wartość spod piątego elementu tablicy (licząc od zera), którego nie ma.


Kolego Jarecki, serdeczne dzięki za trafną diagnozę, jednak jeszcze zdecydowanie mało "widzę" w kodzie.

Kolego mirekk36, dziękuję za wszystkie cenne rady, wysoko sobie cenię Twoje dwie książki, jako bazę do mojej nauki, polecam je także innym jako najlepsze w odbiorze dla początkujących adeptów. Tym bardziej nie potrafię zrozumieć, dlaczego tak szybko negatywnie klasyfikujesz moje wypowiedzi. Nigdzie nie wspominałem o tym, że wyliczone przez Ciebie środowiska programistyczne są bezrozumne. W swojej wypowiedzi przywołałem zupełnie inny segment programowania, gdzie widoczna jest znakomita różnica pomiędzy efektem uzyskanym przy zastosowaniu kreatora w stosunku do kodu napisanego "z ręki".

W jednym wątku spotykam się po raz drugi z takim zupełnie niepotrzebnym podejściem, nie sądzę, żeby to była konstruktywna postawa, pozwalająca się szybciej rozwijać z wykorzystaniem naturalnego na tym etapie entuzjazmu. Pozdrawiam i życzę dobrego popołudnia.

Wątek uważam za wyczerpany, jeszcze raz dziękuję wszystkim, którzy mnie wsparli.



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

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