<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style></head><body lang=CS link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>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í:-)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>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í.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='border:none;padding:0cm'><b>Od: </b><a href="mailto:nesvacil@posys.eu">Jiří Nesvacil</a></p></div><p>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.</p><p>a/ otevřít notepad a naučit aspoň napsat pár písmenek.<br>b/ naučit se s myší a okopírovat kousek textu.<br>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.<br>d/ další příklad volání metody s hodnotou třeba psun(5);<br>e/... proměnné, cykly,... zase tímto jednoduchým stylem.</p><p>... 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... .</p><p>Jirka</p><p><o:p> </o:p></p><div><p class=MsoNormal>Dne 30.03.2021 v 20:08 Pavel Hudecek napsal(a):<o:p></o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>Dobrý den všem,<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>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:-)<o:p></o:p></p><p class=MsoNormal>(celé je to pro Xnano416 mající 1 LED a 1 tlačítko)<o:p></o:p></p><p class=MsoNormal>Otázka je, jak se to zmrší posláním v mailu…<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#include <avr/io.h><o:p></o:p></p><p class=MsoNormal>#include <avr/interrupt.h><o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#define F_CPU (20000000UL/6UL)<o:p></o:p></p><p class=MsoNormal>#define LED_bit 5 // LEDka<o:p></o:p></p><p class=MsoNormal>#define TL_bit 4 // tlačítko<o:p></o:p></p><p class=MsoNormal>#define TEST_bit 3 // test přerušení osciloskopem<o:p></o:p></p><p class=MsoNormal>#define TEST_bit2 2 // test čekání osciloskopem<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>#define TL_jeStisk ((PORTB.IN & (1<<TL_bit)) == 0)<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>volatile unsigned int ms=0;<o:p></o:p></p><p class=MsoNormal>volatile unsigned char msSync=0;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>void cekej(unsigned int n); // prototyp funkce - jen aby za ním bylo vidět jak funkce vypadá<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>class clTlac { // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>public:<o:p></o:p></p><p class=MsoNormal> clTlac() { // konstruktor - spusti se pri vytvoreni objektu ----------------------------<o:p></o:p></p><p class=MsoNormal> PORTB.PIN4CTRL = PORT_PULLUPEN_bm;<o:p></o:p></p><p class=MsoNormal> // zapnout pull-up pro tlačítko<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> void cek() { // cekani na stisk --------------------------------------------------------<o:p></o:p></p><p class=MsoNormal> while(TL_jeStisk) cekej(0);<o:p></o:p></p><p class=MsoNormal> while(!TL_jeStisk) cekej(0);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> void stisk(); // udalost stisku tlacitka - jen deklarace<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> bool stav=false;<o:p></o:p></p><p class=MsoNormal>};<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>class clLED { // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> friend void cekej(unsigned int n);<o:p></o:p></p><p class=MsoNormal> // friend smí i do private<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>public:<o:p></o:p></p><p class=MsoNormal> const unsigned int PMAX = F_CPU / 1000UL;<o:p></o:p></p><p class=MsoNormal> const unsigned int P1 = PMAX / 100; <o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> clLED() { // konstruktor - spusti se pri vytvoreni objektu -----------------------------<o:p></o:p></p><p class=MsoNormal> PORTB.OUTSET = 1<<LED_bit; // nastavit na 1, aby LEDka nesvítila od začátku<o:p></o:p></p><p class=MsoNormal> PORTB.DIR = (1<<LED_bit) | (1<<TEST_bit) | (1<<TEST_bit2) ; // zapnout výstupy pro LED<o:p></o:p></p><p class=MsoNormal> PORTB.PIN5CTRL = PORT_INVEN_bm; // Invertovat, aby LED svitila pri 1 (1 v datech)<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> PORTMUX_CTRLC = PORTMUX_TCA02_ALTERNATE_gc;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CTRLB = TCA_SINGLE_CMP2EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CTRLC = 0;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CTRLD = 0;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_PER = F_CPU / 1000UL;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_INTCTRL = TCA_SINGLE_OVF_bm;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CMP2 = P1;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CTRLA |= TCA_SINGLE_ENABLE_bm;<o:p></o:p></p><p class=MsoNormal> __asm__("sei");<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> void svitit(uint8_t proc) { // rozsvitit na zadane % -----------------------------------<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CMP2 = P1 * proc;<o:p></o:p></p><p class=MsoNormal> tim = 0;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> void blikat(unsigned int t, unsigned char h, unsigned char l) { // ---------------------<o:p></o:p></p><p class=MsoNormal> tim = t;<o:p></o:p></p><p class=MsoNormal> cnt = 0;<o:p></o:p></p><p class=MsoNormal> pwmH = P1 * h;<o:p></o:p></p><p class=MsoNormal> pwmL = P1 * l;<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CMP2 = pwmH;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> unsigned int procToPWM(unsigned char n) { // prevod procent na PWM ---------------------<o:p></o:p></p><p class=MsoNormal> return P1 * n;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>private:<o:p></o:p></p><p class=MsoNormal> unsigned int pwmL = 0, pwmH = PMAX, tim = 0, cnt = 0;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> void togglePwm() { // prehodit PWM z low na hi / naopak --------------------------------<o:p></o:p></p><p class=MsoNormal> if (TCA0_SINGLE_CMP2 == pwmH)<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CMP2 = pwmL;<o:p></o:p></p><p class=MsoNormal> else<o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_CMP2 = pwmH;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>};<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>// Tady se podle tříd clTlac a clLED vytvoří objekty Tlacitko a Led. To spustí jejich konstruktory.<o:p></o:p></p><p class=MsoNormal>clTlac Tlacitko;<o:p></o:p></p><p class=MsoNormal>clLED Led;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>void cekej(unsigned int n) { // ==============================================<o:p></o:p></p><p class=MsoNormal> static bool tlacStickPred=false;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> __asm__("cli");<o:p></o:p></p><p class=MsoNormal> ms=0;<o:p></o:p></p><p class=MsoNormal> __asm__("sei");<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> while(1) {<o:p></o:p></p><p class=MsoNormal> PORTB.OUTTGL = (1<<TEST_bit2);<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> if (msSync==1) { // ----------------------------------------<o:p></o:p></p><p class=MsoNormal> msSync=0;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> Tlacitko.stav = TL_jeStisk;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> if (Led.tim>0) { // je zapnute blikani<o:p></o:p></p><p class=MsoNormal> if (++Led.cnt>Led.tim) {<o:p></o:p></p><p class=MsoNormal> Led.cnt=0;<o:p></o:p></p><p class=MsoNormal> Led.togglePwm();<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> } // if (msSync==1)<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> if (!tlacStickPred && Tlacitko.stav) { // právě bylo stisknuto, vyvolat událost<o:p></o:p></p><p class=MsoNormal> Tlacitko.stisk();<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> tlacStickPred=Tlacitko.stav;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> __asm__("cli");<o:p></o:p></p><p class=MsoNormal> if (ms>=n) break;<o:p></o:p></p><p class=MsoNormal> __asm__("sei");<o:p></o:p></p><p class=MsoNormal> } // while(1)<o:p></o:p></p><p class=MsoNormal> __asm__("sei");<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>// implementace obsluhy události stisk tlačítka<o:p></o:p></p><p class=MsoNormal>void clTlac::stisk() { // ===================================================<o:p></o:p></p><p class=MsoNormal> static bool b=false;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> // zatímco v mainu se čekat musí, tady se naopak nesmí<o:p></o:p></p><p class=MsoNormal> if (b) {<o:p></o:p></p><p class=MsoNormal> Led.blikat(200, 100, 0);<o:p></o:p></p><p class=MsoNormal> } else {<o:p></o:p></p><p class=MsoNormal> Led.blikat(200, 60, 30);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> b = !b;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>int main(void) { // ###########################################################<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> // tady nic neni: inicializace je v konstruktorech<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> Led.blikat(100, 70, 20);<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> while (1) { // ---------------------------------------------------<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> // je jedno co tu je, hlavně že to obsahuje čekání<o:p></o:p></p><p class=MsoNormal> cekej(100);<o:p></o:p></p><p class=MsoNormal> Tlacitko.cek();<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>ISR (TCA0_OVF_vect) { // =====================================================<o:p></o:p></p><p class=MsoNormal> PORTB.OUTTGL = (1<<TEST_bit);<o:p></o:p></p><p class=MsoNormal> ms++;<o:p></o:p></p><p class=MsoNormal> msSync=1;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p></blockquote></div></body></html>