Re: Ukazka C++ pro děti

Pavel Brychta pavel.brychta na duhasys.eu
Středa Březen 31 13:53:00 CEST 2021


:D tak schválně zkusím tu větu zkrátit a věc popsat jinak:

I v Delphi/Pascalu si jistě pamatujete na Constructor Init a Destructor 
Done - při práci s objektem je ho potřeba nejdřív "vytvořit" a pak taky 
občas "zrušit" - k tomuto účelu právě slouží konstruktory a destruktory. 
Konstruktor je volaný ve chvíli, kdy se objekt vytváří - v tomto 
případě, vzhledem k tomu, že objekt je vytvořený staticky a globálně se 
konstruktor volá ve chvíli, kdy probíhá inicializace všech 
statických/globálních objektů, tedy někde ve startup kódu daného 
mikrokontroléru. Pořadí volání konstruktorů určuje kompilátor, co se 
dělo předtím a co se bude dít potom určuje struktura startup kódu. 
Nedokážu tedy říct v jakém stavu se zařízení nachází - lidštěji co už 
nastavené je, co není a teprve se nastavovat bude. V této situaci začnu 
nastavovat přerušovací systém a namířím ho do jiné části kódu, která 
pracuje s proměnnými mimo aktuálně inicializovaný objekt (v jakém jsou 
stavu bůh suď).

No, nějak mi to nevyšlo na kratší popis, ale velmi rád se podívám, jak 
to popsat snadněji ;-)

Pavel Brychta

Dne 31. 03. 21 v 13:37 ajtservis napsal(a):
> hezky den.
> sleduji tohle vlakno jako uplny "nececkar". zkusennost jen asm51 a 
> delphi, ale neobjekovym zpusobem, bych rekl :-)
> prvni vec co me prepadla je jak uz bylo uvedeno "Bohajeho, tohle že je 
> pro děti?".
> pak prispevek jak postupovat pomaleji, ten ok.
> a nakonec to zabije veta, v dalsim prispevku "Například aktivace 
> přerušovacího systému ve staticky volaném konstruktoru, kde je cíl 
> volání mimo třídu je snad jasná hovadina pro jakýkoliv názor..." :-)
> mam asi zasadni problem si pod slovy trida, metoda, objekt, 
> konstruktor atd. predstavit o co v tom programovani vlastne jde ?
> mam prakticky fumkcni projekty v asm nebo i deplhi/pascalu, ale vubec 
> si je nedokazu v predstavach spojit s timto nazvoslovim, co cemu asi 
> odpovida.
> nekolik zacatku s lepsima ceckama a objektama, nekolik knizek, navodu 
> a nic. proste se mi pri tech nazvech zablokuje mysleni a konec :-)
> neni nejaka tabulka ekvivalent tech hruzonazvu, aby clovek treba nejak 
> konvertoval ?
> je ale videt , ze nekteri si v skladani dlouuuuhych vet z techto 
> nazvu/zaklinadel libuji.
> asi mam nejakou poruchu mysleni a ne ji porad prekonat :-)
> te vyhuky pro deti, bych se asi i rad ucastnil, je to nekde dostupne 
> jako stranky ?
> tomik.
> ps. treba bych byl dobry experimetalni objekt, jak udelat z hornika 
> programatora :-)
>
>
> Dne 31.03.2021 v 11:51 Jiří Nesvacil napsal(a):
>> 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 bywww.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>
>> ------------------------------------------------------------------------
>> Logo AVG <http://www.avg.com/internet-security>
>>
>> Tento e-mail byl zkontrolován na viry antivirovým softwarem AVG.
>> www.avg.cz <http://www.avg.com/internet-security>
>>
>>
>> <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>


Další informace o konferenci Hw-list