bLEDd13 - driver programowalny na ATtiny13
: sobota 09 mar 2013, 14:30
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 ). 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 ( ) 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 ! ! !
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))
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ć )
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ę
zamienili na
uzyskalibyśmy stroboskop 4Hz 100%-50%
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.
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 , 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
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).
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).
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 )
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ą ).
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
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.
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
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 )
Proponowane FUSY:
LOW 0x35
HIGH 0xEB
Download:
http://fredek.no-ip.org/barney/bLEDd13/
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 ). 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 ( ) 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
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
...
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ć )
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
Kod: Zaznacz cały
#define STRB1_FACTOR2 2
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
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
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
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
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!!!
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 )
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ą ).
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
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 )
Proponowane FUSY:
LOW 0x35
HIGH 0xEB
Download:
http://fredek.no-ip.org/barney/bLEDd13/