AVR
hardware en C-programmering in de praktijk
Door Florian Schäffer
Uitgegeven door Elektor International Media BV
Inhoudsopgave
- 1 Inleiding tot de microcontrollertechniek (pagina 13)
- 1.1 Toepassingsgebieden van microcontrollers (pagina 14)
- 1.2 Wat is een microcontroller? (pagina 16)
- 1.2.1 Microcontroller-geheugen (pagina 18)
- 1.2.2 De RISC-architectuur (pagina 19)
- 1.3 De juiste controller op de juiste plaats (pagina 20)
- 1.3.1 Omvang van de instructieset (pagina 21)
- 1.3.2 Snelheid (pagina 22)
- 1.3.3 Functionaliteit van de geïntegreerde hardware (pagina 23)
- 1.3.4 Prijs en verkrijgbaarheid (pagina 24)
- 1.3.5 De behuizing (pagina 25)
- 1.3.6 Grootte van het geheugen (pagina 26)
- 1.3.7 Kwaliteit van de documentatie (pagina 27)
- 1.3.8 Acceptatie door andere gebruikers (pagina 28)
- 1.3.9 Beschikbaarheid van ontwikkeltools (pagina 29)
- 1.4 Kies de juiste Atmel AVR (pagina 30)
- 2 De ontwikkelomgeving (pagina 33)
- 2.1 De voeding (pagina 34)
- 2.1.1 Standaardvoeding (pagina 35)
- 2.1.2 Automobiele voeding (pagina 37)
- 2.1.3 Brownout-detectie (pagina 39)
- 2.2 De programmeeradapter (pagina 40)
- 2.2.1 ISP-aansluiting (pagina 42)
- 2.2.2 Een very-low-cost programmeeradapter (pagina 44)
- 2.2.3 STK200-compatibele programmeeradapter (pagina 45)
- 2.2.4 Seriële programmeeradapter (pagina 46)
- 2.3 De C-compiler WinAVR (pagina 46)
- 2.3.1 Installatie van WinAVR (pagina 47)
- 2.3.2 De editor Programmers Notepad (pagina 49)
- 2.4 De programmeersoftware (pagina 51)
- 2.4.1 PonyProg (pagina 51)
- 2.4.2 yaap (pagina 52)
- 2.4.3 avrdude (pagina 54)
- 2.4.4 AVR8 Burn-O-Mat (pagina 54)
- 2.5 Branden en debuggen via JTAG (pagina 55)
- 2.5.1 De JTAG-interface (pagina 56)
- 2.5.2 AVR Studio (pagina 59)
- 2.5.3 Programmering van de JTAG-interface (pagina 59)
- 2.5.4 JTAG-testproject (pagina 62)
- 2.1 De voeding (pagina 34)
- 3 Eerste experimenten met de µC (pagina 69)
- 3.1 Minimalistische µC (pagina 69)
- 3.1.1 Uitweiding: buffercondensator (pagina 71)
- 3.1.2 Uitweiding: klokgenerator (pagina 73)
- 3.2 Compilatie van uw eerste programma (pagina 76)
- 3.2.1 Uitweiding: compiler en MAKEFILE (pagina 79)
- 3.3 Programmeren van de microcontroller (pagina 83)
- 3.3.1 yaap (pagina 83)
- 3.3.2 AVR8 Burn-O-Mat (pagina 85)
- 3.3.3 Aanroep van avrdude vanuit de editor (pagina 86)
- 3.4 Configuratie: Fuse Bits en Security Bits (pagina 88)
- 3.4.1 De belangrijkste Fuse Bits (pagina 88)
- 3.4.2 Het Fuse Bit-rampenlan (pagina 96)
- 3.4.3 Uw software beveiligen met Lock Bits (pagina 97)
- 3.1 Minimalistische µC (pagina 69)
- 4 Het Mini-Mega-board (pagina 103)
- 4.1 Opbouw van het Mini-Mega-board (pagina 104)
- 4.1.1 Eenvoudig en veelzijdig (pagina 104)
- 4.1.2 Alles aan boord (pagina 105)
- 4.2 In System Programming (pagina 107)
- 4.2.1 Standaard Fuse Bits (pagina 109)
- 4.2.2 Verbetering van de leesbaarheid van de code (pagina 110)
- 4.1 Opbouw van het Mini-Mega-board (pagina 104)
- 5 De beginselen van in- en uitvoer (pagina 113)
- 5.1 Standaardbibliotheken en het aansturen van LED's (pagina 114)
- 5.1.1 LED's op de microcontroller aansluiten (pagina 115)
- 5.1.2 Register-constanten uit de I/O-standaardbibliotheek (pagina 116)
- 5.1.3 Nogmaals de AVR Libc (pagina 118)
- 5.1.4 De uitvoering van het programma vertragen (pagina 118)
- 5.1.5 Heeltallige datatypen (integers) (pagina 121)
- 5.1.6 Bitmanipulatie en data-uitvoer (pagina 122)
- 5.2 Zeven-segment- en alfanumerieke displays (pagina 129)
- 5.2.1 Gemeenschappelijke anode of kathode (pagina 130)
- 5.2.2 Aansturing van zeven-segment-displays (pagina 131)
- 5.2.3 Alfanumerieke LED-displays (pagina 133)
- 5.3 Aansturen van zwaardere belastingen (pagina 138)
- 5.3.1 Transistoren voor kleine belastingen (pagina 138)
- 5.3.2 Power-MOSFET's voor zwaardere belastingen (pagina 139)
- 5.3.3 Oud maar niet verouderd: relais (pagina 140)
- 5.3.4 Galvanische scheiding met optocouplers (pagina 142)
- 5.4 Signaalingangen (pagina 144)
- 5.4.1 Pullup of pulldown (pagina 144)
- 5.4.2 Ingangsniveaus inlezen (pagina 145)
- 5.4.3 Problemen met contactdender (pagina 148)
- 5.5 Multiplexen spaart aansluitingen (pagina 149)
- 5.5.1 Multiplexen van zeven-segment-displays (pagina 150)
- 5.5.2 Opsplitsen van getallen (pagina 153)
- 5.5.3 Multiplexen met een timer (pagina 154)
- 5.5.4 Uitweiding: schuifregister (pagina 157)
- 5.5.5 5x7-matrix met schuifregister (pagina 158)
- 5.5.6 Tekst op het matrix-display (pagina 162)
- 5.1 Standaardbibliotheken en het aansturen van LED's (pagina 114)
- 6 Vloeibaar-kristaldisplays (pagina 165)
- 6.1 HD44780-compatibel (pagina 165)
- 6.1.1 Aansluiting van LCD's (pagina 166)
- 6.1.2 Geheugenindeling (pagina 167)
- 6.1.3 De HD44780-instructieset (pagina 168)
- 6.2 Gebruik van het LC-display (pagina 169)
- 6.2.1 Initialisering van de 4-bit-modus (pagina 169)
- 6.2.2 Displayconfiguratie (pagina 172)
- 6.2.3 Uitvoer van tekens (pagina 173)
- 6.2.4 Uitvoer van getallen (pagina 174)
- 6.3 Definiëren van eigen tekens (pagina 178)
- 6.3.1 Tekendefinitie (pagina 178)
- 6.3.2 Extra grote cijfers (pagina 179)
- 6.1 HD44780-compatibel (pagina 165)
- 7 Seriële data-overdracht (pagina 181)
- 7.1 RS232-interface (pagina 181)
- 7.2 Configuratieregister van de USART (pagina 183)
- 7.2.1 Software-UART (pagina 185)
- 7.3 Data zenden en ontvangen (pagina 186)
- 7.3.1 Handshaking ter voorkoming van misverstanden (pagina 187)
- 8 Analoge in- en uitvoer (pagina 189)
- 8.1 Resolutie en ingangsschakeling van de ADC (pagina 189)
- 8.1.1 Spanningsdeler (pagina 190)
- 8.1.2 Berekening van de ingangsspanning (pagina 191)
- 8.1.3 Referentiespanning (pagina 191)
- 8.2 A/D-omzetting in de praktijk (pagina 192)
- 8.2.1 Configuratie van de ADC (pagina 192)
- 8.2.2 Enkele praktische tips (pagina 193)
- 8.3 Temperatuurmeting (pagina 194)
- 8.4 Toevalsgenerator (pagina 196)
- 8.5 Digitaal-analoog-omzetter (pagina 197)
- 8.5.1 Digitale functiegenerator (pagina 200)
- 8.1 Resolutie en ingangsschakeling van de ADC (pagina 189)
- 9 Programmasturing met interrupts (pagina 205)
- 9.1 Waar komen de interrupts vandaan? (pagina 206)
- 9.1.1 Interruptafhandeling (pagina 207)
- 9.1.2 Interrupts activeren (pagina 209)
- 9.2 Externe IRQ's verwerken (pagina 210)
- 9.2.1 Uitweiding: volatile (pagina 212)
- 9.2.2 Atomaire datatoegang (pagina 214)
- 9.3 Een waakhond tegen programmeerfouten (pagina 216)
- 9.3.1 De waakhond gebruiken (pagina 217)
- 9.1 Waar komen de interrupts vandaan? (pagina 206)
- 10 Timers en counters (pagina 221)
- 10.1 De werking van een timer (pagina 222)
- 10.1.1 Bitbreedte en interrupt van de timer (pagina 222)
- 10.1.2 Kloksignaal en prescaler (pagina 223)
- 10.2 De timers van de ATmega16 (pagina 224)
- 10.2.1 Overflow met 8-bit-timer 0 (pagina 224)
- 10.2.2 Timer 0 met preset (pagina 226)
- 10.2.3 Timer 0 met vergelijkswaarde (pagina 227)
- 10.2.4 De CTC-modus van timer 0 (pagina 229)
- 10.2.5 Timer 0 als signaalgenerator (pagina 230)
- 10.2.6 Externe impulsen tellen met timer 0 (pagina 231)
- 10.2.7 Even voorstellen: 8-bit timer 2 (pagina 233)
- 10.2.8 Een stopwatch met 16-bit timer 1 (pagina 235)
- 10.3 Pulsbreedtemodulatie (pagina 239)
- 10.3.1 Softwarematige PWM (pagina 240)
- 10.3.2 Fast PWM met timer 0 (pagina 242)
- 10.3.3 Timer 1: Fast PWM met willekeurige frequentie (pagina 244)
- 10.1 De werking van een timer (pagina 222)
- 11 Geheugenoperaties (pagina 247)
- 11.1 Toegang tot het programmageheugen (flash) (pagina 247)
- 11.1.1 String-arrays in het flash-geheugen opslaan (pagina 249)
- 11.2 Toegang tot het EEPROM (pagina 251)
- 11.2.1 EEPROM-imagebestand (pagina 254)
- 11.2.2 Geheugenoperaties met drijvende-komma-getallen (pagina 255)
- 11.1 Toegang tot het programmageheugen (flash) (pagina 247)
- 12 De seriële databus I²C (TWI) en SPI (pagina 259)
- 12.1 Two-Wire Interface I²C (pagina 259)
- 12.1.1 De werking van de I²C-bus (pagina 260)
- 12.1.2 Adressering van de slaves (pagina 261)
- 12.1.3 Het I²C-busprotocol (pagina 261)
- 12.2 Aansturing van een EEPROM via TWI (pagina 262)
- 12.2.1 Het standaard geheugen-IC 24Cxx (pagina 263)
- 12.2.2 TWI en het Mini-Mega-board (pagina 267)
- 12.3 De Serial Peripheral Interface (SPI) (pagina 274)
- 12.3.1 SPI tussen een ATmega16 en een ATmega8 (pagina 275)
- 12.1 Two-Wire Interface I²C (pagina 259)
- 13 Voorbeeldprojecten (pagina 281)
- 13.1 Radioklok met DCF77-ontvanger (pagina 281)
- 13.1.1 De opbouw van het tijdsignaal (pagina 282)
- 13.1.2 De vorm van het tijdsignaal (pagina 284)
- 13.1.3 De ontvangermodule (pagina 284)
- 13.1.4 Voorbeeldapplicatie (pagina 285)
- 13.2 Global Positioning System (pagina 286)
- 13.2.1 GPS-ontvangers (pagina 286)
- 13.2.2 Aansluiten van de GPS-ontvanger (pagina 288)
- 13.2.3 Verwerking van NMEA-data (pagina 289)
- 13.3 Een PC-toetsenbord voor de invoer (pagina 291)
- 13.3.1 Het toetsenbord-protocol (pagina 291)
- 13.3.2 Voorbeeldapplicatie met een toetsenbord (pagina 292)
- 13.4 Data-overdracht en afstandsbediening per handy (pagina 293)
- 13.4.1 Gratis schakelen (pagina 294)
- 13.4.2 Dataverbinding met de handy (pagina 295)
- 13.4.3 GSM-AT-commando's (pagina 296)
- 13.4.4 Tekstberichten versturen per PDU (pagina 297)
- 13.1 Radioklok met DCF77-ontvanger (pagina 281)
- Index (pagina 303)
Publicatiegegevens
Auteur: Florian Schäffer
Titel: AVR – hardware en C-programmering in de praktijk
1e druk: oktober 2008
© 2008 Elektor International Media BV
Website: www.elektor.nl
ISBN: 978-90-5381-233-4
NUR: 980
Vertaling: E.A.J. Bogers
Omslagontwerp: Etcetera, Aken
Grafische vormgeving & produktie: Technisch Vertaalbureau Bogers, Schoonoord
Druk: Wilco, Amersfoort
Auteursrecht en reproductiebeperkingen:
Niets uit deze uitgave mag worden verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand, of openbaar gemaakt, in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door middel van druk, fotokopie, microfilm of op welke andere wijze dan ook, zonder voorafgaande schriftelijke toestemming van de uitgever. Alle rechten voorbehouden.
Aansprakelijkheid:
Ondanks alle aan de samenstelling van dit boek bestede zorg kunnen noch de auteur, noch de redactie, noch de uitgever aansprakelijkheid aanvaarden voor eventuele schade die zou kunnen voortvloeien uit enige fout die in deze uitgave zou kunnen voorkomen.
Reprografische verveelvoudigingen:
Voor zover het maken van reprografische verveelvoudigingen uit deze uitgave is toegestaan op grond van artikel 16h Auteurswet 1912 jo het Besluit van 20 juni 1974, Stb. 351, zoals gewijzigd bij het Besluit van 23 augustus 1985, Stb. 471 en artikel 17 Auteurswet 1912, dient men de daarvoor wettelijk verschuldigde vergoedingen te voldoen aan de Stichting Pro (Postbus 725, 1180 AS Amstelveen). Voor het overnemen van gedeelte(n) uit deze uitgave in bloemlezingen, readers en andere compilatiewerken (artikel 1 Auteurswet 1912) dient men zich tot de uitgever te wenden.
International Rights:
No part of this book may be reproduced, stored in a database or retrieval system, or published in any form or any way, electronically, mechanically, by print, photoprint, microfilm or any other means without prior permission from the Publisher. All rights reserved.