<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>