<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;}
.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 style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Dobrý den všem,</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:-)</p><p class=MsoNormal>(celé je to pro Xnano416 mající 1 LED a 1 tlačítko)</p><p class=MsoNormal>Otázka je, jak se to zmrší posláním v mailu…</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#include <avr/io.h></p><p class=MsoNormal>#include <avr/interrupt.h></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#define F_CPU (20000000UL/6UL)</p><p class=MsoNormal>#define LED_bit 5 // LEDka</p><p class=MsoNormal>#define TL_bit 4 // tlačítko</p><p class=MsoNormal>#define TEST_bit 3 // test přerušení osciloskopem</p><p class=MsoNormal>#define TEST_bit2 2 // test čekání osciloskopem</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#define TL_jeStisk ((PORTB.IN & (1<<TL_bit)) == 0)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>volatile unsigned int ms=0;</p><p class=MsoNormal>volatile unsigned char msSync=0;</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á</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>class clTlac { // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>public:</p><p class=MsoNormal> clTlac() { // konstruktor - spusti se pri vytvoreni objektu ----------------------------</p><p class=MsoNormal> PORTB.PIN4CTRL = PORT_PULLUPEN_bm;</p><p class=MsoNormal> // zapnout pull-up pro tlačítko</p><p class=MsoNormal> }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> void cek() { // cekani na stisk --------------------------------------------------------</p><p class=MsoNormal> while(TL_jeStisk) cekej(0);</p><p class=MsoNormal> while(!TL_jeStisk) cekej(0);</p><p class=MsoNormal> }</p><p class=MsoNormal> </p><p class=MsoNormal> void stisk(); // udalost stisku tlacitka - jen deklarace</p><p class=MsoNormal> </p><p class=MsoNormal> bool stav=false;</p><p class=MsoNormal>};</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>class clLED { // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</p><p class=MsoNormal> </p><p class=MsoNormal> friend void cekej(unsigned int n);</p><p class=MsoNormal> // friend smí i do private</p><p class=MsoNormal> </p><p class=MsoNormal>public:</p><p class=MsoNormal> const unsigned int PMAX = F_CPU / 1000UL;</p><p class=MsoNormal> const unsigned int P1 = PMAX / 100; </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> clLED() { // konstruktor - spusti se pri vytvoreni objektu -----------------------------</p><p class=MsoNormal> PORTB.OUTSET = 1<<LED_bit; // nastavit na 1, aby LEDka nesvítila od začátku</p><p class=MsoNormal> PORTB.DIR = (1<<LED_bit) | (1<<TEST_bit) | (1<<TEST_bit2) ; // zapnout výstupy pro LED</p><p class=MsoNormal> PORTB.PIN5CTRL = PORT_INVEN_bm; // Invertovat, aby LED svitila pri 1 (1 v datech)</p><p class=MsoNormal> </p><p class=MsoNormal> PORTMUX_CTRLC = PORTMUX_TCA02_ALTERNATE_gc;</p><p class=MsoNormal> TCA0_SINGLE_CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc;</p><p class=MsoNormal> TCA0_SINGLE_CTRLB = TCA_SINGLE_CMP2EN_bm | TCA_SINGLE_WGMODE_SINGLESLOPE_gc;</p><p class=MsoNormal> TCA0_SINGLE_CTRLC = 0;</p><p class=MsoNormal> TCA0_SINGLE_CTRLD = 0;</p><p class=MsoNormal> TCA0_SINGLE_PER = F_CPU / 1000UL;</p><p class=MsoNormal> TCA0_SINGLE_INTCTRL = TCA_SINGLE_OVF_bm;</p><p class=MsoNormal> TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;</p><p class=MsoNormal> TCA0_SINGLE_CMP2 = P1;</p><p class=MsoNormal> TCA0_SINGLE_CTRLA |= TCA_SINGLE_ENABLE_bm;</p><p class=MsoNormal> __asm__("sei");</p><p class=MsoNormal> }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> void svitit(uint8_t proc) { // rozsvitit na zadane % -----------------------------------</p><p class=MsoNormal> TCA0_SINGLE_CMP2 = P1 * proc;</p><p class=MsoNormal> tim = 0;</p><p class=MsoNormal> }</p><p class=MsoNormal> </p><p class=MsoNormal> void blikat(unsigned int t, unsigned char h, unsigned char l) { // ---------------------</p><p class=MsoNormal> tim = t;</p><p class=MsoNormal> cnt = 0;</p><p class=MsoNormal> pwmH = P1 * h;</p><p class=MsoNormal> pwmL = P1 * l;</p><p class=MsoNormal> TCA0_SINGLE_CMP2 = pwmH;</p><p class=MsoNormal> }</p><p class=MsoNormal> </p><p class=MsoNormal> unsigned int procToPWM(unsigned char n) { // prevod procent na PWM ---------------------</p><p class=MsoNormal> return P1 * n;</p><p class=MsoNormal> }</p><p class=MsoNormal> </p><p class=MsoNormal> </p><p class=MsoNormal>private:</p><p class=MsoNormal> unsigned int pwmL = 0, pwmH = PMAX, tim = 0, cnt = 0;</p><p class=MsoNormal> </p><p class=MsoNormal> void togglePwm() { // prehodit PWM z low na hi / naopak --------------------------------</p><p class=MsoNormal> if (TCA0_SINGLE_CMP2 == pwmH)</p><p class=MsoNormal> TCA0_SINGLE_CMP2 = pwmL;</p><p class=MsoNormal> else</p><p class=MsoNormal> TCA0_SINGLE_CMP2 = pwmH;</p><p class=MsoNormal> }</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>};</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.</p><p class=MsoNormal>clTlac Tlacitko;</p><p class=MsoNormal>clLED Led;</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>void cekej(unsigned int n) { // ==============================================</p><p class=MsoNormal> static bool tlacStickPred=false;</p><p class=MsoNormal> </p><p class=MsoNormal> __asm__("cli");</p><p class=MsoNormal> ms=0;</p><p class=MsoNormal> __asm__("sei");</p><p class=MsoNormal> </p><p class=MsoNormal> while(1) {</p><p class=MsoNormal> PORTB.OUTTGL = (1<<TEST_bit2);</p><p class=MsoNormal> </p><p class=MsoNormal> if (msSync==1) { // ----------------------------------------</p><p class=MsoNormal> msSync=0;</p><p class=MsoNormal> </p><p class=MsoNormal> Tlacitko.stav = TL_jeStisk;</p><p class=MsoNormal> </p><p class=MsoNormal> if (Led.tim>0) { // je zapnute blikani</p><p class=MsoNormal> if (++Led.cnt>Led.tim) {</p><p class=MsoNormal> Led.cnt=0;</p><p class=MsoNormal> Led.togglePwm();</p><p class=MsoNormal> }</p><p class=MsoNormal> }</p><p class=MsoNormal> </p><p class=MsoNormal> } // if (msSync==1)</p><p class=MsoNormal> </p><p class=MsoNormal> if (!tlacStickPred && Tlacitko.stav) { // právě bylo stisknuto, vyvolat událost</p><p class=MsoNormal> Tlacitko.stisk();</p><p class=MsoNormal> }</p><p class=MsoNormal> tlacStickPred=Tlacitko.stav;</p><p class=MsoNormal> </p><p class=MsoNormal> __asm__("cli");</p><p class=MsoNormal> if (ms>=n) break;</p><p class=MsoNormal> __asm__("sei");</p><p class=MsoNormal> } // while(1)</p><p class=MsoNormal> __asm__("sei");</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>// implementace obsluhy události stisk tlačítka</p><p class=MsoNormal>void clTlac::stisk() { // ===================================================</p><p class=MsoNormal> static bool b=false;</p><p class=MsoNormal> </p><p class=MsoNormal> // zatímco v mainu se čekat musí, tady se naopak nesmí</p><p class=MsoNormal> if (b) {</p><p class=MsoNormal> Led.blikat(200, 100, 0);</p><p class=MsoNormal> } else {</p><p class=MsoNormal> Led.blikat(200, 60, 30);</p><p class=MsoNormal> }</p><p class=MsoNormal> b = !b;</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>int main(void) { // ###########################################################</p><p class=MsoNormal> </p><p class=MsoNormal> // tady nic neni: inicializace je v konstruktorech</p><p class=MsoNormal> </p><p class=MsoNormal> Led.blikat(100, 70, 20);</p><p class=MsoNormal> </p><p class=MsoNormal> while (1) { // ---------------------------------------------------</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> // je jedno co tu je, hlavně že to obsahuje čekání</p><p class=MsoNormal> cekej(100);</p><p class=MsoNormal> Tlacitko.cek();</p><p class=MsoNormal> </p><p class=MsoNormal> }</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>ISR (TCA0_OVF_vect) { // =====================================================</p><p class=MsoNormal> PORTB.OUTTGL = (1<<TEST_bit);</p><p class=MsoNormal> ms++;</p><p class=MsoNormal> msSync=1;</p><p class=MsoNormal> </p><p class=MsoNormal> TCA0_SINGLE_INTFLAGS = TCA_SINGLE_OVF_bm;</p><p class=MsoNormal>}</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Díky,</p><p class=MsoNormal>PH</p></div></body></html>