{"id":444,"date":"2014-05-19T18:33:14","date_gmt":"2014-05-19T17:33:14","guid":{"rendered":"http:\/\/honza.paws.cz\/?p=444"},"modified":"2014-06-09T15:08:03","modified_gmt":"2014-06-09T14:08:03","slug":"casovace-msp430","status":"publish","type":"post","link":"http:\/\/honza.paws.cz\/?p=444","title":{"rendered":"\u010casova\u010de MSP430"},"content":{"rendered":"<p>Sp\u00ed\u0161e sporadicky ne\u017e pravideln\u011b pracuji na fin\u00e1ln\u00ed podob\u011b \u010dasom\u00edry, jej\u00ed\u017e srdcem bude TI MSP430G2553. V posledn\u00edch dnech jsem pracoval na p\u0159eru\u0161en\u00edch od vstup\u016f (startovac\u00ed tla\u010d\u00edtko, koncov\u00e9 sp\u00edna\u010de) a od \u010dasova\u010de.<\/p>\n<p>Prvn\u00ed d\u00edl\u010d\u00ed \u00fasp\u011bch je nap\u00e1jen\u00ed. Nev\u011bd\u011bl jsem, zda stabiliz\u00e1tor LE33 bude dod\u00e1vat dostate\u010dn\u00fd proud. Probl\u00e9m byl jedin\u00fd, v dokumentaci byly p\u0159ehozen\u00e9 piny Vin a Vout.<\/p>\n<p>Dal\u0161\u00ed probl\u00e9m se objevil na vstupech, kter\u00e9 zp\u016fsobovaly p\u0159eru\u0161en\u00ed zcela n\u00e1hodn\u011b. Toto v\u00edce m\u00e9n\u011b vy\u0159e\u0161ilo p\u0159ipojen\u00ed kondenz\u00e1tor\u016f 100 nF mezi pin a zem.<\/p>\n<p>V\u011bt\u0161\u00ed \u00faskal\u00ed nastalo p\u0159i programov\u00e1n\u00ed. P\u0159\u00edstup s p\u0159eru\u0161en\u00edmi se diametr\u00e1ln\u011b li\u0161\u00ed od toho, na co jsem byl \u00a0zvykl\u00fd a vy\u017eaduje si naprosto jin\u00e9 sm\u00fd\u0161len\u00ed o probl\u00e9mu. Nakonec jsem vypotil k\u00f3d, kter\u00fd p\u0159i sepnut\u00ed startovac\u00edho tla\u010d\u00edtka spust\u00ed oba \u010dasova\u010de a koncov\u00fd sp\u00edna\u010d zase jeden z \u010dasova\u010d\u016f vypne. M\u011blo by tak doj\u00edt k docela p\u0159esn\u00e9mu m\u011b\u0159en\u00ed \u010dasu.<\/p>\n<p>Probl\u00e9m prvn\u00ed: jak se ovl\u00e1d\u00e1 druh\u00fd \u010dasova\u010d. P\u016fvodn\u011b jsem m\u011bl za to, \u017ee je v MCU \u010dasova\u010d A i \u010dasova\u010d B. To byl omyl, v za\u0159\u00edzen\u00ed jsou dva \u010dasova\u010de, ale jsou to A0 a A1. \u010casova\u010d A0 jsem ovl\u00e1dal p\u0159\u00edkazy, kter\u00e9 se b\u011b\u017en\u011b daj\u00ed naj\u00edt, ale jak na \u010dasova\u010d A1?<\/p>\n<pre>  TA0CCTL0 = CCIE;\t\t\t\t\t\/\/ CCR0 interrupt enabled\r\n  TA0CCR0 = 2048-1;\t\t\t\t\t\/\/ 2048 -&gt; 1 sec for ACLK\/8\r\n  TA0CTL = TASSEL_1 + ID_3 + MC_0;\t\t\t\/\/ ACLK, \/8, stopped\r\n  TA1CCTL0 = CCIE;\t\t\t\t\t\/\/ CCR0 interrupt enabled\r\n  TA1CCR0 = 2048-1;                                     \/\/ A1 CCR0 level\r\n  TA1CTL = TASSEL_1 + ID_3 + MC_0;\t\t\t\/\/ ACLK, \/8, stopped\r\n  TA0R = 0;                                             \/\/ clear counter\r\n  TA1R = 0;                                             \/\/ clear counter\r\n<\/pre>\n<p>Za t\u011bmito \u0159\u00e1dkami stoj\u00ed spousta hled\u00e1n\u00ed, pokus\u016f a omyl\u016f \ud83d\ude42 M\u00e1me tedy nastaven\u00e9 \u010dasova\u010de, tak je spust\u00edme<\/p>\n<pre>  TA1CTL |= (MC_1 + TACLR);    \/\/timer A1 starts counting\r\n  TA0CTL |= (MC_1 + TACLR);    \/\/timer A0 starts counting\r\n<\/pre>\n<p>a zase vypneme<\/p>\n<pre>  TA0CTL &amp;= ~MC_1;                         \/\/stop timer A0\r\n  TA1CTL &amp;= ~MC_1;                              \/\/stop timer A1\r\n<\/pre>\n<p>Pokud \u010dasova\u010d dos\u00e1hne hladiny CCR0 spust\u00ed p\u0159eru\u0161en\u00ed. Pro tyto \u010dasova\u010de maj\u00ed vektory p\u0159eru\u0161en\u00ed pon\u011bkud matouc\u00ed n\u00e1zvy<\/p>\n<pre>  #pragma vector=TIMER0_A0_VECTOR\r\n  #pragma vector=TIMER1_A0_VECTOR\r\n<\/pre>\n<p>Zbytek ISR se nijak neli\u0161\u00ed od b\u011b\u017en\u011b dostupn\u00fdch n\u00e1vod\u016f.<\/p>\n<p>Dal\u0161\u00ed probl\u00e9m bylo zmen\u0161en\u00ed ISR pro stisknut\u00e1 tla\u010d\u00edtka na minimum. Pokud po\u0161lete procesor sp\u00e1t a budete naslouchat p\u0159eru\u0161en\u00edm. Po proveden\u00ed ISR jde zase sp\u00e1t. My v\u0161ak pot\u0159ebujeme aby vykonal je\u0161t\u011b n\u011bjak\u00e9 instrukce. Z\u00e1kladn\u00ed my\u0161lenka je takov\u00e1: pokud se n\u00e1m spust\u00ed n\u011bkolik p\u0159eru\u0161en\u00ed najednou, vykon\u00e1vaj\u00ed se podle p\u0159edem dan\u00e9 priority, pokud se vykon\u00e1v\u00e1 ISR k jednomu p\u0159eru\u0161en\u00ed, nem\u016f\u017ee se spustit ISR jin\u00e9ho a proto pot\u0159ebujeme v kritick\u00fdch chv\u00edl\u00edch, jako je m\u011b\u0159en\u00ed \u010dasu, udr\u017eet ISR na co nejmen\u0161\u00ed d\u00e9lce, t\u0159eba jen nastavit vlajku a podle n\u00ed vykonat zbytek instrukc\u00ed jinde, tam, kde se m\u016f\u017ee program p\u0159eru\u0161it a procesor obslou\u017eit nov\u011b p\u0159\u00edchoz\u00ed p\u0159eru\u0161en\u00ed. Jak na to? Na konci<\/p>\n<pre>main()<\/pre>\n<p>v\u011bt\u0161inou m\u00e1me n\u011bco jako<\/p>\n<pre>_BIS_SR(LPM3_bits + GIE);       \/\/ Enter LowPowerMode 3 w\/ interrupt<\/pre>\n<p>. To jsem obalil nejd\u0159\u00edve cyklem<\/p>\n<pre>while(1)<\/pre>\n<p>, ve kter\u00e9m je strom<\/p>\n<pre>if<\/pre>\n<p>, kter\u00fd vykon\u00e1v\u00e1 zb\u00fdvaj\u00edc\u00ed pr\u00e1ci po p\u0159eru\u0161en\u00edch, na z\u00e1klad\u011b nastaven\u00e9 vlajky.<\/p>\n<pre>_BIS_SR(LPM3_bits + GIE);       \/\/ Enter LowPowerMode 3 w\/ interrupt<\/pre>\n<p>p\u0159esunu do jeho<\/p>\n<pre>else<\/pre>\n<p>, tak\u017ee se provede tolik cykl\u016f while(), kolik m\u00e1me nastaven\u00fdch vlajek, jsou-li v\u0161echny vlajky vy\u010di\u0161t\u011bny, jde procesor sp\u00e1t a \u010dek\u00e1 se na dal\u0161\u00ed p\u0159eru\u0161en\u00ed.<\/p>\n<p>To ale nesta\u010d\u00ed, proto\u017ee norm\u00e1ln\u011b po vykon\u00e1n\u00ed ISR jde procesor zase sp\u00e1t. V tom mu do\u010dasn\u011b zabr\u00e1n\u00edme t\u00edm, \u017ee na konec ISR, kter\u00e9 pot\u0159ebuj\u00ed je\u0161t\u011b vykonat n\u011bco mimo, a tedy nastav\u00ed p\u0159\u00edslu\u0161nou vlajku, um\u00edst\u00edme je\u0161t\u011b \u0159\u00e1dek<\/p>\n<pre>__bic_SR_register_on_exit(LPM3_bits + GIE); \/\/ Don't Enter LowPowerMode 3 immidiately<\/pre>\n<p>Tak se vr\u00e1t\u00edme do cyklu while() v main(). V t\u00e9 dob\u011b u\u017e m\u016f\u017eeme obsluhovat dal\u0161\u00ed p\u0159eru\u0161en\u00ed.<\/p>\n<p>A to je v\u0161e podstatn\u00e9, ideu ze kter\u00e9 jsem \u010derpal najdete na obr\u00e1zku v souboru <a href=\"http:\/\/www.ti.com\/lit\/an\/slaa294a\/slaa294a.pdf\">www.ti.com\/lit\/an\/slaa294a\/slaa294a.pdf<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sp\u00ed\u0161e sporadicky ne\u017e pravideln\u011b pracuji na fin\u00e1ln\u00ed podob\u011b \u010dasom\u00edry, jej\u00ed\u017e srdcem bude TI MSP430G2553. V posledn\u00edch dnech jsem pracoval na p\u0159eru\u0161en\u00edch od vstup\u016f (startovac\u00ed tla\u010d\u00edtko, koncov\u00e9 sp\u00edna\u010de) a od \u010dasova\u010de. Prvn\u00ed d\u00edl\u010d\u00ed \u00fasp\u011bch je nap\u00e1jen\u00ed. Nev\u011bd\u011bl jsem, zda stabiliz\u00e1tor LE33 bude dod\u00e1vat dostate\u010dn\u00fd proud. Probl\u00e9m byl jedin\u00fd, v dokumentaci byly p\u0159ehozen\u00e9 piny Vin a Vout. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/444"}],"collection":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=444"}],"version-history":[{"count":4,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/444\/revisions"}],"predecessor-version":[{"id":448,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=\/wp\/v2\/posts\/444\/revisions\/448"}],"wp:attachment":[{"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/honza.paws.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}