Archiv pro měsíc: Květen 2014

Jak vidí hasiče veřejnost.

Našel jsem celkem náhodou video ze závodů, na kterých jsem byl. Pustil jsem si kousek a tak mě to vzalo, že jsem zkouknul skoro celé. Tohle by se dalo nazvat třeba „Jak se to nemá dělat.“ nebo „Tohle doma nezkoušejte!“ Dávám sem odkaz, abych tu hrůzu nemusel už nikdy dlouho hledat.

http://old.stream.cz/uservideo/590144-okresni-soutez-sdh-tycek

Časovače MSP430

Spíše sporadicky než pravidelně pracuji na finální podobě časomíry, jejíž srdcem bude TI MSP430G2553. V posledních dnech jsem pracoval na přerušeních od vstupů (startovací tlačítko, koncové spínače) a od časovače.

První dílčí úspěch je napájení. Nevěděl jsem, zda stabilizátor LE33 bude dodávat dostatečný proud. Problém byl jediný, v dokumentaci byly přehozené piny Vin a Vout.

Další problém se objevil na vstupech, které způsobovaly přerušení zcela náhodně. Toto více méně vyřešilo připojení kondenzátorů 100 nF mezi pin a zem.

Větší úskalí nastalo při programování. Přístup s přerušeními se diametrálně liší od toho, na co jsem byl  zvyklý a vyžaduje si naprosto jiné smýšlení o problému. Nakonec jsem vypotil kód, který při sepnutí startovacího tlačítka spustí oba časovače a koncový spínač zase jeden z časovačů vypne. Mělo by tak dojít k docela přesnému měření času.

Problém první: jak se ovládá druhý časovač. Původně jsem měl za to, že je v MCU časovač A i časovač B. To byl omyl, v zařízení jsou dva časovače, ale jsou to A0 a A1. Časovač A0 jsem ovládal příkazy, které se běžně dají najít, ale jak na časovač A1?

  TA0CCTL0 = CCIE;					// CCR0 interrupt enabled
  TA0CCR0 = 2048-1;					// 2048 -> 1 sec for ACLK/8
  TA0CTL = TASSEL_1 + ID_3 + MC_0;			// ACLK, /8, stopped
  TA1CCTL0 = CCIE;					// CCR0 interrupt enabled
  TA1CCR0 = 2048-1;                                     // A1 CCR0 level
  TA1CTL = TASSEL_1 + ID_3 + MC_0;			// ACLK, /8, stopped
  TA0R = 0;                                             // clear counter
  TA1R = 0;                                             // clear counter

Za těmito řádkami stojí spousta hledání, pokusů a omylů 🙂 Máme tedy nastavené časovače, tak je spustíme

  TA1CTL |= (MC_1 + TACLR);    //timer A1 starts counting
  TA0CTL |= (MC_1 + TACLR);    //timer A0 starts counting

a zase vypneme

  TA0CTL &= ~MC_1;                         //stop timer A0
  TA1CTL &= ~MC_1;                              //stop timer A1

Pokud časovač dosáhne hladiny CCR0 spustí přerušení. Pro tyto časovače mají vektory přerušení poněkud matoucí názvy

  #pragma vector=TIMER0_A0_VECTOR
  #pragma vector=TIMER1_A0_VECTOR

Zbytek ISR se nijak neliší od běžně dostupných návodů.

Další problém bylo zmenšení ISR pro stisknutá tlačítka na minimum. Pokud pošlete procesor spát a budete naslouchat přerušením. Po provedení ISR jde zase spát. My však potřebujeme aby vykonal ještě nějaké instrukce. Základní myšlenka je taková: pokud se nám spustí několik přerušení najednou, vykonávají se podle předem dané priority, pokud se vykonává ISR k jednomu přerušení, nemůže se spustit ISR jiného a proto potřebujeme v kritických chvílích, jako je měření času, udržet ISR na co nejmenší délce, třeba jen nastavit vlajku a podle ní vykonat zbytek instrukcí jinde, tam, kde se může program přerušit a procesor obsloužit nově příchozí přerušení. Jak na to? Na konci

main()

většinou máme něco jako

_BIS_SR(LPM3_bits + GIE);       // Enter LowPowerMode 3 w/ interrupt

. To jsem obalil nejdříve cyklem

while(1)

, ve kterém je strom

if

, který vykonává zbývající práci po přerušeních, na základě nastavené vlajky.

_BIS_SR(LPM3_bits + GIE);       // Enter LowPowerMode 3 w/ interrupt

přesunu do jeho

else

, takže se provede tolik cyklů while(), kolik máme nastavených vlajek, jsou-li všechny vlajky vyčištěny, jde procesor spát a čeká se na další přerušení.

To ale nestačí, protože normálně po vykonání ISR jde procesor zase spát. V tom mu dočasně zabráníme tím, že na konec ISR, které potřebují ještě vykonat něco mimo, a tedy nastaví příslušnou vlajku, umístíme ještě řádek

__bic_SR_register_on_exit(LPM3_bits + GIE); // Don't Enter LowPowerMode 3 immidiately

Tak se vrátíme do cyklu while() v main(). V té době už můžeme obsluhovat další přerušení.

A to je vše podstatné, ideu ze které jsem čerpal najdete na obrázku v souboru www.ti.com/lit/an/slaa294a/slaa294a.pdf

Pohár HVP v Praze 10.5.2014

V loňském roce jsem se nezúčastnil jediného závodu Českého poháru, na akademické mistrovství do Ostravy jsme zase nejeli a tak jsem zatoužil zase jednou porovnat síly s dalšími závodníky po boku. Trénink a ostrý závod jsou podstatně rozdílné události. Při tréninku neběžíte bok po boku se svým soupeřem, kterého musíte porazit. Nerozptylují vás řady diváků podél tratě a dění okolo nebývá tak hektické.

V rámci přípravy jsem odběhal první tři tréninky v sezóně. První byla hrůza, tvrdé dopady, špatné kroky. Během druhého už jsem se dostal do sedla, rozdělovače jsem dával na jisto, bylo třeba doladit drobnosti na bariéře a kladině. Ty jsem hravě zvládl na třetím tréninku a byť výkony nebyli špičkové, byl jsem spokojený.

Do Prahy jsem dorazil s hodinovým předstihem před harmonogramem. Ve skutečnosti to byl ale předstih dvouhodinový. Dámská část soutěže se protáhla víc, než pořadatelé plánovali. Hned po příchodu jsem se postavil do fronty u prezence s tím, že zaplatím startovné a dostanu číslo. Stál jsem ve frontě hodně dlouho, protože jedna z dam vyžadoval občanský průkaz, aby v seznamu nalezla číslo závodníka, odškrtla si položku na papíře, číslo vyřkla. Dáma vedle ní napsala číslo na papírový pásek a podala ho své pomocnici, která jej přilepila na ruku. Jiná pomocnice hledala číslo v textilním formátu. A když závodník obdržel tyto dvě propriety, u poslední dámy s kasou zaplatil startovné.

Když jsem měl formality odbyté, přemýšlel jsem jak pokusy zaběhnout, ale jiná volba než první hodně pojistit a druhý pojistit na rozdělovači méně, padnout nemohla. Před prvním pokusem jsem šel obhlédnout přejímku nářadí. Byla to váha kousek za startovacími bloky. Zeptal jsem se, zda je to nutné a údajně bylo. Pak jsem se jenom podivil, že když je to tak nutné, jak to, že nevedou žádnou evidenci, kterou před startem nikdo nekontroluje. A tak jen vím, že mám děsně těžké hadice. Další překvapení bylo, že se dráhy na druhý pokus nemění. Byl jsem ale rád, že nemám tu divnou bariéru s kulatým vrškem. To zřejmě ničemu nevadí, ale nejsem na to zvyklý. Nakonec jsem však litoval, že se dráha neměnila.

První pokus byla pojistka. Překvapivě jsme běželi všichni tři stejně, z krajské soutěže jsem zvyklý, že soupeře nechám daleko vzadu. Pěkně jsem zabrzdil u rozdělovače a rozběh jsem vyhrál v čase 17.20, protože závodník v první dráze nemohl zapojit proudnici a konec vypustil.

Druhý pokus byl rozběhnutý výborně, bohužel jsem nemohl za celou rovinku zapojit středy a jako bonus mi dorostenec ve vedlejší 4. dráze šlápl na hadici. Byl jsem mírně vykolejen, u rozdělovače jsem strávil dobu delší než nutnou a zase jsem vyhrál rozběh v čase 17.53, protože oba soupeři zklamali na rozdělovači. Lituji, že mi druhý pokus nevyšel, protože s takovým zpožděním dát 17.53… Mohla být zase nějaká šestnáctka.

Zajímavou věc jsem se dozvěděl po shlédnutí video záznamu. Běžel jsem s loňským vítězem poháru Josefem Mládkem 🙂