<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style></head><body lang=CS style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>DobrĂ˝ den všem,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>UdÄ›lal jsem malou ukázku programu v C++ pro dÄ›ti na krouĹľek, prosĂm o zhodnocenĂ, zda v tom nejsou nÄ›jakĂ˝ nevhodnĂ˝ vÄ›ci:-)</p><p class=MsoNormal>(celĂ© je to pro Xnano416 majĂcĂ 1 LED a 1 tlaÄŤĂtko)</p><p class=MsoNormal>Otázka je, jak se to zmršà poslánĂm v mailu…</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#include <avr/io.h></p><p class=MsoNormal>#include <avr/interrupt.h></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#define F_CPU                (20000000UL/6UL)</p><p class=MsoNormal>#define LED_bit                              5 // LEDka</p><p class=MsoNormal>#define TL_bit                 4 // tlaÄŤĂtko</p><p class=MsoNormal>#define TEST_bit            3 // test pĹ™erušenĂ osciloskopem</p><p class=MsoNormal>#define TEST_bit2          2 // test ÄŤekánĂ osciloskopem</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#define TL_jeStisk         ((PORTB.IN & (1<<TL_bit)) == 0)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>volatile unsigned int      ms=0;</p><p class=MsoNormal>volatile unsigned char   msSync=0;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>void cekej(unsigned int n); // prototyp funkce - jen aby za nĂm bylo vidÄ›t jak funkce vypadá</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>class clTlac { // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>public:</p><p class=MsoNormal>               clTlac() { // konstruktor - spusti se pri vytvoreni objektu ----------------------------</p><p class=MsoNormal>                              PORTB.PIN4CTRL = PORT_PULLUPEN_bm;</p><p class=MsoNormal>                              // zapnout pull-up pro tlaÄŤĂtko</p><p class=MsoNormal>               }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>               void cek() { // cekani na stisk --------------------------------------------------------</p><p class=MsoNormal>                              while(TL_jeStisk) cekej(0);</p><p class=MsoNormal>                              while(!TL_jeStisk) cekej(0);</p><p class=MsoNormal>               }</p><p class=MsoNormal>               </p><p class=MsoNormal>               void stisk(); // udalost stisku tlacitka - jen deklarace</p><p class=MsoNormal>               </p><p class=MsoNormal>               bool stav=false;</p><p class=MsoNormal>};</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>class clLED { // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</p><p class=MsoNormal>               </p><p class=MsoNormal>               friend void cekej(unsigned int n);</p><p class=MsoNormal>               // friend smĂ i do private</p><p class=MsoNormal>               </p><p class=MsoNormal>public:</p><p class=MsoNormal>               const unsigned int PMAX = F_CPU / 1000UL;</p><p class=MsoNormal>               const unsigned int P1 = PMAX / 100;      </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>               clLED() { // konstruktor - spusti se pri vytvoreni objektu -----------------------------</p><p class=MsoNormal>                              PORTB.OUTSET = 1<<LED_bit; // nastavit na 1, aby LEDka nesvĂtila od začátku</p><p class=MsoNormal>                              PORTB.DIR = (1<<LED_bit) | (1<<TEST_bit) | (1<<TEST_bit2) ; // zapnout vĂ˝stupy pro LED</p><p class=MsoNormal>                              PORTB.PIN5CTRL = PORT_INVEN_bm; // Invertovat, aby LED svitila pri 1 (1 v datech)</p><p class=MsoNormal>                              </p><p class=MsoNormal>                              PORTMUX_CTRLC = PORTMUX_TCA02_ALTERNATE_gc;</p><p class=MsoNormal>                              TCA0_SINGLE_CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;</p><p class=MsoNormal>                              TCA0_SINGLE_CTRLB = TCA_SINGLE_CMP2EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc;</p><p class=MsoNormal>                              TCA0_SINGLE_CTRLC = 0;</p><p class=MsoNormal>                              TCA0_SINGLE_CTRLD = 0;</p><p class=MsoNormal>                              TCA0_SINGLE_PER = F_CPU / 1000UL;</p><p class=MsoNormal>                              TCA0_SINGLE_INTCTRL = TCA_SINGLE_OVF_bm;</p><p class=MsoNormal>                              TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;</p><p class=MsoNormal>                              TCA0_SINGLE_CMP2 = P1;</p><p class=MsoNormal>                              TCA0_SINGLE_CTRLA |= TCA_SINGLE_ENABLE_bm;</p><p class=MsoNormal>                              __asm__("sei");</p><p class=MsoNormal>               }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>               void svitit(uint8_t proc) { // rozsvitit na zadane % -----------------------------------</p><p class=MsoNormal>                              TCA0_SINGLE_CMP2 = P1 * proc;</p><p class=MsoNormal>                              tim = 0;</p><p class=MsoNormal>               }</p><p class=MsoNormal>               </p><p class=MsoNormal>               void blikat(unsigned int t, unsigned char h, unsigned char l) { // ---------------------</p><p class=MsoNormal>                              tim = t;</p><p class=MsoNormal>                              cnt = 0;</p><p class=MsoNormal>                              pwmH = P1 * h;</p><p class=MsoNormal>                              pwmL = P1 * l;</p><p class=MsoNormal>                              TCA0_SINGLE_CMP2 = pwmH;</p><p class=MsoNormal>               }</p><p class=MsoNormal>               </p><p class=MsoNormal>               unsigned int procToPWM(unsigned char n) { // prevod procent na PWM ---------------------</p><p class=MsoNormal>                              return P1 * n;</p><p class=MsoNormal>               }</p><p class=MsoNormal>               </p><p class=MsoNormal>               </p><p class=MsoNormal>private:</p><p class=MsoNormal>               unsigned int pwmL = 0, pwmH = PMAX, tim = 0, cnt = 0;</p><p class=MsoNormal>               </p><p class=MsoNormal>               void togglePwm() { // prehodit PWM z low na hi / naopak --------------------------------</p><p class=MsoNormal>                              if (TCA0_SINGLE_CMP2 == pwmH)</p><p class=MsoNormal>                              TCA0_SINGLE_CMP2 = pwmL;</p><p class=MsoNormal>                              else</p><p class=MsoNormal>                              TCA0_SINGLE_CMP2 = pwmH;</p><p class=MsoNormal>               }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>};</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>// Tady se podle tĹ™Ăd clTlac a clLED vytvořà objekty Tlacitko a Led. To spustĂ jejich konstruktory.</p><p class=MsoNormal>clTlac    Tlacitko;</p><p class=MsoNormal>clLED    Led;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>void cekej(unsigned int n) { // ==============================================</p><p class=MsoNormal>               static bool tlacStickPred=false;</p><p class=MsoNormal>               </p><p class=MsoNormal>               __asm__("cli");</p><p class=MsoNormal>               ms=0;</p><p class=MsoNormal>               __asm__("sei");</p><p class=MsoNormal>               </p><p class=MsoNormal>               while(1) {</p><p class=MsoNormal>                              PORTB.OUTTGL = (1<<TEST_bit2);</p><p class=MsoNormal>                              </p><p class=MsoNormal>                              if (msSync==1) { // ----------------------------------------</p><p class=MsoNormal>                                              msSync=0;</p><p class=MsoNormal>                                              </p><p class=MsoNormal>                                              Tlacitko.stav = TL_jeStisk;</p><p class=MsoNormal>                                              </p><p class=MsoNormal>                                              if (Led.tim>0) { // je zapnute blikani</p><p class=MsoNormal>                                                              if (++Led.cnt>Led.tim) {</p><p class=MsoNormal>                                                                              Led.cnt=0;</p><p class=MsoNormal>                                                                              Led.togglePwm();</p><p class=MsoNormal>                                                              }</p><p class=MsoNormal>                                              }</p><p class=MsoNormal>                                              </p><p class=MsoNormal>                              } // if (msSync==1)</p><p class=MsoNormal>                              </p><p class=MsoNormal>                              if (!tlacStickPred && Tlacitko.stav) { // právÄ› bylo stisknuto, vyvolat událost</p><p class=MsoNormal>                                              Tlacitko.stisk();</p><p class=MsoNormal>                              }</p><p class=MsoNormal>                              tlacStickPred=Tlacitko.stav;</p><p class=MsoNormal>                              </p><p class=MsoNormal>                              __asm__("cli");</p><p class=MsoNormal>                              if (ms>=n) break;</p><p class=MsoNormal>                              __asm__("sei");</p><p class=MsoNormal>               } // while(1)</p><p class=MsoNormal>               __asm__("sei");</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>// implementace obsluhy události stisk tlaÄŤĂtka</p><p class=MsoNormal>void clTlac::stisk() { // ===================================================</p><p class=MsoNormal>               static bool b=false;</p><p class=MsoNormal>               </p><p class=MsoNormal>               // zatĂmco v mainu se ÄŤekat musĂ, tady se naopak nesmĂ</p><p class=MsoNormal>               if (b) {</p><p class=MsoNormal>                              Led.blikat(200, 100, 0);</p><p class=MsoNormal>               } else {</p><p class=MsoNormal>                              Led.blikat(200, 60, 30);</p><p class=MsoNormal>               }</p><p class=MsoNormal>               b = !b;</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>int main(void) { // ###########################################################</p><p class=MsoNormal>               </p><p class=MsoNormal>               // tady nic neni: inicializace je v konstruktorech</p><p class=MsoNormal>               </p><p class=MsoNormal>               Led.blikat(100, 70, 20);</p><p class=MsoNormal>               </p><p class=MsoNormal>               while (1) { // ---------------------------------------------------</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                              // je jedno co tu je, hlavnÄ› Ĺľe to obsahuje ÄŤekánĂ</p><p class=MsoNormal>                              cekej(100);</p><p class=MsoNormal>                              Tlacitko.cek();</p><p class=MsoNormal>                              </p><p class=MsoNormal>               }</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>ISR (TCA0_OVF_vect) { // =====================================================</p><p class=MsoNormal>               PORTB.OUTTGL = (1<<TEST_bit);</p><p class=MsoNormal>               ms++;</p><p class=MsoNormal>               msSync=1;</p><p class=MsoNormal>               </p><p class=MsoNormal>               TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>DĂky,</p><p class=MsoNormal>PH</p></div></body></html>