Re: Ukazka C++ pro děti

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


Dobrý den,

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;
>
> }
>
> Díky,
>
> PH
>
>
> _______________________________________________
> 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/0de85f7f/attachment.html>


Další informace o konferenci Hw-list