[avr-gcc] Jak to zrobic?

Apr 03, 2007 4 Replies

Mam ja sobie mikromocowe urz±dzenie. Ma tylko jeden przycisk.



Dzia³anie jest takie:



-krótkie wci¶niêcie - w³±czenie/wy³±czenie pewnej funkcji



-d³ugie wci¶niêcie - w³±czenie/wy³±czenie



-d³uuuuugie wci¶niêcie - gdy jest w³±czone-reset, gdy jest wy³±czone - bootloader. Po pewnym czasie nieaktywno¶ci urz±dzenie siê wy³±cza.


Wszystko dzia³a piknie. Ale. Trzeba by³o dorobiæ obs³ugê b³êdów. Dosz³y jeszcze dwie fukncjonalno¶ci. To wszystko skomplikowa³o obs³uge przycisku, bo w wielu miejscach jest sprawdzany i w wielu miejscach mo¿e co¶ pój¶æ nie tak.



Zastanawiam siê teraz nad globaln± zmian± koncepcji obs³ugi przycisku. Przerwanie INT0, gdzie jest przycisk da³bym jako wyzwalane poziomem, co by da³o automatycznie reset przez watchdoga, gdy siê przytrzyma d³u¿ej. Wci¶niêcie przycisku startowa³oby licznik i po puszczeniu wystarczy³oby odczytaæ go, aby wiedzieæ, czy krótko, czy d³ugo siê go wcisnê³o.



Problemy jednak dwa:



-drgania styków (na razie nie mam koncepcji jak programowo to omin±æ, wychodzi mi straszna gimnastyka),



-s± dwa miejsca w programie, które nie powinny byæ przerywane, no i tam przerwanie przycisku powinno byæ wy³±czone, co te¿ mi siê ¶rednio podoba...


Dalej dochodzi to nieszczêsne usypianie. Gdy zrobi siê b³±d urz±dzenie zaczyna migac diodkami. Gdy nikt tego nie dostrze¿e, to zamiga siê na ¶mieræ, wiêc tam te¿ powinno siê usypiaæ po jakim¶ czasie nieaktywno¶ci. Na razie to wszystko jest robione z programu, ale zastanawiam siê, czy nie zrobic takiego programowego watchdoga-usypiacza, czyli licznik, który sobie zlicza, a jak doliczy do jakiejs granicy to usypia...



Mnie ju¿ siê mózg lasuje od tego rozmy¶lania - podsuñcie mi jaki¶ ¶wie¿y pomys³ ;-)



Po prostu odrzucasz czasy nacisniêcia mniejsze, ni¿... Poza tym zdaje sie, ¿e na INT0 mozna w³±czyc filtr. Z tego, co pamiêtam, wówczas za zmianê stanu zostanie uznany taki, który trwa > 4 taktów zegara. Czasem to jednak nie wystarcza.

program powinien przez wiêkszo¶æ czasu krêciæ siê w pêtli typu:

while(1){ // rób co¶ tam }

a prawie na pewno da siê program do tego sprowadziæ ;-)

wtedy mo¿esz zrobiæ:

while(1){ sprawdz_przycisk(); // rób co¶ tam }

czyli chodzi o to, by maksymalnie czêsto wywo³ywaæ sprawdz_przycisk()

dalej:

int przycisk_nacisniety() { // zwróæ TRUE albo FALSE }

int licznik() { // zwróæ warto¶æ jakiego¶ licznika, czasu czy czego¶ tego typu }

/* wywo³ywane, gdy puszczono przycisk. parametr oznacza,

  • ile taktów licznika przycisk by³ trzymany
*/

void akcja_przycisku(int czas){ // ... }

int kiedy_nacisnieto, stan_przycisku;

void sprawdz_przycisk() { if (stan_przycisku&&!przycisk_nacisniety()) { stan_przycisku=FALSE; akcja_przycisku(licznik()-kiedy_nacisnieto); } else if (!stan_przycisku&&przycisk_nacisniety()) { stan_przycisku=TRUE; kiedy_nacisnieto=licznik(); } }

wystarczy ci JEDNO miejsce w programie, które bêdzie odpowiednio czêsto uruchamiane.

Zastanów siê nad globaln± zmian± koncepcji programu - w pewnym momencie zacz±³e¶ mieæ problemy z jego rozbudow±.

Spinacz biurowy, Wiktor S. snipped-for-privacy@wswiktor.at.poczta.dot.fm>!

Na przykład sleep_mode();

To nie jest oszczędny sposób. Od czegoś są przerwania.

U¿ytkownik "Patryk Sielski" snipped-for-privacy@elka-usun.pw.edu.pl> napisa³ w wiadomo¶ci news:ebb82$461222a3$57ceab2d$ snipped-for-privacy@news.chello.pl...

jak chcesz to robilem cos podobnego ostatnio, moge Ci podeslac kody, tyle ze bascomowe i pod 4051,ale idea bardzo podobna.

tyle ze ja wykrywalem pojedynczy klik,doubleklik, i dluuuuuuuuuuuugi klik.

jak cos to odezwij sie na priv wycinajac nospam z adresu.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required