RE: Ukazka C++ pro děti

Pavel Hudecek edizon na seznam.cz
Středa Březen 31 12:27:38 CEST 2021


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
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;
}
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210331/4c85f5b7/attachment.html>


Další informace o konferenci Hw-list