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