Re: Ukazka C++ pro děti

Jiří Nesvacil nesvacil na posys.eu
Středa Březen 31 12:45:39 CEST 2021


Zdravím,

bez matiky se moc nepohnete ... . Musí na to ovšem být děti, čas,... 
poté se ptají co je rozdělit na třetiny či na poloviny a máte zlomky. 
Nebo nyní si přečte v 4.třídě, že kružnice se vykreslí přes sin/cos a 
tak zjišťuje co to je ... . Možná to vypadá občas složitě, ale je lépe 
něco vysvětlit než zarazit. Jít krok po kroku občas nejde ... .

Jirka


Dne 31.03.2021 v 12:27 Pavel Hudecek napsal(a):
>
> 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í:-)
>
> 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í.
>
> PH
>
> *Od: *Jiří Nesvacil <mailto:nesvacil na posys.eu>
>
> 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.
>
> a/ otevřít notepad a naučit aspoň napsat pár písmenek.
> b/ naučit se s myší a okopírovat kousek textu.
> 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.
> d/ další příklad volání metody s hodnotou třeba psun(5);
> e/... proměnné, cykly,... zase tímto jednoduchým stylem.
>
> ... 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... .
>
> Jirka
>
> Dne 30.03.2021 v 20:08 Pavel Hudecek napsal(a):
>
>     Dobrý den všem,
>
>     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:-)
>
>     (celé je to pro Xnano416 mající 1 LED a 1 tlačítko)
>
>     Otázka je, jak se to zmrší posláním v mailu…
>
>     #include <avr/io.h>
>
>     #include <avr/interrupt.h>
>
>     #define F_CPU (20000000UL/6UL)
>
>     #define LED_bit                               5 // LEDka
>
>     #define TL_bit                  4 // tlačítko
>
>     #define TEST_bit             3 // test přerušení osciloskopem
>
>     #define TEST_bit2           2 // test čekání osciloskopem
>
>     #define TL_jeStisk          ((PORTB.IN & (1<<TL_bit)) == 0)
>
>     volatile unsigned int       ms=0;
>
>     volatile unsigned char    msSync=0;
>
>     void cekej(unsigned int n); // prototyp funkce - jen aby za ním
>     bylo vidět jak funkce vypadá
>
>     class clTlac { //
>     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>     public:
>
>                     clTlac() { // konstruktor - spusti se pri
>     vytvoreni objektu ----------------------------
>
>     PORTB.PIN4CTRL = PORT_PULLUPEN_bm;
>
>                                    // zapnout pull-up pro tlačítko
>
>                     }
>
>                     void cek() { // cekani na stisk
>     --------------------------------------------------------
>
>     while(TL_jeStisk) cekej(0);
>
>     while(!TL_jeStisk) cekej(0);
>
>                     }
>
>                     void stisk(); // udalost stisku tlacitka - jen
>     deklarace
>
>                     bool stav=false;
>
>     };
>
>     class clLED { //
>     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>                     friend void cekej(unsigned int n);
>
>                     // friend smí i do private
>
>     public:
>
>                     const unsigned int PMAX = F_CPU / 1000UL;
>
>                     const unsigned int P1 = PMAX / 100;
>
>                     clLED() { // konstruktor - spusti se pri vytvoreni
>     objektu -----------------------------
>
>     PORTB.OUTSET = 1<<LED_bit; // nastavit na 1, aby LEDka nesvítila
>     od začátku
>
>                                    PORTB.DIR = (1<<LED_bit) |
>     (1<<TEST_bit) | (1<<TEST_bit2) ; // zapnout výstupy pro LED
>
>     PORTB.PIN5CTRL = PORT_INVEN_bm; // Invertovat, aby LED svitila pri
>     1 (1 v datech)
>
>     PORTMUX_CTRLC = PORTMUX_TCA02_ALTERNATE_gc;
>
>     TCA0_SINGLE_CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;
>
>     TCA0_SINGLE_CTRLB = TCA_SINGLE_CMP2EN_bm |
>     TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
>
>     TCA0_SINGLE_CTRLC = 0;
>
>     TCA0_SINGLE_CTRLD = 0;
>
>     TCA0_SINGLE_PER = F_CPU / 1000UL;
>
>     TCA0_SINGLE_INTCTRL = TCA_SINGLE_OVF_bm;
>
>     TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;
>
>     TCA0_SINGLE_CMP2 = P1;
>
>     TCA0_SINGLE_CTRLA |= TCA_SINGLE_ENABLE_bm;
>
>     __asm__("sei");
>
>                     }
>
>                     void svitit(uint8_t proc) { // rozsvitit na zadane
>     % -----------------------------------
>
>     TCA0_SINGLE_CMP2 = P1 * proc;
>
>                                    tim = 0;
>
>                     }
>
>                     void blikat(unsigned int t, unsigned char h,
>     unsigned char l) { // ---------------------
>
>                                    tim  = t;
>
>                                    cnt  = 0;
>
>                                    pwmH = P1 * h;
>
>                                    pwmL = P1 * l;
>
>     TCA0_SINGLE_CMP2 = pwmH;
>
>                     }
>
>                     unsigned int procToPWM(unsigned char n) { //
>     prevod procent na PWM ---------------------
>
>                                    return P1 * n;
>
>                     }
>
>     private:
>
>                     unsigned int pwmL = 0, pwmH = PMAX, tim  = 0, cnt 
>     = 0;
>
>                     void togglePwm() { // prehodit PWM z low na hi /
>     naopak --------------------------------
>
>                                    if (TCA0_SINGLE_CMP2 == pwmH)
>
>     TCA0_SINGLE_CMP2 = pwmL;
>
>                                    else
>
>     TCA0_SINGLE_CMP2 = pwmH;
>
>                     }
>
>     };
>
>     // Tady se podle tříd clTlac a clLED vytvoří objekty Tlacitko a
>     Led. To spustí jejich konstruktory.
>
>     clTlac     Tlacitko;
>
>     clLED     Led;
>
>     void cekej(unsigned int n) { //
>     ==============================================
>
>                     static bool tlacStickPred=false;
>
>                     __asm__("cli");
>
>                     ms=0;
>
>                     __asm__("sei");
>
>                     while(1) {
>
>     PORTB.OUTTGL = (1<<TEST_bit2);
>
>                                    if (msSync==1) { //
>     ----------------------------------------
>
>     msSync=0;
>
>     Tlacitko.stav = TL_jeStisk;
>
>     if (Led.tim>0) { // je zapnute blikani
>
>     if (++Led.cnt>Led.tim) {
>
>     Led.cnt=0;
>
>     Led.togglePwm();
>
>     }
>
>     }
>
>                                    } // if (msSync==1)
>
>                                    if (!tlacStickPred &&
>     Tlacitko.stav) { // právě bylo stisknuto, vyvolat událost
>
>     Tlacitko.stisk();
>
>                                    }
>
>     tlacStickPred=Tlacitko.stav;
>
>     __asm__("cli");
>
>                                    if (ms>=n) break;
>
>     __asm__("sei");
>
>                     } // while(1)
>
>                     __asm__("sei");
>
>     }
>
>     // implementace obsluhy události stisk tlačítka
>
>     void clTlac::stisk() { //
>     ===================================================
>
>                     static bool b=false;
>
>                     // zatímco v mainu se čekat musí, tady se naopak nesmí
>
>                     if (b) {
>
>     Led.blikat(200, 100, 0);
>
>                     } else {
>
>     Led.blikat(200, 60, 30);
>
>                     }
>
>                     b = !b;
>
>     }
>
>     int main(void) { //
>     ###########################################################
>
>                     // tady nic neni: inicializace je v konstruktorech
>
>                     Led.blikat(100, 70, 20);
>
>                     while (1) { //
>     ---------------------------------------------------
>
>                                    // je jedno co tu je, hlavně že to
>     obsahuje čekání
>
>     cekej(100);
>
>     Tlacitko.cek();
>
>                     }
>
>     }
>
>     ISR (TCA0_OVF_vect) { //
>     =====================================================
>
>                     PORTB.OUTTGL = (1<<TEST_bit);
>
>                     ms++;
>
>                     msSync=1;
>
>                     TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;
>
>     }
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


-- 
Tento e-mail byl zkontrolován na viry programem AVG.
http://www.avg.cz
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210331/710c052b/attachment-0001.html>


Další informace o konferenci Hw-list