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