Warning, /sdk/ktechlab/po/nl/docs/ktechlab/microbe.docbook is written in an unsupported language. File is not indexed.
0001 <!-- kate: tab-width 2; indent-mode xml; --> 0002 <chapter id="microbe"> 0003 <title 0004 >µbe;</title> 0005 <sect1> 0006 <title 0007 >Inleiding en algemene syntaxis</title> 0008 <para 0009 ><application 0010 >Microbe</application 0011 > compileert programma's geschreven in de speciale taal voor PICs, en is een programma dat bij &ktechlab; hoort. De syntax is ontworpen voor een &flowcode; programma. De syntax voor het opstarten van <command 0012 >microbe</command 0013 > vanaf de commandoregel is: <programlisting 0014 >microbe [options] [input.microbe] [output.asm]</programlisting 0015 > waarbij de opties zijn: </para> 0016 <itemizedlist> 0017 <listitem 0018 ><para 0019 ><function 0020 >--show-source</function 0021 > - Voegt elke regel van de µbe; broncode als commentaar toe aan de assembly uitvoer voor de assembly instructies zelf in die regel.</para 0022 ></listitem> 0023 <listitem 0024 ><para 0025 ><function 0026 >--no-optimize</function 0027 > - Voorkomt optimalisatie van de uit de broncode gegenereerde instructies. Optimalisatie is normaal gesproken veilig, en daarom wordt deze optie hoofdzakelijk gebruikt bij debugging.</para 0028 ></listitem> 0029 </itemizedlist> 0030 0031 <para 0032 >Het .microbe invoer-bestand moet de PIC identificeren door de PIC-naam aan het begin van het .microbe bestand te plaatsen; ⪚ de naam van een PIC16F84 is "P16F84". <example 0033 ><title 0034 >Eenvoudig compleet µbe; programma</title> 0035 <programlisting role="correct" 0036 >P16F84 0037 0038 a = 0 0039 repeat 0040 { 0041 PORTA = a 0042 a = a + 1 0043 } 0044 until a == 5 0045 0046 end</programlisting> 0047 </example> 0048 </para> 0049 0050 <sect2 id="namingconventions"> 0051 <title 0052 >Naamconventies</title> 0053 <para 0054 >De volgende regels zijn van toepassing op namen van variabelen en labels: <itemizedlist> 0055 <listitem 0056 ><para 0057 >Ze kunnen alleen alfanumerieke tekens [a..z][A..Z][0..9] bevatten en de underscore "_".</para 0058 ></listitem> 0059 <listitem 0060 ><para 0061 >Ze zijn hoofdlettergevoelig.</para 0062 ></listitem> 0063 <listitem 0064 ><para 0065 >Ze mogen niet met een cijfer beginnen.</para 0066 ></listitem> 0067 <listitem 0068 ><para 0069 >Ze zouden niet mogen beginnen met <quote 0070 >__</quote 0071 > (dubbele underscore), omdat dit gereserveerd wordt voor gebruik door de compiler.</para 0072 ></listitem> 0073 </itemizedlist> 0074 </para> 0075 </sect2> 0076 0077 <sect2 id="bracingconventions"> 0078 <title 0079 >Conventies voor haakjes</title> 0080 <para 0081 >Accolades, {}, geven de start en het eind van een code block aan. U kunt ze overal voor de start en achter het eind van een code block plaatsen. Voorbeelden van acceptabele code blocks: <programlisting role="correct" 0082 >statement1 { 0083 enige code 0084 }</programlisting> 0085 <programlisting role="correct" 0086 >statement2 { 0087 andere code }</programlisting> 0088 0089 <programlisting role="correct" 0090 >statement3 0091 { 0092 andere code 0093 }</programlisting> 0094 0095 <programlisting role="correct" 0096 >statement5 { 0097 codeblok 0098 } statement6</programlisting> 0099 </para> 0100 </sect2> 0101 <sect2 id="commenting"> 0102 <title 0103 >Commentaar</title> 0104 <para 0105 >Commentaar plaatsten gaat zoals bij C. // maakt van de rest van de regel commentaar. /* en */ geeft een meerregelige commentaar aan. <programlisting role="correct" 0106 >// dit is een commentaar 0107 x = 2 0108 /* En dit is 0109 meerregelig commentaar */</programlisting> 0110 </para> 0111 </sect2> 0112 0113 <sect2 id="structure"> 0114 <title 0115 >Programma structuur</title> 0116 <para 0117 >U moet de PIC id aan het begin van het programma toevoegen. Het eind van het hoofdprogramma geeft u aan met <quote 0118 >end</quote 0119 >. Subroutines moet u achter <quote 0120 >end</quote 0121 > plaatsen. </para> 0122 </sect2> 0123 0124 <sect2 id="subroutines"> 0125 <title 0126 >Subroutines</title> 0127 <para 0128 >U kunt van elke plaats in de code een subroutine aanroepen. Syntax: </para> 0129 <programlisting role="correct" 0130 >sub SubName 0131 { 0132 // Code... 0133 }</programlisting> 0134 <para 0135 >De subroutine roept u aan met <quote 0136 >call <replaceable 0137 >SubName</replaceable 0138 ></quote 0139 >.</para> 0140 </sect2> 0141 </sect1> 0142 0143 <sect1 id="languagereference"> 0144 <title 0145 >Referentie µbe; taal</title> 0146 <sect2 id="if"> 0147 <title 0148 >if</title> 0149 <para 0150 >Conditionele tweesprong. Syntax: <programlisting role="correct" 0151 >if [expression] then [statement]</programlisting 0152 > of <programlisting role="correct"> 0153 if [expression] then 0154 { 0155 [statement block] 0156 }</programlisting 0157 > Vergelijkbaar met else: <programlisting role="correct" 0158 >else [statement]</programlisting 0159 > of <programlisting role="correct" 0160 >else 0161 { 0162 [statement block] 0163 }</programlisting> 0164 </para> 0165 0166 <example 0167 ><title 0168 >if</title> 0169 <programlisting role="correct" 0170 >if porta.0 is high then 0171 { 0172 delay 200 0173 } 0174 else 0175 { 0176 delay 300 0177 }</programlisting> 0178 </example> 0179 </sect2> 0180 0181 <sect2 id="alias"> 0182 <title 0183 >alias</title> 0184 <para 0185 >Vervangt een tekenreeks door een ander als alias. Syntax: <programlisting role="correct" 0186 >alias [from] [to]</programlisting> 0187 </para> 0188 </sect2> 0189 0190 <sect2 id="repeat"> 0191 <title 0192 >repeat</title> 0193 <para 0194 >Herhaalt het uitvoeren van het statement block uit totdat de expressie waar is. De controle of de expressie waar is, wordt na het statement block uitgevoerd, daarom zal de statement block altijd tenminste een keer worden uitgevoerd. Syntax: <programlisting role="correct" 0195 >repeat 0196 { 0197 [statement block] 0198 } 0199 until [expression]</programlisting> 0200 </para> 0201 </sect2> 0202 0203 <sect2 id="while"> 0204 <title 0205 >while</title> 0206 <para 0207 >Vergelijkbaar met repeat, dit herhaalt het uitvoeren van het statement block uit. Maar de controle of de expressie waar is wordt voor de de uitvoer gedaan, niet daarna. daarom zal als uitkomst van de controle op de expressie negatief is, de statement nooit worden uitgevoerd. Syntax: <programlisting role="correct" 0208 >while [expression] 0209 { 0210 [statement block] 0211 }</programlisting> 0212 </para> 0213 </sect2> 0214 0215 0216 <sect2 id="goto"> 0217 <title 0218 >goto</title> 0219 <para 0220 >Dit zorgt dat het programma verdergaat met de volgende statement na het opgeven label. Goto syntax: <programlisting role="correct" 0221 ><function 0222 >goto</function 0223 > [labelname]</programlisting 0224 > Label syntax: <programlisting role="correct" 0225 ><function 0226 >labelname:</function 0227 ></programlisting 0228 > Het vermijden van het gebruik van goto wordt vaak als goed programmeren gezien. Het gebruik van control statements en subroutines zal resulteren in een beter leesbaar programma. </para> 0229 0230 <example 0231 ><title 0232 >goto</title> 0233 <programlisting role="correct" 0234 >goto MyLabel 0235 0236 ... 0237 0238 [MyLabel]: 0239 // Code gaat verder op dit punt</programlisting> 0240 </example> 0241 </sect2> 0242 0243 <sect2 id="call"> 0244 <title 0245 >call</title> 0246 <para 0247 >Roept een subroutine aan. Syntax: <programlisting role="correct" 0248 ><function 0249 >call</function 0250 > [SubName]</programlisting 0251 > waarbij <replaceable 0252 >SubName</replaceable 0253 > de naam van de subroutine is die u aanroept. </para> 0254 </sect2> 0255 0256 <sect2 id="delay"> 0257 <title 0258 >delay</title> 0259 <para 0260 >Dit veroorzaakt dat het uitvoeren van de code voor de opgeven periode stopt. De interval is in millisecondes. Syntax: <programlisting role="correct" 0261 ><function 0262 >delay</function 0263 > [interval]</programlisting> 0264 0265 <note 0266 ><para 0267 >Op dit moment, wordt door µbe; aangenomen dat de PIC werkt met een kloksnelheid van 4MHz - &ie; elke instructie heeft 1 microseconde nodig om verwerkt te worden. Als dat niet het geval is, dan moet u de interval proportioneel aanpassen.</para 0268 ></note> 0269 </para> 0270 </sect2> 0271 0272 <sect2 id="sevenseg"> 0273 <title 0274 >sevenseg</title> 0275 <para 0276 >Dit wordt gebruikt voor het definiëren van de pinbezetting van een (common cathode) zeven segment display verbonden met de PIC. Syntax: <programlisting role="correct" 0277 ><function 0278 >sevenseg</function 0279 > [name] [a] [b] [c] [d] [e] [f] [g]</programlisting 0280 > waar [a]...[g] de pinnen van de PIC zijn waarmee de respectievelijke segmenten van de zeven segment display zijn verbonden. De pinnen kunnen zowel als PORTX.N of RXN worden geschreven. </para> 0281 0282 <para 0283 >Bij het tonen van een cijfer op de zeven segment, wordt de pin bezetting behandelt als een alleen lezen variabele. <example> 0284 <title 0285 >Een uitvoer naar een zeven segment definiëren</title> 0286 <programlisting role="correct" 0287 >sevenseg seg1 RB0 RB1 RB2 RB3 RB4 RB5 RB6 0288 seg1 = x + 2</programlisting> 0289 </example> 0290 </para> 0291 </sect2> 0292 0293 <sect2 id="keypad"> 0294 <title 0295 >toetsenbordje</title> 0296 <para 0297 >Dit gebruikt u om de pinnen van een PIC te definiëren waaraan een toetsenbordje is verbonden. Syntax: <programlisting role="correct" 0298 ><function 0299 >keypad</function 0300 > [name] [rij 1] ... [rij 4] [colum 1] ... [colum n]</programlisting 0301 > waar [rij 1] ... [rij 4] en [colum 1] ... [colum n] de pinnen van de PIC zijn waaraan de respectievelijke rijen en kolommen van het toetsenbordje zijn verbonden (op dit moment kunt u het aantal rijen niet wijzigen). zie <xref linkend="sevenseg"/> (hierboven) voor meer informatie over pin bezetting. </para> 0302 0303 <para 0304 >U moet de kolommen van het toetsenbord met 100k weerstanden omlaag trekken naar aarde. U moet de pinnen van de rijen als uitgang configureren en de pinnen van de kolommen als ingangen. Nadat het toetsenbordje is gedefinieerd, wordt het behandelt als een read only variabel. <example> 0305 <title 0306 >Een toetsenbord definiëren en uitlezen</title> 0307 <programlisting role="correct" 0308 >keypad keypad1 RB0 RB1 RB2 RB3 RB4 RB5 RB6 0309 x = keypad1</programlisting> 0310 </example> 0311 </para> 0312 0313 <para 0314 >De waarden die u van een toetsenbord inleest zijn standaard: <itemizedlist 0315 > <listitem 0316 ><para 0317 >De waarde van het getal als het numerieke toets is (1 tot 3 voor de bovenste rij; hexadecimal A tot D langs de vierde kolom omlaag en verder voor elke extra kolom).</para 0318 ></listitem 0319 > <listitem 0320 ><para 0321 >253 voor de toets in rij 4, kolom 1.</para 0322 ></listitem 0323 > <listitem 0324 ><para 0325 >254 voor de toets in rij 4, kolom 3.</para 0326 ></listitem 0327 > </itemizedlist 0328 > U kunt deze waarden herdefiniëren door gebruik van het alias commando, waarbij de naam van de toets in rij x, kolom y (rijen en kolommen starten bij 1), is Keypad_x_y. Bijvoorbeeld, om de ster toets op een 4x3 toetsenbord de waarde nul te geven, moet u de volgende alias gebruiken: <example> 0329 <title 0330 >De toets van een toetsenbord vervangen door een waarde</title> 0331 <programlisting role="correct" 0332 >alias Keypad_4_1 0</programlisting> 0333 </example> 0334 </para> 0335 </sect2> 0336 </sect1> 0337 0338 <sect1 id="picio"> 0339 <title 0340 >PIC I/O</title> 0341 0342 <sect2 id="tristate"> 0343 <title 0344 >Poort richting</title> 0345 <para 0346 >De poort richting stelt u in door een waarde toe te kennen aan TRIS*, waar * de poortletter is. Als voorbeeld: </para> 0347 <example 0348 ><title 0349 >Poort richtingen instellen</title> 0350 <programlisting role="correct" 0351 >TRISB = b'01111001'</programlisting> 0352 </example> 0353 <para 0354 >Dit hierboven stelt de pinnen RB1, RB2 en RB7 op PORTB in als uitgangen, en de andere pinnen op PORTB als ingangen. In dit voorbeeld is b'01111001' een binaire representatie van het output type. De 1 aan de rechterkant stelt een uitgang op RB0 voor, en de 0 aan de linkerkant stelt een ingang op RB7 voor. </para> 0355 </sect2> 0356 0357 <sect2 id="ports"> 0358 <title 0359 >Port I/O</title> 0360 <para 0361 >U kunt een poort behandelen alsof het een variabele is. Bijvoorbeeld: </para> 0362 0363 <example 0364 ><title 0365 >Naar een poort schrijven</title> 0366 <programlisting role="correct" 0367 >x = PORTA</programlisting> 0368 </example> 0369 0370 <para 0371 >Dit hierboven koppelt de waarde van PORTA aan de variabele x. </para> 0372 </sect2> 0373 0374 <sect2 id="pins"> 0375 <title 0376 >Pin I/O</title> 0377 <para 0378 >De pin van een poort kunt u krijgen door het pinnummer vooraf te laten gaan door de naam van de poort; ⪚ Pin 2 (startend van Pin 0) van PORTA is bekend als <emphasis 0379 >PORTA.0</emphasis 0380 >. De syntax voor het instellen van de status van een pin is: <programlisting role="correct" 0381 >PORTX.N = <emphasis 0382 >STATE</emphasis 0383 ></programlisting 0384 > waar <emphasis 0385 >STATE</emphasis 0386 > kan zijn <emphasis 0387 >hoog</emphasis 0388 > of <emphasis 0389 >laag</emphasis 0390 >. De syntax voor het testen van de status van een pin is: <programlisting role="correct" 0391 ><function 0392 >if</function 0393 > PORTX.N is <emphasis 0394 >STATE</emphasis 0395 > <function 0396 >then</function 0397 ></programlisting 0398 > Door deze voorbeelden te combineren krijgen we: </para> 0399 <example 0400 ><title 0401 >Testen en instellen van de pin-status</title> 0402 <programlisting role="correct" 0403 >TRISA = 0 0404 TRISB = 255 0405 <function 0406 >if</function 0407 > PORTA.3 is <function 0408 >high</function 0409 > <function 0410 >then</function> 0411 { 0412 PORTB.5 = <function 0413 >low</function> 0414 } 0415 <function 0416 >else</function> 0417 { 0418 PORTB = PORTA + 15 0419 }</programlisting> 0420 </example> 0421 </sect2> 0422 </sect1> 0423 0424 <sect1 id="variables"> 0425 <title 0426 >Variabelen</title> 0427 <para 0428 >Alle variabelen zijn 8-bit unsigned integers, in de range van 0 tot 255. <application 0429 >µbe;</application 0430 > ondersteund de standaard bewerkingen met maar een variabele en binaire bewerkingen (werkend met twee variabelen) die door de PIC kunnen worden uitgevoerd. Daarnaast ondersteund µbe; ook delen en vermenigvuldigen. </para> 0431 <sect2 id="unary"> 0432 <title 0433 >Bewerkingen met één variabele</title> 0434 <para> 0435 <itemizedlist> 0436 <listitem 0437 ><para 0438 ><emphasis 0439 >rotateleft x</emphasis 0440 > - Verschuift de bits van variabele X naar links, waarbij de bit die links eraf valt weer rechts wordt toegevoegd.</para 0441 ></listitem> 0442 <listitem 0443 ><para 0444 ><emphasis 0445 >rotateright x</emphasis 0446 > - Verschuift de bits van variabele X naar rechts, waarbij de bit die rechts eraf valt weer links wordt toegevoegd.</para 0447 ></listitem> 0448 <listitem 0449 ><para 0450 ><emphasis 0451 >increment x</emphasis 0452 > - Verhoogt de variabele x met 1. Als x de waarde van 255 heeft, dan klapt x om naar 0.</para 0453 ></listitem> 0454 <listitem 0455 ><para 0456 ><emphasis 0457 >decrement x</emphasis 0458 > - Vermindert de variabele x met 1. Als x de waarde van 0 heeft, dan klapt x om naar 255.</para 0459 ></listitem> 0460 </itemizedlist> 0461 </para> 0462 </sect2> 0463 0464 <sect2 id="arithmetic"> 0465 <title 0466 >Rekenen</title> 0467 <para 0468 >Ondersteunde bewerkingen: <itemizedlist> 0469 <listitem 0470 ><para 0471 ><emphasis 0472 >Optellen:</emphasis 0473 > x + y</para 0474 ></listitem> 0475 <listitem 0476 ><para 0477 ><emphasis 0478 >Aftrekken:</emphasis 0479 > x - y</para 0480 ></listitem> 0481 <listitem 0482 ><para 0483 ><emphasis 0484 >Vermenivuldigen:</emphasis 0485 > x * y</para 0486 ></listitem> 0487 <listitem 0488 ><para 0489 ><emphasis 0490 >Delen:</emphasis 0491 > x / y</para 0492 ></listitem> 0493 <listitem 0494 ><para 0495 ><emphasis 0496 >Binaire XOR:</emphasis 0497 > x XOR y</para 0498 ></listitem> 0499 <listitem 0500 ><para 0501 ><emphasis 0502 >Binaire AND:</emphasis 0503 > x AND y</para 0504 ></listitem> 0505 <listitem 0506 ><para 0507 ><emphasis 0508 >Binaire OR:</emphasis 0509 > x OR y</para 0510 ></listitem> 0511 </itemizedlist> 0512 </para> 0513 </sect2> 0514 0515 <sect2 id="comparison"> 0516 <title 0517 >Vergelijken</title> 0518 <para 0519 >Ondersteunde bewerkingen: </para> 0520 <itemizedlist> 0521 <listitem 0522 ><para 0523 ><emphasis 0524 >Is gelijk aan:</emphasis 0525 > x == y</para 0526 ></listitem> 0527 <listitem 0528 ><para 0529 ><emphasis 0530 >Is niet gelijk aan:</emphasis 0531 > x != y</para 0532 ></listitem> 0533 <listitem 0534 ><para 0535 ><emphasis 0536 >Is groter dan:</emphasis 0537 > x 0538 > y</para 0539 ></listitem> 0540 <listitem 0541 ><para 0542 ><emphasis 0543 >Is kleiner dan:</emphasis 0544 > x < y</para 0545 ></listitem> 0546 <listitem 0547 ><para 0548 ><emphasis 0549 >Is groter of gelijk aan:</emphasis 0550 > x >= y</para 0551 ></listitem> 0552 <listitem 0553 ><para 0554 ><emphasis 0555 >Is kleiner of gelijk aan:</emphasis 0556 > x <= y</para 0557 ></listitem> 0558 </itemizedlist> 0559 0560 <para 0561 >Bijvoorbeeld: </para> 0562 <example 0563 ><title 0564 >Vergelijken</title> 0565 <programlisting role="correct" 0566 ><function 0567 >if</function 0568 > PORTA 0569 >= 5 <function 0570 >then</function> 0571 { 0572 ... 0573 }</programlisting> 0574 </example> 0575 </sect2> 0576 </sect1> 0577 0578 <!-- 0579 <sect1 id="interrupts"> 0580 <title 0581 >Interrupts</title> 0582 <para> 0583 There are several types of events, and some of these take an optional parameter making 0584 the condition under which the routine is called more specific. 0585 <itemizedlist> 0586 <listitem 0587 ><para 0588 ><emphasis 0589 >change <pin name></emphasis> 0590 - Occurs when the state of the specified pin changes. Pin name is in the usual syntax of PORTX.n, ⪚ <programlisting 0591 >interrupt change PORTB.4</programlisting 0592 ></para 0593 ></listitem> 0594 <listitem 0595 ><para 0596 ><emphasis 0597 >timer</emphasis 0598 > - ///TODO</para 0599 ></listitem> 0600 <listitem 0601 ><para 0602 ><emphasis 0603 >external</emphasis 0604 > - ///TODO</para 0605 ></listitem> 0606 </itemizedlist> 0607 </para> 0608 </sect1> 0609 --> 0610 </chapter>