<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;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.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 link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Je to lekce C, kde jsou jako zajímavost dva programy v C++. V lekci 1, před x měsící, bylo i použití Home a End. Děti které neumí psát na počítači, používat myš a počítat se zlomky a desetinnými čísly na mé kroužky naštěstí nechodí:-)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Ten Váš mail jsem četl, ale můj kroužek nevyhověl některému z požadavků, myslím že místo normálního konání.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='border:none;padding:0cm'><b>Od: </b><a href="mailto:nesvacil@posys.eu">Jiří Nesvacil</a></p></div><p>jdete správnou cestou, ale ještě bych to zjednodušil. Před čase jsem se ptal, zda nechte někdo nějaký on-line kroužek, ale ozval se jen jeden, zda to děkuji, ale to je málo. Zatím jsme tedy sami postoupili, ale dělám to jinak a mám následující fáce.</p><p>a/ otevřít notepad a naučit aspoň napsat pár písmenek.<br>b/ naučit se s myší a okopírovat kousek textu.<br>c/ připravit kus kód, kde není nic v cizím jazyku, nejsou zde věci, které se naučili nedávno. Začnu jen  s tím, aby se přahazoval řádek v kódu. Něco jako jazyk "Karel" graficky. Jen přehodit pořadí, aby se pochopila posloupnost.<br>d/ další příklad volání metody s hodnotou třeba psun(5);<br>e/... proměnné, cykly,... zase tímto jednoduchým stylem.</p><p>... objekty taky jednoduše. Neboli osobně bych vyházel všechny define, založil to na malé třídě. Začít třeba se základem proměnné v objektu tzv. instanční. Až následně do složitějších konstrukcí, ale opět i složité konstrukce na jednoduchém příkladu tj. bez ostatních věcí co se mohlo zapomenout.... . Je to o tom to dělat pomalu. Možná máte větší děti nebo toho znají více... .</p><p>Jirka</p><p><o:p> </o:p></p><div><p class=MsoNormal>Dne 30.03.2021 v 20:08 Pavel Hudecek napsal(a):<o:p></o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>Dobrý den všem,<o:p></o:p></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:-)<o:p></o:p></p><p class=MsoNormal>(celé je to pro Xnano416 mající 1 LED a 1 tlačítko)<o:p></o:p></p><p class=MsoNormal>Otázka je, jak se to zmrší posláním v mailu…<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#include <avr/io.h><o:p></o:p></p><p class=MsoNormal>#include <avr/interrupt.h><o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#define F_CPU                 (20000000UL/6UL)<o:p></o:p></p><p class=MsoNormal>#define LED_bit                               5 // LEDka<o:p></o:p></p><p class=MsoNormal>#define TL_bit                  4 // tlačítko<o:p></o:p></p><p class=MsoNormal>#define TEST_bit             3 // test přerušení osciloskopem<o:p></o:p></p><p class=MsoNormal>#define TEST_bit2           2 // test čekání osciloskopem<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#define TL_jeStisk          ((PORTB.IN & (1<<TL_bit)) == 0)<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>volatile unsigned int       ms=0;<o:p></o:p></p><p class=MsoNormal>volatile unsigned char    msSync=0;<o:p></o:p></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á<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>class clTlac { // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>public:<o:p></o:p></p><p class=MsoNormal>                clTlac() { // konstruktor - spusti se pri vytvoreni objektu ----------------------------<o:p></o:p></p><p class=MsoNormal>                                PORTB.PIN4CTRL = PORT_PULLUPEN_bm;<o:p></o:p></p><p class=MsoNormal>                               // zapnout pull-up pro tlačítko<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                void cek() { // cekani na stisk --------------------------------------------------------<o:p></o:p></p><p class=MsoNormal>                               while(TL_jeStisk) cekej(0);<o:p></o:p></p><p class=MsoNormal>                               while(!TL_jeStisk) cekej(0);<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                void stisk(); // udalost stisku tlacitka - jen deklarace<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                bool stav=false;<o:p></o:p></p><p class=MsoNormal>};<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>class clLED { // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                friend void cekej(unsigned int n);<o:p></o:p></p><p class=MsoNormal>                // friend smí i do private<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>public:<o:p></o:p></p><p class=MsoNormal>                const unsigned int PMAX = F_CPU / 1000UL;<o:p></o:p></p><p class=MsoNormal>                const unsigned int P1 = PMAX / 100;       <o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                clLED() { // konstruktor - spusti se pri vytvoreni objektu -----------------------------<o:p></o:p></p><p class=MsoNormal>                               PORTB.OUTSET = 1<<LED_bit; // nastavit na 1, aby LEDka nesvítila od začátku<o:p></o:p></p><p class=MsoNormal>                               PORTB.DIR = (1<<LED_bit) | (1<<TEST_bit) | (1<<TEST_bit2) ; // zapnout výstupy pro LED<o:p></o:p></p><p class=MsoNormal>                               PORTB.PIN5CTRL = PORT_INVEN_bm; // Invertovat, aby LED svitila pri 1 (1 v datech)<o:p></o:p></p><p class=MsoNormal>                               <o:p></o:p></p><p class=MsoNormal>                               PORTMUX_CTRLC = PORTMUX_TCA02_ALTERNATE_gc;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CTRLB = TCA_SINGLE_CMP2EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CTRLC = 0;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CTRLD = 0;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_PER = F_CPU / 1000UL;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_INTCTRL = TCA_SINGLE_OVF_bm;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CMP2 = P1;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CTRLA |= TCA_SINGLE_ENABLE_bm;<o:p></o:p></p><p class=MsoNormal>                               __asm__("sei");<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                void svitit(uint8_t proc) { // rozsvitit na zadane % -----------------------------------<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CMP2 = P1 * proc;<o:p></o:p></p><p class=MsoNormal>                               tim = 0;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                void blikat(unsigned int t, unsigned char h, unsigned char l) { // ---------------------<o:p></o:p></p><p class=MsoNormal>                               tim  = t;<o:p></o:p></p><p class=MsoNormal>                               cnt  = 0;<o:p></o:p></p><p class=MsoNormal>                               pwmH = P1 * h;<o:p></o:p></p><p class=MsoNormal>                               pwmL = P1 * l;<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CMP2 = pwmH;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                unsigned int procToPWM(unsigned char n) { // prevod procent na PWM ---------------------<o:p></o:p></p><p class=MsoNormal>                               return P1 * n;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>private:<o:p></o:p></p><p class=MsoNormal>                unsigned int pwmL = 0, pwmH = PMAX, tim  = 0, cnt  = 0;<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                void togglePwm() { // prehodit PWM z low na hi / naopak --------------------------------<o:p></o:p></p><p class=MsoNormal>                               if (TCA0_SINGLE_CMP2 == pwmH)<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CMP2 = pwmL;<o:p></o:p></p><p class=MsoNormal>                               else<o:p></o:p></p><p class=MsoNormal>                               TCA0_SINGLE_CMP2 = pwmH;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>};<o:p></o:p></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.<o:p></o:p></p><p class=MsoNormal>clTlac     Tlacitko;<o:p></o:p></p><p class=MsoNormal>clLED     Led;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>void cekej(unsigned int n) { // ==============================================<o:p></o:p></p><p class=MsoNormal>                static bool tlacStickPred=false;<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                __asm__("cli");<o:p></o:p></p><p class=MsoNormal>                ms=0;<o:p></o:p></p><p class=MsoNormal>                __asm__("sei");<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                while(1) {<o:p></o:p></p><p class=MsoNormal>                               PORTB.OUTTGL = (1<<TEST_bit2);<o:p></o:p></p><p class=MsoNormal>                               <o:p></o:p></p><p class=MsoNormal>                               if (msSync==1) { // ----------------------------------------<o:p></o:p></p><p class=MsoNormal>                                               msSync=0;<o:p></o:p></p><p class=MsoNormal>                                               <o:p></o:p></p><p class=MsoNormal>                                               Tlacitko.stav = TL_jeStisk;<o:p></o:p></p><p class=MsoNormal>                                               <o:p></o:p></p><p class=MsoNormal>                                               if (Led.tim>0) { // je zapnute blikani<o:p></o:p></p><p class=MsoNormal>                                                               if (++Led.cnt>Led.tim) {<o:p></o:p></p><p class=MsoNormal>                                                                               Led.cnt=0;<o:p></o:p></p><p class=MsoNormal>                                                                               Led.togglePwm();<o:p></o:p></p><p class=MsoNormal>                                                               }<o:p></o:p></p><p class=MsoNormal>                                               }<o:p></o:p></p><p class=MsoNormal>                                               <o:p></o:p></p><p class=MsoNormal>                               } // if (msSync==1)<o:p></o:p></p><p class=MsoNormal>                               <o:p></o:p></p><p class=MsoNormal>                               if (!tlacStickPred && Tlacitko.stav) { // právě bylo stisknuto, vyvolat událost<o:p></o:p></p><p class=MsoNormal>                                               Tlacitko.stisk();<o:p></o:p></p><p class=MsoNormal>                               }<o:p></o:p></p><p class=MsoNormal>                               tlacStickPred=Tlacitko.stav;<o:p></o:p></p><p class=MsoNormal>                               <o:p></o:p></p><p class=MsoNormal>                               __asm__("cli");<o:p></o:p></p><p class=MsoNormal>                               if (ms>=n) break;<o:p></o:p></p><p class=MsoNormal>                               __asm__("sei");<o:p></o:p></p><p class=MsoNormal>                } // while(1)<o:p></o:p></p><p class=MsoNormal>                __asm__("sei");<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>// implementace obsluhy události stisk tlačítka<o:p></o:p></p><p class=MsoNormal>void clTlac::stisk() { // ===================================================<o:p></o:p></p><p class=MsoNormal>                static bool b=false;<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                // zatímco v mainu se čekat musí, tady se naopak nesmí<o:p></o:p></p><p class=MsoNormal>                if (b) {<o:p></o:p></p><p class=MsoNormal>                               Led.blikat(200, 100, 0);<o:p></o:p></p><p class=MsoNormal>                } else {<o:p></o:p></p><p class=MsoNormal>                               Led.blikat(200, 60, 30);<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                b = !b;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>int main(void) { // ###########################################################<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                // tady nic neni: inicializace je v konstruktorech<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                Led.blikat(100, 70, 20);<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                while (1) { // ---------------------------------------------------<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                               // je jedno co tu je, hlavně že to obsahuje čekání<o:p></o:p></p><p class=MsoNormal>                               cekej(100);<o:p></o:p></p><p class=MsoNormal>                               Tlacitko.cek();<o:p></o:p></p><p class=MsoNormal>                               <o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>ISR (TCA0_OVF_vect) { // =====================================================<o:p></o:p></p><p class=MsoNormal>                PORTB.OUTTGL = (1<<TEST_bit);<o:p></o:p></p><p class=MsoNormal>                ms++;<o:p></o:p></p><p class=MsoNormal>                msSync=1;<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p></blockquote></div></body></html>