Strona 1 z 1

Proszę o pomoc przy opracowaniu trybów lampki rowerowej

: niedziela 11 paź 2009, 14:59
autor: kurczak
Witam serdecznie wszystkich forumowiczów, jestem tu nowy, chociaż podglądam was już jakiś czas ;)

Z tego podglądania wynikło tylko tyle, że zbrzydło mi moje chińskie świecidełko zamontowane na baranku Malwiny. Zdecydowałem się zbudować lampkę, która sprawi, że będę bardziej widoczny. Zakupiłem więc diodę Seul Semicon P4, optykę o kącie wiązki 45 stopni i attiny13 do realizacji trzech prostych trybów: ciągły 30%, ciągły 100% i mrygacz który będzie używany najczęściej.

Całość chciałbym załączać/przełączać jednym microswitchem. Hmm… i tu pojawia się problem. Przechodzenie z jednego trybu do kolejnego odbywa się całkiem normalnie, każde wciśnięcie przycisku powoduje przerwanie (INT0), przy czwartym wciśnięciu przycisku, uC powinien wejść w tryb Powerdown. A przy kolejnym miałby się wybudzić. W trybie uśpienia powinien pobierać z baterii jakieś pojedyncze mikroampery. Nie jestem jednak pewien, czy w ten sposób można zrealizować takie sterowanie. Prosiłbym o wasze rady.

Przetwornicy również jeszcze nie wybrałem, ale na razie chciałbym same tryby opracować. A może ktoś z was mógłby opisać zmianę trybów przez odłączenie minusa? Ja jakoś nie potrafię sobie tego wyobrazić. Pozdrawiam

Re: Proszę o pomoc przy opracowaniu trybów lampki rowerowej

: niedziela 11 paź 2009, 16:08
autor: df
kurczak pisze:Przechodzenie z jednego trybu do kolejnego odbywa się całkiem normalnie, każde wciśnięcie przycisku powoduje przerwanie (INT0), przy czwartym wciśnięciu przycisku, uC powinien wejść w tryb Powerdown. A przy kolejnym miałby się wybudzić. W trybie uśpienia powinien pobierać z baterii jakieś pojedyncze mikroampery. Nie jestem jednak pewien, czy w ten sposób można zrealizować takie sterowanie. Prosiłbym o wasze rady.
Można.
Bardzo dobrze wybrałeś port pod INT0, gdyż można nim cpu z głębokiego stanu uśpienia zbudzić.
Nie wiem w czym piszesz, ale na przykładzie assemblera można zrobić to tak (Temp to rejest z górnej 16-tki):

0. jak złapiesz 4-ty tryb do potrzymaj program np. w pętli aż nie zostanie przycisk zwolniony i dopiero idź dalej w sleep`a (dobrze jest zabezpieczyć się przed odbiciami styków), bo inaczej uśpisz procesor i od razu go wybudzisz

1. musisz włączyć przerwanie generowane stanem na porcie (port oczywiście skonfigurowany jako wejściowy)
ldi Temp, 0b01000000 ; (1<<INT0)
out GIMSK, Temp

2. konfigurujesz procesor w najgłębszy tryb uśpienia (ten, co ma 0,2uA) i wskazujesz jakim stanem na porcie zostanie wygenerowane przerwanie i zbudzony procesor - np. L
ldi Temp,0b00110000 ; power-down - stan L
out mcucr,Temp

3. ja jeszcze dla pewności zeruję przerwanie (gdyby się ktoś w trakcie wstrzelił)
clr Temp
out GIFR,Temp ; erase INT0

4. ważna rzecz - przerwania muszą być odmaskowane
sei

5. no i usypiasz go
sleep; ; set CPU in Power-down mode

a po zbudzeniu musisz poprzywracać jego funkcje życiowe, które być może przed uśpieniem wyłączyłeś, w szczególności jak używasz jeszcze gdzieś sleep`a to zmieniasz poziom uspienia na wyższy itd.
ldi Temp,0b00100000 ; sleep (1<<SE) - idle
out mcucr,Temp

Ważna rzecz - jak używasz ADC z wewnętrznym Vref - to przed uśpieniem wyłączaj ADC, bo będzie Ci ciągnął niecałe 1mA - co dziwne Vref nie jest w power-down z automatu odłączane.
kurczak pisze:Przetwornicy również jeszcze nie wybrałem, ale na razie chciałbym same tryby opracować. A może ktoś z was mógłby opisać zmianę trybów przez odłączenie minusa? Ja jakoś nie potrafię sobie tego wyobrazić. Pozdrawiam
Poszukaj proszę na forum sam kilka razy opisywałem tu różne sposoby realizacji tego.

Pozdrawiam,

: niedziela 11 paź 2009, 16:34
autor: kurczak
Dziękuję za szybką odpowiedź. Programuję w Bascom'ie a właściwie dopiero się uczę (to mój drugi projekt z użyciem uC)

Odkłucanie styków faktycznie warto zrobić, bo widzę jak odbywa się zmiana trybów: czasem przeskoczy o dwa, trzy albo i więcej. Dlatego też myślałem, żeby główna pętla programu zajęła się tylko i wyłącznie odczytem portu i niczym więcej (polecenie "debounce"). W przypadku zwarcia do masy uruchamia się procedura, która wyrzuca na inny pin pwm'a. W ten sposób mam zrealizowane 3 tryby. Przy czwartym uaktywniam int0 i chciałbym usypiać poleceniem "Powerdown" co teoretycznie powinno wyłączyć całego procka oprócz obsługi przerwania.

Z ADC nie korzystam, przynajmniej świadomie ;)

Napisz mi proszę czy ma to jakiś sens i czy warto w to brnąć.

Mógłbym pokazać kod, tylko nie wiem, czy to pomoże...

: niedziela 11 paź 2009, 21:34
autor: df
Zachęcam do przejrzenia forum i poczytania sobie dyskusji o prototypach różnych powstających na forum driverków - zarówno tych starszych jak i nowych - ot choćby ostatnie bardzo ciekawe prace Pyry, w których poruszane jest wiele ważnych aspektów oraz gotowych rozwiązań odpowiadających na Twoje pytania.

http://www.swiatelka.pl/viewtopic.php?t=147
http://www.swiatelka.pl/viewtopic.php?t=483
http://www.swiatelka.pl/viewtopic.php?p=26588
http://www.swiatelka.pl/viewtopic.php?p=26590
itd.

: niedziela 11 paź 2009, 22:32
autor: Pyra
kurczak pisze: Odkłucanie styków faktycznie warto zrobić, bo widzę jak odbywa się zmiana trybów: czasem przeskoczy o dwa, trzy albo i więcej.
Jest to bardzo ważne, włąśnie ze względu na drgania styków powodujące przeskakiwanie na losowe tryby (po kilka od razu) co w Twoim przypadku może się ko nczyć wyłączeniem latarki.
kurczak pisze: Dlatego też myślałem, żeby główna pętla programu zajęła się tylko i wyłącznie odczytem portu i niczym więcej (polecenie "debounce").
Debounce, po początkowych próbach odrzuciłem jako "pamięciożerną"
Stosuję prosty schemat
;
Pin = 1 skok do procedury

procedura:
waitms 2
pin = 0 powrót
program zmiany kodu

Wykrywa to odpowiednio długie impulsy i zajmuje mało miejsca.

Zmiana trybów odłączaniem zasilania jest naprawdę prosta do realizacji i nie wymaga wprowadzania procesora w tryb uśpienia.

Pozdrawiam

PS: W temacie Tania letarka No Name masz listingi z opisem

: niedziela 11 paź 2009, 23:09
autor: kurczak
Dziękuję, zabieram się do lektury.

hmm... bardzo fajne te wasze projekty... ale ja bym chciał po swojemu. Tzn. jeden włącznik przelatujący przez tryby i uśpienie procka a następnie wybudzenie. Napisałem program i ku memu zdziwieniu raz działa raz nie !?!?!?

Po włączeniu zasilania procek powinien mignąć diodą i przejść w tryb uśpienia. Wybudzenie z int0, zablokowanie globalne przerwań, tryby i znów uśpienie, wybudzenie i tak w koło Macieju.

Jest jednak problem, bo powerdown nie działa tak jak tego oczekuję. Spodziewałem się, że stan na wyjściu będzie 0, a jednak nie zawsze i czasami dioda świeci dalej (a własciwie tylko czasami gasnie). Czym to może być spowodowane??


oto kod:


Dim Stan As Byte
Stan = 0

Config Portb.0 = Output
Config Portb.1 = Input
Set Portb.1
Reset Portb.0
enable Int0
Enable Interrupts
Toggle Portb.0
Waitms 100
Toggle Portb.0
Wait 1
Powerdown
Do

Debounce Pinb.1 , 0 , Guzik , Sub

Loop
End

Guzik:
Incr Stan
If Stan = 4 Then Stan = 0

Select Case Stan

Case 0:
Enable Int0
Enable Interrupts

Wait 1
Powerdown


Case 1: '
Disable Interrupts
Config Timer0 = Pwm , Prescale = 1024 , Compare A Pwm = Clear Down
Pwm0a = 100

Case 2:
Disable Interrupts
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
Pwm0a = 60

Case 3:
Disable Interrupts
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
Pwm0a = 250



End Select
Return



Jako ciekawostkę podam, że po pierwszym "powerdown" układ pobiera z zasilania ok 36uA, wiec nie do konća działa. Wg dokumentacji procka powinien pobierać jakieś 8 razy mniej. Później po wejsciu w tryby od 2 do 5mA. Do scalaka mam podpiętą diodę 5 mm przez rezystor i właściwie microswitcha + programator. Jutro sprawdzę jak będzie to wyglądać przy zasilaniu zewnętrznym.

: wtorek 13 paź 2009, 10:51
autor: df
kurczak pisze:hmm... bardzo fajne te wasze projekty... ale ja bym chciał po swojemu. Tzn. jeden włącznik przelatujący przez tryby i uśpienie procka a następnie wybudzenie.
To też już przerabialiśmy ;-)

http://www.swiatelka.pl/viewtopic.php?t=483
http://flagiusz.republika.pl/flashlight ... ght_5.html
http://flagiusz.republika.pl/flashlight ... oller.html
http://flagiusz.republika.pl/flashlight ... ght_9.html
kurczak pisze:Napisałem program i ku memu zdziwieniu raz działa raz nie !?!?!?

Po włączeniu zasilania procek powinien mignąć diodą i przejść w tryb uśpienia. Wybudzenie z int0, zablokowanie globalne przerwań, tryby i znów uśpienie, wybudzenie i tak w koło Macieju.
Przetrace`uj dokładnie program na symulatorze - uwzględniaj odbicia styków i stany nieustalone, które źle badasz.
kurczak pisze:Jest jednak problem, bo powerdown nie działa tak jak tego oczekuję. Spodziewałem się, że stan na wyjściu będzie 0, a jednak nie zawsze i czasami dioda świeci dalej (a własciwie tylko czasami gasnie). Czym to może być spowodowane??
O ile dobrze pamiętam, to w power-down porty wy. są ustawiane w HZ (do sprawdzenia w spec., bo głowy nie dam). I jeżeli masz sterowany wprost z portu mosfet, to może on łapać ładunek na bramkę i się otwierać - trzeba ją domykać R (1M) do źródła.

Druga potencjalna przyczyna, to błąd w kodzie - robi coś innego, niż ci się wydaje.
kurczak pisze: If Stan = 4 Then Stan = 0
Tu jest pierwszy myk:

Ja bym dał:
If Stan >= 4 Then Stan = 0

Koszt ten sam (brsh zamiast breq) a zabezpieczasz się przed niespodziewanym wyjściem w pole (prawdopodobnie nie używasz BB, więc przy zanikach zasilania możesz się spodziewać niespodzianek).
kurczak pisze: Pwm0a = 250
A dlaczego nie: Pwm0a = 255 ???
kurczak pisze:Jako ciekawostkę podam, że po pierwszym "powerdown" układ pobiera z zasilania ok 36uA, wiec nie do konća działa. Wg dokumentacji procka powinien pobierać jakieś 8 razy mniej. Później po wejsciu w tryby od 2 do 5mA. Do scalaka mam podpiętą diodę 5 mm przez rezystor i właściwie microswitcha + programator. Jutro sprawdzę jak będzie to wyglądać przy zasilaniu zewnętrznym.
Albo coś Ci z boku zżera (LED), albo procek nie śpi.
Najprawdopodobniej wchodzi w sleep`a i się budzi i tak w kółko.
W powerdown ATtiny13v pobiera 0,2uA (200nA) - sprawdzane wielokrotnie.

Zakładam, że masz microswitch`a zwieranego do masy i na porcie włączony pull-up.

Zrób próbę i wyłącz przerwania i ustaw procek w power-down.
Powinien się zatrzymać na zawsze - i wówczas zmierz prąd.

: wtorek 13 paź 2009, 17:42
autor: kurczak
df pisze: Przetrace`uj dokładnie program na symulatorze - uwzględniaj odbicia styków i stany nieustalone, które źle badasz.
Odbicia styków są niwelowane poleceniem "debounce", które sprawdza stan, czeka 25ms i sprawdza ponownie. I z tym już nie mam problemu bo wciskanie przycisku odbywa się precyzyjnie i program reaguje odpowiednio.
df pisze: O ile dobrze pamiętam, to w power-down porty wy. są ustawiane w HZ (do sprawdzenia w spec., bo głowy nie dam).
W rzeczy samej, po powerdown port wyjściowy zachowuje swój stan. W związku z tym przed uśpieniem zamieniam wyjście na wejście bez podciągania, a po wybudzeniu z powrotem ustawiam wyjście. Może to nie eleganckie, ale skuteczne.
df pisze: I jeżeli masz sterowany wprost z portu mosfet, to może on łapać ładunek na bramkę i się otwierać - trzeba ją domykać R (1M) do źródła.
Nie mam mosfeta, na razie jest to dioda 5 mm podłączona przez opornik między masą a wyjściem uC.
df pisze:
kurczak pisze: Pwm0a = 250
A dlaczego nie: Pwm0a = 255 ???
Nie wiem, tak jakoś ;) Nie chciałem mieć sygnału ciągłego przy użyciu pwm, bo to marnotrawstwo energii. Ten sam efekt będzie, jak się ustawi stan wysoki na wyjściu (chyba).
df pisze: Albo coś Ci z boku zżera (LED), albo procek nie śpi.
Najprawdopodobniej wchodzi w sleep`a i się budzi i tak w kółko.
W powerdown ATtiny13v pobiera 0,2uA (200nA) - sprawdzane wielokrotnie.
I faktycznie, programator mi coś psuł, bo po podłączeniu baterii, wygaszeniu diody i przejściu w tryb powerdown na mierniku uzyskałem 0.2 uA. Wezmę to moje ustrojstwo na polibudę i zmierzę jeszcze porządnym miernikiem, bo ten mój to nie budzi zbyt dużego zaufania.
df pisze: Zakładam, że masz microswitch`a zwieranego do masy i na porcie włączony pull-up.
Tak

W chwili obecnej mój attiny działa mniej więcej tak jak tego oczekiwałem. Do poprawienia mam jeszcze tryb migania, nad którym sobie posiedzę. Tzn, nie chcę mieć migania zrealizowanego w tak barbarzyński sposób (tzn przez dzielnik licznika pwm). Będę dążył do uzyskania takiego efektu: 4 mignięcia, dłuższa przerwa i znów 4 mignięcia, znów przerwa itd.

Mam jeszcze pytanko dotyczące kwestii zasilania. Dysponuję pakietem Ni-Cd o znamionowym napięciu 4,8V (szseregowo 4 sztuki po 1,2 każda). Po naładowaniu napięcie dochodzi do prawie 6V. Chciałbym zastosować tu amc7135 w liczbie 2 lub 3 sztuk, jeszcze się nie zdecydowałem. Czy dadzą radę te stabilizatorki, czy może pomyśleć nad jakąś przetwornicą?
pozdrawiam

: wtorek 13 paź 2009, 19:44
autor: rrobsonm
ten amc to sredni pomysl, grzac sie bedzie ostro. ponad 2V do zbicia jest.

: wtorek 13 paź 2009, 20:09
autor: greg
6V będzie bardzo krótko. Za chwilę spadnie do 4,8V a wtedy tragedii z grzaniem AMC już nie będzie. Oczywiście, przy 4 ogniwach Ni-Cd przetwornica step-down byłaby pewnie lepsza, chociaż na AMC7135 konstrukcja będzie banalna. Z wyjścia procka sterujesz bezpośrednio VDD AMC-ków.

: wtorek 13 paź 2009, 20:25
autor: kurczak
Właśnie ta prostota jest niesamowitym plusem, ale nie wiem czy jest to najlepsze rozwiązanie z uwagi na energię traconą na ciepło. Orientujecie się, czy w Poznaniu można w jakimś sklepie dostać przetwornicę (step down?), czy pozostaje tylko internet?

: wtorek 13 paź 2009, 21:08
autor: Pyra
Witam
Musiał byś popytać u Gembary, lub U Edy, powinni coś mieć, ale trudno Ci będzie znaleźć coś w małej obudowie. Bardzo dobry układ to PT4105 (patrz Projekt przetwornicy CC) znakomicie sprawdza się w tej roli i stosunkow łatwo ją sterować przez PWM.

: wtorek 13 paź 2009, 21:59
autor: kurczak
Przejrzałem notę i faktycznie całkiem sympatyczny scalak. teoretycznie działa od 4,5V więc nie musiałbym kombinować z ochroną akumulatora. Jest tylko jeden szkopuł, nie widać tego układu w sklepach. Może ktoś z was miałby odsprzedać?

: środa 14 paź 2009, 20:44
autor: Pyra
kurczak pisze: Przejrzałem notę i faktycznie całkiem sympatyczny scalak. teoretycznie działa od 4,5V więc nie musiałbym kombinować z ochroną akumulatora.
No muszę Cię rozczarować, ale przy 3,4V w diodę szło jeszcze 200mA, tak że działa poniżej. Na trzeciej stronie datasheet'a masz tabelkę:
Operating Voltage min. 2,5V max. 18V

kurczak pisze:Jest tylko jeden szkopuł, nie widać tego układu w sklepach. Może ktoś z was miałby odsprzedać?
Mogę Ci jeden podarować :)
Odezwij się na PW to ustalimy szczegóły dostawy

Tak się zastanawiam, czy nie praktyczniej by było, gdyby tryby zmianiały się w kółko a wyłączenie latarki następowało przy dłuższym przytrzymaniu przycisku, lub "dwukliku". Mógłbyś wtedy zmieniać jasność w zależności od warunków na drodze, bez konieczności wyłączania i włączania ponownie latarki.

Pozdrawiam

: środa 14 paź 2009, 21:31
autor: kurczak
Też o tym myślałem. Tzn. nie o dwukliku, tylko o długim kliku wyłączającym co było by łatwiej zrealizować bez konieczności używania timera. posiedzę nad tym dzisiaj i to rozpracuję. A tak w ogóle to mi mój pakiet akumulatorów padł. Napięcie zeszło do 2V więc nie nada się do zasilania powerleda. Będę się musiał rozejrzeć za innym. Pewnie znowu zorganizuję sobie moduł zasilania awaryjnego ;P Jest to fajna rzecz, bo z ładowarką w komplecie.

Zamówiłem dzisiaj max1797, jeśli wyślą, to będzie na tył. Myślę o 2x1W w kolorze czerwonym i będzie tylko tryb migający + optyka owalna ułożona względem siebie pod kątem prostym (tzn. mniej więcej tak: -- | ).
Pozdrawiam