Inhoud 1 De Microcontroller 1.1 1.2 1.3 1.4 1.5 1.6 2 . . . . . . Hello World . . . . . . Het compilatietraject Compilers . . . . . . . Foutmeldingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variabelen, declaraties en initialisatie . . . . Datatypen . . . . . . . . . . . . . . . . . . . . . Samengestelde datatypen: arrays en strings Rekenkundige bewerkingen . . . . . . . . . . Afdrukken . . . . . . . . . . . . . . . . . . . . . Voorwaardelijke opdrachten . . . . . . . . . . Herhalingsopdrachten . . . . . . . . . . . . . . Voorbeelden . . . . . . . . . . . . . . . . . . . . 12 14 16 17 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Functies 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 1 4 6 7 8 9 11 C in het kort 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 4 Embedded Systemen . . . . . . . . . . . . . . . . . . . . . . . . . . . De architectuur van de microprocessor en de microcontroller Geheugens en geheugenstructuur . . . . . . . . . . . . . . . . . . Harvard-architectuur . . . . . . . . . . . . . . . . . . . . . . . . . . RISC en CISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De keuze voor een microcontroller . . . . . . . . . . . . . . . . . De taal C 2.1 2.2 2.3 2.4 3 1 Verdeel en heers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De opbouw van een functie . . . . . . . . . . . . . . . . . . . . . . Formele en actuele parameters . . . . . . . . . . . . . . . . . . . . De scope van functies en variabelen . . . . . . . . . . . . . . . . . Call by reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blokschema’s, stroomdiagrammen, pseudocode en algoritmes Voorbeeld: cijferprogramma . . . . . . . . . . . . . . . . . . . . . . Het verschil tussen == en = . . . . . . . . . . . . . . . . . . . . . . . Functies en programmeervaardigheden . . . . . . . . . . . . . . . 20 22 23 24 25 25 27 28 31 . . . . . . . . . 32 34 38 38 40 41 44 47 48 vi 5 In- en uitvoer 5.1 5.2 5.3 5.4 5.5 5.6 5.7 6 Commentaar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opmaak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Naamgeving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 90 91 93 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het if-statement: de if-vorm . . . . . De bloktoewijzing . . . . . . . . . . . Het if-statement: de if-else vorm . . Het nesten van if-statements . . . . . Het if-statement: de if-else-if vorm . Het switch-statement . . . . . . . . . Definities en macro’s . . . . . . . . . De conditionele operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De for-lus . . . . . . . . . . . . . . . . . . . . . . . . . De komma-operator . . . . . . . . . . . . . . . . . . De while-lus . . . . . . . . . . . . . . . . . . . . . . . De do-while-lus of do-lus . . . . . . . . . . . . . . . Het break-statement en het continue-statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Structuur en Opmaak 8.1 8.2 8.3 9 . . . . . 81 81 84 84 85 86 . . . . . . . Herhalingsopdrachten 7.1 7.2 7.3 7.4 7.5 8 . . . . . . . . 67 68 69 70 70 72 72 77 80 Geformatteerde uitvoer . . . . . . . . . . . . . . Geformatteerde invoer . . . . . . . . . . . . . . Voorbeeld: invoer gegevens cijferprogramma Ongeformatteerde in- en uitvoer . . . . . . . . Alternatief voor het invoerprobleem . . . . . Argumenten doorgeven aan een programma Declaratie en het gebruik van strings . . . . . Voorwaardelijke opdrachten 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 7 . . . . . . . 49 50 52 54 55 58 59 62 Datatypen en Operatoren 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12 9.13 9.14 9.15 9.16 Gehele getallen . . . . . . . . . . . . . . . . . . . . . Typecasting bij gehele getallen . . . . . . . . . . . Gebroken getallen . . . . . . . . . . . . . . . . . . . Typecasting bij gebroken getallen . . . . . . . . . Constanten bij gebroken getallen . . . . . . . . . Hexadecimaal, octaal en binair . . . . . . . . . . . Rekenkundige operatoren . . . . . . . . . . . . . . Het karaktertype char en de speciale karakters . Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . De relationele bewerkingen . . . . . . . . . . . . . Logische operatoren . . . . . . . . . . . . . . . . . . Bitbewerkingen . . . . . . . . . . . . . . . . . . . . . Verkorte schrijfwijze bij toekenningen . . . . . . Bewerkingsvolgorde operatoren . . . . . . . . . . Voorbeeld: afdrukken binaire waarden . . . . . . Meer over operatoren, datatypen en declaraties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 96 97 100 101 103 104 105 106 107 107 108 108 109 110 112 113 vii 10 Arrays 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 119 De getallen van Fibonacci en de Gulden Snede . . . . . . . . Berekenen getallen van Fibonacci en de Gulden Snede . . . Declaraties van arrays . . . . . . . . . . . . . . . . . . . . . . . . Toewijzingen bij arrays . . . . . . . . . . . . . . . . . . . . . . . Lezen buiten het bereik van een array . . . . . . . . . . . . . Schrijven buiten het bereik van een array . . . . . . . . . . . Meerdimensionale arrays . . . . . . . . . . . . . . . . . . . . . . De driehoek van Pascal . . . . . . . . . . . . . . . . . . . . . . . Berekening driehoek van Pascal en getallen van Fibonacci Dynamische geheugenallocatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Pointers 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.10 131 Declaraties van pointers . . . . . . . . . . . . . . . . . . . . . . . Toewijzingen met pointers . . . . . . . . . . . . . . . . . . . . . . Rekenen met pointers . . . . . . . . . . . . . . . . . . . . . . . . . Fouten met pointers . . . . . . . . . . . . . . . . . . . . . . . . . . Getallen van Fibonacci en Gulden Snede met pointers . . . . Toepassingen pointers . . . . . . . . . . . . . . . . . . . . . . . . . Voorbeelden met pointers . . . . . . . . . . . . . . . . . . . . . . Dynamische geheugenallocatie bij eendimensionale arrays . VLA: variable length array . . . . . . . . . . . . . . . . . . . . . . Dynamische geheugenallocatie bij tweedimensionale arrays . . . . . . . . . . . . . . . . . . . . 12 Strings 12.1 12.2 12.3 12.4 Declaratie van en toekenningen aan strings Op veilige wijze strings gebruiken . . . . . . Stringfuncties . . . . . . . . . . . . . . . . . . . Array van strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lezen en schrijven naar bestanden . . . . . . . . Recursie . . . . . . . . . . . . . . . . . . . . . . . . . Pointers naar functies . . . . . . . . . . . . . . . . Samengestelde datatypes . . . . . . . . . . . . . . Datastructuren . . . . . . . . . . . . . . . . . . . . Functies met een variabele argumentenlijst . . Preprocessoropdrachten of compiler directives De opbouw van de Xmega . . . . . . . . . De behuizing van de Xmega . . . . . . . . De geheugenorganisatie bij de Xmega . . De systeemklok en klokopties . . . . . . Het programmeren van de Xmega . . . . De ontwikkelomgeving voor de Xmega 152 154 155 157 159 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 De Xmega 14.1 14.2 14.3 14.4 14.5 14.6 132 132 133 134 135 138 139 141 142 144 151 13 Advanced C 13.1 13.2 13.3 13.4 13.5 13.6 13.7 119 121 122 123 123 124 124 127 127 130 159 168 176 177 181 185 186 189 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 193 194 196 197 198 viii 15 Generieke IO 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10 15.11 15.12 199 De schakeling voor Led Blink . . . . . . . . . . . . . . . . . . . . De software voor Led Blink . . . . . . . . . . . . . . . . . . . . . De generieke IO van de Xmega . . . . . . . . . . . . . . . . . . . De organisatie van de registers bij de Xmega: de Xmega-stijl De registers bij de verouderde ATmega-stijl . . . . . . . . . . . Bitbewerkingen en de read-write-modify-methode . . . . . . . Vertragingstijden en de macrodefinitie F_CPU . . . . . . . . . . De generieke IO als ingang gebruiken . . . . . . . . . . . . . . Het aan- en uitzetten van een led met een drukknop . . . . . Contactdender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hardwarematige antidendermaatregelen . . . . . . . . . . . . . Softwarematige antidendermaatregelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Interrupts 16.1 16.2 16.3 16.4 16.5 16.6 16.7 221 Het interruptmechanisme . . . . . . . . . . . . . . . . . . . . . . . . De interrupts en het interruptmechanisme bij de Xmega . . . . Een voorbeeld met externe interrupt 0 . . . . . . . . . . . . . . . . Timer/counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Een tijdvertraging maken met een timer/counter . . . . . . . . . Een antidenderalgoritme met een externe interrupt en TCE0 . . Groepsconfiguratie, groepsmasker, groepspositie, bitmasker en bitpositie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Displays 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 De ledbar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aansturing leds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Een tweedimensionale ledarray of dotmatrix . . . . . . . . . . Cijfers afbeelden op een dotmatrix . . . . . . . . . . . . . . . . Cijfers afbeelden op een dotmatrix met interrupt en timer . Cijfers afbeelden op een dotmatrix met de gegevens in flash Een 4-digit 7-segmentdisplay aansturen . . . . . . . . . . . . . . Het uitlezen van zes drukknoppen . . . . . . . . . . . . . . . . Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het aansluiten van een HD44780 op de Xmega . . . . . . . Het karaktergeoriënteerde display op basis van HD44780 . Toepassing LCD met 8-bit modus en tijdvertraging . . . . . Toepassing met bewegende tekst . . . . . . . . . . . . . . . . . Toepassing LCD met 4-bit modus en busy flag . . . . . . . . Toepassing met een LCD-bibliotheek . . . . . . . . . . . . . . Geformatteerd afdrukken op een LCD . . . . . . . . . . . . . Het weergeven van gebroken getallen op een LCD . . . . . 222 223 224 229 232 237 239 243 . . . . . . . . . . . . . . . . . . 18 Liquid Crystal Display 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 201 201 202 205 207 208 212 213 214 215 216 217 244 250 251 253 255 258 260 263 266 267 . . . . . . . . . . . . . . . . . . . . . . . . 268 270 277 279 280 283 286 287 ix 19 UART 19.1 19.2 19.3 19.4 19.5 19.6 19.7 19.8 19.9 19.10 19.11 19.12 Opbouw USART en het instellen van baudsnelheid . . . . . Instelling protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . Ontvangen en verzenden van data . . . . . . . . . . . . . . . . . Het versturen van karakters via USART1 van poort D . . . Het ontvangen, converteren en versturen van karakters . . . Toepassing met gebruik van een interrupt . . . . . . . . . . . . Het gebruik van een circulaire buffer . . . . . . . . . . . . . . . Circulaire buffers bij de communicatie met een UART . . . De USART-driver van Atmel en een bijbehorende wrapper Het versturen van getallen via de UART . . . . . . . . . . . . . Het creëren van een stream voor printf en scanf . . . . . . . . Een vaste stream voor USART0 van poort F . . . . . . . . . . 291 . . . . . . . . . . . . . . . . . . . . . . . . 20 Analog-to-Digital Converter 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8 20.9 20.10 20.11 20.12 323 Analoog-digitaalconversie . . . . . . . . . . . . . . . . . . . . . . . . 324 De opbouw van de ADC bij de Xmega . . . . . . . . . . . . . . . . 327 De conversiemethoden . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Fouten bij AD-conversie . . . . . . . . . . . . . . . . . . . . . . . . . 335 Toepassing: handmatige unsigned single-ended conversie . . . . 337 Toepassing: handmatige signed single-ended conversie . . . . . . . 341 Toepassing: handmatige conversie met differentiële modus . . . 344 Toepassing: differentiële conversie met behulp van een interrupt 345 Toepassing: differentiële conversie op vaste tijdstippen . . . . . . 347 Toepassing: differentiële conversie in de freerunningmodus . . 351 Kalibratie van de ADC . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Resumé ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 21 Seriële communicatie 21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.9 21.10 21.11 21.12 353 SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Toepassing: aansturing van een extern EEPROM via de SPI . Toepassing: aansturing van een schuifregister via een SPI . . . De USART als SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . I 2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I2C of TWI voor de Xmega . . . . . . . . . . . . . . . . . . . . . . Eenvoudige I2C-bibliotheek voor de Xmega in mastermodus Toepassing: eenvoudige I2C-bibliotheek bij een DS3232 . . . . Levelshifting voor I2C . . . . . . . . . . . . . . . . . . . . . . . . . De TWI-masterdriver van Atmel . . . . . . . . . . . . . . . . . . . De TWI-slavedriver van Atmel . . . . . . . . . . . . . . . . . . . . Resumé TWI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Pulsbreedtemodulatie 22.1 22.2 22.3 22.4 22.5 293 296 297 298 300 301 303 305 307 314 314 319 De timer/counters van de Xmega . . . . . . . . . . . . . . . . . Bespreking PWM-mogelijkheden . . . . . . . . . . . . . . . . . De single-slope-modus: intensiteitsregeling voor een led . . . De single-slope-modus: intensiteitsregeling voor een rgb-led De dual-slope-modus: een robotwagen met DC-motoren . . 354 357 359 362 364 366 367 370 374 375 378 382 383 . . . . . . . . . . 385 387 394 395 397 x 22.6 22.7 22.8 De dual-slope-modus: aansturing servomotor . . . . . . . . . . . 401 AWeX: advanced waveform extension . . . . . . . . . . . . . . . . 403 De frequentiemodus: het afspelen van muziek . . . . . . . . . . . 404 23 Nog meer Xmega 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 23.10 23.11 23.12 Digitaal-analoogconverter . . . . . . . . . . . . . . . . . . Direct Memory Access . . . . . . . . . . . . . . . . . . . . Analoge comparator . . . . . . . . . . . . . . . . . . . . . . Input capture . . . . . . . . . . . . . . . . . . . . . . . . . . Het kloksysteem van de Xmega . . . . . . . . . . . . . . De realtime-counter . . . . . . . . . . . . . . . . . . . . . . Het EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De slaapstanden . . . . . . . . . . . . . . . . . . . . . . . . . De mogelijkheden om de Xmega256a3u te herstarten Watchdog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het atomic block . . . . . . . . . . . . . . . . . . . . . . . . 409 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 415 420 427 435 439 441 445 448 451 452 455 Bijlagen A Stroomdiagrammen 457 B 463 RS232 C JTAG 469 D SD-kaart 473 E Draadloze module 479 F CMOS 489 G Headerbestanden 503 H Application notes 511 I ASCII 513 J Xmega-bord 515 Index 519