RE: Ukazka C++ pro děti
Pavel Hudecek
edizon na seznam.cz
Středa Březen 31 14:08:59 CEST 2021
Tak zrovna Delphi je Pascal a ten snad má přímo klíčové slovo Constructor, takže tady pomůže help:-)
Začátek programování je tady, taky se to tu už probíralo:
http://dejvice.cz/edison/krouzek/at-st/
Online kroužky mají stránku tady:
http://dejvice.cz/edison/krouzek/online/
a to programování se dělá v elektronice pro pokročilé, připojení někoho navíc asi nic nebrání:-)
(teda nebylo by dobrý, kdyby se připojilo 10 navíc, to bych pak ani neviděl celej seznam účastníků najednou)
Příští pondělí budu právě ukazovat odlišnost C++ a taky co je třída, konstruktor … polezou tam ti termiti kterými se to hemžilo v předchozí diskusi:-)
PH
Od: ajtservis
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;
>>
>> }
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210331/c6b833ab/attachment.html>
Další informace o konferenci Hw-list