bLEDd13 - driver programowalny na ATtiny13

co i jak zrobiłem...
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

bLEDd13 - driver programowalny na ATtiny13

Post autor: barney »

Witam

Już od dłuższego czasu chodziła mi po głowie myśl napisania jakiegoś driverka programowalnego (ileż można działać na tych chińskich 3-trybowcach :roll: ). Według mnie wyszło fajnie, więc stwierdziłem, że upublicznię kod :)

Możliwości:
- 8 predefiniowanych poziomów jasności
- 3 predefiniowane stroboskopy
- ignorowanie pierwszego kliknięcia
- ochrona ogniwa (napięcie predefiniowane)
- 8 dowolnie programowalnych slotów (na każdy slot możemy "wrzucić" jeden z powyżej wymienionych poziomów jasności i jeden z 3 stroboskopów (albo oczywiście tryb ciągły ;-) )
- wybór ilości aktywnych slotów (1-8)
- tryb rowerowy (blokada zmiany slotów i zablokowanie drivera na podanym slocie)

Opis konfiguracji oprogramowania
Kod sterownika składa się z 2 plików:
main.c - cały program, ale nie musicie go analizować, jest potrzebny tylko do kompilacji
setup.h - w tym pliku zwykły śmiertelnik ( :wink: ) może w wygodny sposób skonfigurować driver

Zacznę od omówienie pliku setup.h (potem na jego podstawie będzie wygodniej omówić obsługę drivera)
Wszystkie wartości w nim podawane muszą być liczbami naturalnymi ! ! !

Kod: Zaznacz cały

#define LVL1 				255		// Jasnosci opcji w menu oraz slotow
...
#define LVL8 				8
Możliwe jasności jakie możemy przypisać do slotów. Wartości te odpowiadają również kolejnym opcjom w menu (dlatego ważne jest aby różnice między poszczególnymi jasnościami były widoczne - inaczej w menu będzie trzeba poruszać się na wyczucie (czas))

Kod: Zaznacz cały

#define STRB_TIME1	                20            // Wspolne mnozniki czasu dla stroboskopow
#define STRB_TIME2                          20
                                                                        // 255 max w ponizszych ustawieniach STRBx
#define STRB1_TIME1                        6              //*STRB_TIME1 Czas swiecenia stroboskopu przy danym podzielniku jasnosci
#define STRB1_FACTOR1                    1              // Przez ile podzielic jasnosc
#define STRB1_TIME2                        6              //*STRB_TIME2
#define STRB1_FACTOR2                    255
...
2 pierwsze linijki będą odnosić się do wszystkich 3 stroboskopów
Stroboskop 1 skonfigurowany jak powyżej będzie działać następująco:
- przez 120ms (6*20ms) będzie świecić jasnością zdefiniowaną przy programowaniu (jasność podana / 1)
- przez 120ms (6*20ms) LED będzie wyłączony (jakakolwiek jasność podzielona przez 255 spowoduje wyłączenie LEDa)
Czyli stroboskop ten to po prostu ~4Hz 100%-0%
W ustawieniach STRB..._... wartości czasu muszą zawierać się od 0 do 255, a dzielniki od 1 do 255 (bo przez 0 nie wolno dzielić :P )
Ustawienie czasu = 0 spowoduje "wyłączenie" stroboskopu (ale za to w drugiej części tego stroboskopu możemy ustawić dzielnik pozwalający nam na uzyskanie wcześniej niedostępnego poziomu jasności niż by to wynikało z podanych LVL...)
Wskazane jest dążenie do jak największych wartości STRB..._TIME... (czyli staramy się aby wspólne mnożniki były jak najmniejsze - ale nie musimy rezygnować z "wydziwionych" czasów stroboskopów, nie jest to warunek konieczny do poprawnego działania drivera).
Gdybyśmy w powyższym przykładzie linijkę

Kod: Zaznacz cały

#define STRB1_FACTOR2                    255
zamienili na

Kod: Zaznacz cały

#define STRB1_FACTOR2                   2
uzyskalibyśmy stroboskop 4Hz 100%-50%

Kod: Zaznacz cały

#define IGN_CLICK_TIME		16		// (max 255)*128 Po jakim czasie ignorowac klikniecie
#define IGN_CLICK_SIG		100 	// Dlugosc sygnalizacji zignorowania klikniecia
#define IGN_CLICK_FACTOR    2		// Przez ile podzielic jasnosc podczas ingnorowania klikniecia
Tutaj podajemy po jakim czasie driver ma zignorować następne kliknięcie (niektórzy nazwali by to zapamiętaniem trybu).
Jak widać czas ten wynosi ~2s (16*128ms).
W celu zasygnalizowanie tego wydarzenia driver przez 100ms podzieli jasność przypisaną do slotu (którym oczywiście teraz świecimy) przez 2.

Kod: Zaznacz cały

#define MENU_IN				20		// Ile minimalnie klikniec do wejscia w tryb programowania
#define ROWER_STOP			10		// Ile klikniec do wylaczenia trybu rowerowego
Tutaj podajemy ile kliknięć jest potrzebne do wyjścia z trybu rowerowego (blokady) i do wejścia w tryb programowania. Są to wartości orientacyjne, generalnie klikamy do skutku :razz: , osobiście nie wyobrażam sobie liczenia tylu kliknięć. Ilość kliknięć (która jest porównywana z podanymi wyżej) zeruje się po zapamiętaniu trybu (czyli po przerwie między klikami dłuższej od IGN_CLICK_TIME*128

Kod: Zaznacz cały

#define MENU_LVL1			100		// Jasnosci i czasy informujace o wejsciu w tryb programowania
#define MENU_TIME1			500
#define MENU_LVL2			40
#define MENU_TIME2			500
#define MENU_SIG_RPT		3		// Ile razy powtorzyc powyzsza kombinacje
Jeżeli wykonamy ilość kliknięć większą lub równą ~MENU_IN wchodzimy do menu programowania (omówię je dalej). Zdarzenie to driver zasygnalizuje nam kombinacją powyżej podanych jasności i czasów (powtórzoną podaną ilość razy). Klikanie podczas sygnalizowania przez driver wejścia w tryb programowania nie przyniesie skutku (nie wyjdziemy w ten sposób z niego - sposoby wyjścia też omówię później).

Kod: Zaznacz cały

#define MENU_CHOOSE_RPT		3		// Ile razy pokazywac dostepne opcje
#define MENU_CHOOSE_TIME	1000	// Ile dac czasu na zaakceptowanie opcji
Ile razy będzie pokazywana sekwencja wyborów (3 razy) w menu (1-8 -> 1-8 -> 1-8)i ile jest czasu na zaakceptowanie jakiejś z nich (tutaj 1s).

Kod: Zaznacz cały

#define BATT_LEVEL			134		// Napiecie przy ktorym zadziala zabezpieczenie
#define BATT_TIME			250		// Jak dlugo informowac
#define BATT_FACTOR			2		// Przez ile podzielic jasnosc
#define BATT_PAUSE			32  	// (max 255)*128 Przerwa miedzy pomiarami
// BATT_PAUSE*128>BATT_TIME+10   	Konieczny warunek do spełnienia!!!
Ustawienie opieki na stanem ogniwa. Pierwszą wartość obliczycie z arkusza dołączonego do kodu. Ustawienia powyższe spowodują sygnalizowanie napięcia niższego od 3V (134 dla nowych driverów) zmniejszeniem jasności o połowę przypisanej do aktywnego slotu przez 0.25s co ~4s (32*128ms), aż do zwiększenia się napięcia na ogniwie powyżej 3V (co jest wątpliwe, o ile nie zmniejszymy jasności).
Dalej w setup.h są już wartości początkowe konfiguracji drivera, których powinny być zrozumiałe (jeżeli nie są to wracamy i czytamy opis setupu od nowa - przed nimi są bardziej skomplikowane rzeczy :twisted: )

Zmiany slotów chyba nie muszę opisywać - po prostu klikamy jak w każdym driverze :)

Po wykonaniu ~MENU_IN kliknięć wchodzimy w programowanie slotów (czyli w to, po co wszyscy to czytają :grin:).
Menu składa się z 3 etapów
I Wybór slotu względem którego chcemy coś robić
II Co chcemy zrobić w oparciu o slot
III (opcjonalne) przypisywanie jasności do slotu
ETAP I
Odpowiednie jasności LVL... odpowiadają numerowi slotu. Wykonujemy klik kiedy zostanie pokazany slot o który nam chodzi
ETAP II
Odpowiednie jasności LVL... odpowiadają rzeczą, które chcemy zrobić:
1. Programowanie danego slotu jako tryb ciągły
2. Programowanie danego slotu jako stroboskop 1
3. Programowanie danego slotu jako stroboskop 2
4. Programowanie danego slotu jako stroboskop 3
5. Zablokowanie zmiany slotów (tryb rowerowy) i ustawienie trybu na ten wybrany w etapie I
6. Zmiana ilości aktywnych slotów na wszystkie do slotu wybranego w etapie I (włącznie z tym slotem).
7. Pusta opcja, jej wybranie spowoduje opuszczenie programowania bez zmiany czegokolwiek.
8. Pusta opcja, jej wybranie spowoduje opuszczenie programowania bez zmiany czegokolwiek.
ETAP III (dla opcji 1-4 z etapu II)
Tutaj po prostu dopisujemy jasność do slotu. Klikamy kiedy jasność bazowa nam odpowiada.

Jeżeli w którymkolwiek etapie nie klikniemy przed upływem MENU_CHOOSE_RPT powtórzeń możliwości to opuścimy menu bez zmiany czegokolwiek.

Możliwe jest zaprogramowanie slotu, który nie jest slotem należącym do aktywnego zakresu oraz zablokowanie zmiany slotów na slocie nie należącym do aktywnego zakresu :wink:

Programowania itp. nie będę opisywać, jest tego w internecie na tony.

Podziękowania dla:
- Mirosław Kardaś - za książkę "Mikrokontrolery AVR Język C Podstawy Programowania" bez której w życiu bym tego nie napisał
- Krauser (forum.atnel.pl) - za znalezienie błędów w kodzie
- Fredek - programowanie dropa, wartości domyślne w Setup.h, przeliczanie napięcia do protekcji ogniwa, przekonanie mnie do uproszczenia pliku Setup.h (wcześniej liczylibyście bardzo wesołe wzorki :mrgreen: )

Proponowane FUSY:
LOW 0x35
HIGH 0xEB

Download:
http://fredek.no-ip.org/barney/bLEDd13/
Ostatnio zmieniony poniedziałek 22 gru 2014, 11:58 przez barney, łącznie zmieniany 1 raz.
Awatar użytkownika
krzycho_
Posty: 2187
Rejestracja: piątek 08 maja 2009, 18:40
Lokalizacja: Poznań

Post autor: krzycho_ »

Jak dla mnie to wykonałeś kawał solidniej roboty :) Jak tylko znajdę dziś czas to przetestuje bardzo chętnie.
elektroda.pl
ptja
Posty: 2413
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Re: bLEDd13 - driver programowalny na ATtiny13

Post autor: ptja »

barney pisze:Według mnie wyszło fajnie, więc stwierdziłem, że upublicznię kod :)
Fajne. Zastanawiałeś się nad licencją, na jakiej chcesz rozpowszechniać swój program? Może coś z rodziny GPL?
--
pozdrawiam,
Jarek Andrzejewski
Awatar użytkownika
Pyra
Site Admin
Posty: 8522
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Nooo kawał solidnej roboty... pełne uznanie.
Co do upublicznienia, to idea zacna, jednak proponuję gdzieś w programie umieścić coś charakterystycznego, bo może się pojawić oferta na ... ale bez Twojego udziału. Niestety, polskie realia.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
ElSor
Site Admin
Posty: 5038
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

Po kodzie widać, kto był nauczycielem :razz:
Pytanie/wątpliwości mam do fragmentu obsługującego przerwanie z WD:

Kod: Zaznacz cały

if &#40;ign<IGN_CLICK_TIME&#41;	if &#40;++ign==IGN_CLICK_TIME&#41; wdt_epr=1;
	if &#40;&#40;++batt==BATT_PAUSE&#41; & &#40;!wdt_epr&#41;&#41;					// Sprawdzanie napiecia baterii
Czy znak równości nie powinien być zastąpiony znakiem >= w ++batt==BATT_PAUSE ? Bo chyba może wystąpić sytuacja, gdy wdt_epr będzie prawdziwe i tym samym nieprawdziwe !wdt_epr co w efekcie sprawi zablokowanie pomiaru napięcia do czasu wyzerowania zmiennej batt.
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

Pyra, nawet jak umieszczę w kodzie coś charakterystycznego to i tak są źródełka - więc można to wyciąć/przerobić.
A jak będzie taka oferta to trudno, brak sumienia nie jest rzadkością w obecnych czasach :roll:

A licencja... no ameryki tym kodem nie odkryłem, więc myślę, że z kodem można robić co się chce, ale wykorzystywanie go w celu zarobkowym jest co najmniej niefajne. :wink:

A po sądach i tak nie będę się z nikim ganiał - dlatego nie pisałem nic o licencji.
ptja
Posty: 2413
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

barney pisze:A po sądach i tak nie będę się z nikim ganiał - dlatego nie pisałem nic o licencji.
Poczytaj o "Shared Source".
Pomyśl sam, jak chcesz się podzielić swoja pracą.
Dopytuję się nie bez powodu: ja też piszę swój sterownik do latarki nurkowej (mało trybów i sterowanie kontaktronem) i mógłbym skorzystać z kodu już istniejącego (dorobić do niego wariant "divelight"), jeśli licencja by na to pozwalała.
A jeśli nie pozwoli, to napiszę swój i opublikuję jako GPL :-)
--
pozdrawiam,
Jarek Andrzejewski
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

ElSor, faktycznie, masz rację, powinno być >= :oops:
Czyli zamieniamy linijkę

Kod: Zaznacz cały

if &#40;&#40;++batt==BATT_PAUSE&#41; & &#40;!wdt_epr&#41;&#41;                    // Sprawdzanie napiecia baterii
na

Kod: Zaznacz cały

if &#40;&#40;++batt>=BATT_PAUSE&#41; & &#40;!wdt_epr&#41;&#41;                    // Sprawdzanie napiecia baterii
Chwilowo nie będę nowej paczki robił (wrzucę, w np. piątek), bo pewnie dobiłbym w ten sposób do wersji 2.18c RC2 w miesiąc :mrgreen:
Awatar użytkownika
ElSor
Site Admin
Posty: 5038
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

ptja, jeśli chcesz driver na kontaktronie i z małą ilością trybów to i tak 80% powyższego kodu będzie zbędne. Zwykły Bascom starczy do tego spokojnie a bascoma można w 1 dzień się nauczyć i zrobić coś sensownego, nawet nie trzeba obsługi przerwań i innego ustrojstwa używać. W C to 1 dzień mi zszedł na włączenie PWMa, nie mówiąc już o poważniejszych operacjach. Nad ADC męczyłem się 2 dni :razz: Drogą przez męki było stworzenie działającego "systemu" oszczędzania prądu w uśpieniu, z którego można było procek wybudzić :razz:
ptja
Posty: 2413
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

ElSor pisze: Zwykły Bascom starczy do tego spokojnie a bascoma można w 1 dzień się nauczyć i zrobić coś sensownego,
ja zarabiam m.in. programowaniem od czasów technikum elektronicznego (prawie 25 lat :-) ), a amatorsko bawiłem się jeszcze w podstawówce.
A z języków wolę jednak te z klamrowymi nawiasami :-)
--
pozdrawiam,
Jarek Andrzejewski
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

ptja, licencja jest jaka jest :P
Potrzebujesz to przerabiaj, pokazuj, korzystaj.
Nie obrażę się jednak jeżeli nie zobaczę całego allegro zawalonym driverami z wgranymi czystymi HEXami (albo zmienionymi 2 linijkami w main.c i przerobionym setup.h), które tu wrzucam :razz:
Awatar użytkownika
ElSor
Site Admin
Posty: 5038
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

Także tym bardziej nie wiem po co chcesz coś cudzego w swoim kodzie. Pisz swój i nie patrz na innych ;)
Awatar użytkownika
krzycho_
Posty: 2187
Rejestracja: piątek 08 maja 2009, 18:40
Lokalizacja: Poznań

Post autor: krzycho_ »

barney czy mógłbyś jeszcze podać skrótowo proces konfiguracji drivera :)

Wiem że wynika to z kodu ale są tu osoby którym analiza kodu może sprawić problem.
elektroda.pl
Krawiec.diy
Posty: 83
Rejestracja: czwartek 08 lis 2012, 04:35
Lokalizacja: Czapury/Gądki

Post autor: Krawiec.diy »

Witam
wczoraj wgrałem sobie Twój wsad do procka testowego i czy jest możliwość abyś napisał jakąś rozpiske klików itp. W tryb wyboru wchodzi sie 20-to lub 21 klikiem tak ?? później mam 3 sloty do obsadzenia danym trybem, w nocy byłem już zmęczony i coś mi nie wychodziło bo po wyborze 3 trybów i zgaszeniu leda po ponownym włączeniu pojawiły mi sie dodatkowe strobo których nawet nie nie miałem do wyboru.
Na świeżo wgranym wsadzie mam 3 tryby stałe i jeden strobo i chciałem sobie coś pozmieniać ale nie do końca mi to wychodziło. Zaraz wgram ponownie bo w tej chwili mam tak pomieszane tryby i najlepsze że nie mam zielonego pojęcia jak tego dokonałem hihihi :) Będę musiał odpalić eclipsa i zobaczyć w kod.
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

To ja może podam na przykładach, bo tak to może być ciężko :)
Po każdej zmianie czegoś (ustawienia slotu, ilości slotów i blokady - no ale wtedy driver mamy zablokowany) jeżeli chcemy zmienić coś jeszcze to musimy znowu klikać te 20~22 razy (albo ile tam sobie ustawicie).
Kolejność kliknięć podaje na zasadzie numerów opcji w każdym etapie, czyli:
ETAP I -> ETAP II -> ETAP III

No i w ten sposób możemy:

Ustawić drugi slot jako ciągły z poziomem jasności 3 (na domyślnym HEXie 25%).
2 -> 1 -> 3

Ustawić pierwszy slot jako stroboskop 2 z jasnością bazową 2 (50%)
1 -> 3 -> 2

Ustawić blokadę (tryb rowerowy) na slocie 8 (czyli ostatnim)
8 -> 5 (i już, nie ma ETAPU III dla tej opcji, driver jest zablokowany aż do 10 szybkich kliknięć)

Ustawić ilość aktywnych slotów na (pierwsze) 6
6 -> 6 (i już)

Wyjść z menu (rozmyśliliśmy się :mrgreen: )
Opcja a) Czekamy 3 serie opcji
Opcja b) 1-8 (cokolwiek) -> 7-8 (i już)

Oczywiście przed kliknięciem jakiegoś "numerka" w każdym etapie musimy poczekać na koniec sygnalizacji (czyli domyślnie trzech serii mignięć). Wcześniejsze klikanie nic nie da.

[ Dodano: 10 Marzec 2013, 22:25 ]
O, jeszcze domyślne stroboskopy:
1. 120ms 100% - 120ms 0% (czyli nasz omawiany 4Hz)
2. 20ms 100% - 5000ms 0% (Beacon)
3. 20ms 100% - 1000ms 0% (Fast Beacon)
ODPOWIEDZ