Microcontroller Programmeren in C (MICPRG).
© Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Faculteit
voor Technology, Innovation & Society Delft Elektrotechniek.
Let op! Deze pagina bevat mogelijk
verouderde informatie, kijk op Blackboard voor de meest recente informatie!
Inhoud.
Het vak microprocessorbesturingen verschaft je inzicht in de
toepassingsmogelijkheden van microcontrollers. Heel veel producten en systemen
zijn tegenwoordig uitgerust met een of meerdere microcontrollers die deze
producten en systemen besturen. Microcontrollers worden ook wel "embedded
controllers" genoemd omdat de controller volledig in het produkt of systeem is
opgenomen (je ziet er aan de buitenkant niets van). Het gebruik van een
microcontroller in producten en systemen heeft (ten opzichte van een volledig
hardwarematige besturing) de volgende voordelen:
- De functionaliteit van de besturing ligt vast in software ("embedded
software") en kan door de fabrikant van het produkt relatief eenvoudig
gewijzigd worden als dat nodig is.
- Het produkt kan met behulp van embedded software vaak
gebruiksvriendelijker, nauwkeuriger, veiliger en energiezuiniger gemaakt
worden.
Omdat de producten waarin een microcontroller kan worden opgenomen sterk
variëren in complexiteit en kostprijs bestaan er een groot aantal
verschillende soorten microcontrollers. In de Microcontroller
FAQ (Frequently Asked Questions) worden de volgende toepassingen van
microcontrollers genoemd:
Embedded processors and microcontrollers are frequently found in: appliances
(microwave oven, refrigerators, television and VCRs, stereos), computers and
computer equipment (laser printers, modems, disk drives), automobiles (engine
control, diagnostics, climate control), environmental control (greenhouse,
factory, home), instrumentation, aerospace, and thousands of other uses. In
many items, more than one processor can be found. Microcontrollers are
typically used where processing power isn't so important. Although some of
you out there might find a microwave oven controlled by a Unix system an
attractive idea, controlling a microwave oven is easily accomplished with the
smallest of microcontrollers. On the other hand, if you're putting together a
cruise missile to solve the problem of your neighbor's dog barking at 3 in
the morning, you'll probably need to use processors with a bit more computing
power. Embedded processors and microcontrollers are used extensively in
robotics. A special application that microcontrollers are well suited for is
data logging. Stick one of these chips out in the middle of a corn field or
up in a ballon, and monitor and record environmental parameters (temperature,
humidity, rain, etc). Small size, low power consumption, and flexibility make
these devices ideal for unattended data monitoring and recording.
Microprocessoren worden zelfs in sportschoenen toegepast!
Schoen met batterij, sensor, motor en microprocessor.
Adidas heeft een "slimme" loopschoen ontwikkeld die zich dankzij een
ingebouwde computerchip aanpast aan de fysieke eigenschappen van de drager en
het soort ondergrond. Als de loper vermoeid begint te worden, worden de
demping en de ondersteuning groter. De fabrikant heeft drie jaar in het
diepste geheim gewerkt aan een techniek die er voor zorgt dat de schoen zich
gedurende de loop aanpast. De microprocessor berekent het juiste niveau van
demping. Volgens Adidas is het 's werelds eerste intelligente schoen. De
wereld van het lange afstandlopen en -trainen zal hier ingrijpend door
veranderen, aldus de fabrikant.
Bron: Artikel uit de Telegraaf
(2004). Deze schoen is niet echt een succes geworden, zie: http://en.wikipedia.org/wiki/Adidas_1
Als je de schoen van Adidas een beetje "over the top" vindt dan moet je eens
kijken naar Verb for Shoe, die
kan zelfs draadloos communiceren!. Deze schoen was overigens ook geen succes
(het bedrijf is niet meer online). Nike heeft een schoen die met je iPod kan
communiceren, zie http://www.apple.com/ipod/nike/.
September 2012 kwam deze GPS schoen in het nieuws: http://www.dominicwilcox.com/gpsshoes.htm,
helaas is het alleen nog maar een prototype. In 2013 heeft Google ook een
experimentele versie van een intelligente schoen gepresenteerd: http://www.artcopycode.com/#/talking-shoe.
In de EQ1.1 heb je al kennisgemaakt met de AVR ATmega32 microcontroller, een
populaire 8 bits microcontroller van Atmel. (Zie: http://www.atmel.com/products/AVR/).
In het onderwijsdeel MICPRG gaan we dieper op deze AVR ATmega32 controller in.
We doen dit zoveel mogelijk aan de hand van concrete voorbeelden en opdrachten
waarbij naast de software ook de hardware een belangrijke rol speelt. Met name
de koppeling tussen de controller en zijn omgeving (de interface) krijgt de
nodige aandacht. In het bijzonder de timer, de analoge en de seriële
interface. Ook het werken met interrupts komt aan de orde. Bij INLMIC heb je de
microcontroller in assembler geprogrammeerd. Bij MICPRG leer je om C te
gebruiken om de microcontroller te programmeren. De C kennis die je bij het
onderwijsdeel GESPRG hebt verworven wordt bij MICPRG gebruikt en verder
uitgebreid. De voordelen van het gebruik van C ten opzichte van assembler zijn:
- Een in C geschreven programma is eenvoudiger te lezen en te begrijpen.
Daardoor is een in C geschreven programma beter aan te passen en
eenvoudiger uit te breiden dan een in assembler geschreven programma.
- In C kunnen we gebruik maken van een gestructureerde aanpak om een
programma beter leesbaar en dus beter aanpasbaar en onderhoudbaar te maken.
We kunnen ook algemeen bruikbare functies ontwikkelen die het hergebruik
van code eenvoudiger maken.
- In C geschreven programma's voor de AVR kunnen eenvoudiger worden omgezet
naar een programma voor een andere microcontroller. Zeker als de
microcontroller specifieke delen van het programma zijn "verborgen" in een
aantal specifieke functies.
Globale leerdoelen.
Let op! Deze webpage is verouderd! Sinds
november 2014 is de juiste informatie te vinden op Blackboard.
Na afloop van deze module:
- Ben
je bekend met microcontrollers en hun toepassingen.
- Ben je bekend met de volgende onderdelen van een microcontroller en hun
toepassingen: parallelle I/O, seriële I/O, timer/counter, timer output
compare en PWM, timer input capture en ADC.
- Ken je de voor- en nadelen van het gebruik van C in plaats van assembler
om een microcontroller toepassing te implementeren.
- Ben je op de hoogte van de beperkingen van het gebruik van C in een
eenvoudige microcontroller toepassing (geen operating systeem, geen
run-time environment, geen hardware ondersteuning voor floating point,
beperkt geheugen) en weet je hoe je met deze beperkingen moet omgaan.
- Kun je de taalconstructies in C die handig zijn bij het programmeren van
microcontrollers (bitwise operators,
structs,typedef, enz) toepassen.
- Kun je een oplossing voor een besturings- en/of meetprobleem met behulp
van microcontrollers systematisch ontwerpen.
- Kun je de voor een microcontroller besturing benodigde software
ontwikkelen in C.
- Ben je in staat om fouten op te sporen in een microcontroller toepassing
door middel van een simulator en/of in circuit emulator (ICE) debugger.
- Kun je een microcontroller gebruiken om de volgende deelproblemen in een
besturing op te lossen:
- Inlezen en aansturen van digitale in- en uitgangen zowel parallel als
serieel.
- Inlezen van analoge ingangen (toepassingen: temperatuur sensor,
weerstandsmeter).
- Tellen van het aantal pulsen in een ingangssignaal (toepassingen:
toerenteller, hartslagmeter).
- Bepalen van de frequentie en/of de pulsduur (toepassingen:
frequentiemeter, capaciteitsmeter, afstandsmeting met behulp van
geluid).
- Aansturen van één of meerdere pulsvormige uitgangssignalen
(toepassingen: stappenmotor, PWM, muziekgenerator).
Ervoor en erna.
Let op! Deze webpage is verouderd!
Sinds november 2014 is de juiste informatie te vinden op Blackboard.
Veel vaardigheden en kennis die je hebt opgedaan tijdens INLMIC en GESPRG
zul je bij MICPRG nodig hebben. De kennis en vaardigheden die je bij MICPRG
gaat verwerven zul je gaan toepassen in het PRO-Q2 project.
Studiemateriaal.
- Let op! Deze informatie is verouderd! Sinds
november 2014 is het studiematriaal te vinden op Blackboard.
- Studiewijzer (deze pagina).
- Boeken:
- Leerstof:
- Extra leerstof voor studenten die meer willen weten:
- Samenvatting
USART Register Description ATmega32.
- Datasheets
van de ATmega32A.
- Heel C op één dubbelzijdig A4-tje.
- Programma's voor de ATmega32:
- opdr1c.c Het Knight Rider programma uit
les 1.
- timer_counter0.c Het programma
uit les 2 van pagina 44 t/m 46 uit het AVR boek.
- timer_counter0_alt.c Een
alternatief voor het bovenstaande programma (huiswerk voor les 3).
- timer_counter0_overflow.c
Nog een alternatief voor het bovenstaande programma die gebruik maakt
van de TOV0 flag (huiswerk voor les 4). Zie ook: Bitn... voor gevorderen: Het strijken van de vlag.
- timer_counter0_busy_wait.c
In dit programma uit les 3 wordt de functie
wacht1sec
gebruikt om LED7 1x per seconde te inverteren.
- timer_counter0_interrupt.c
In dit programma uit les 3 wordt LED7 1x per seconde geïnverteerd met
behulp van de
TIMER0_OVF_vect
interrupt. Je kunt dan in de
main
functie iets anders doen (in dit geval SW6 kopiëren
naar LED6).
- timer_counter0_interrupt_static.c
Dit programma uit les 4 is een variant van het bovenstaande programma
waarbij de globale variabele vervangen is door een
static
lokale variabele.
- adc.c Dit programma converteert de analoge
waarde op pin PA0 door middel van de ADC en laat het 10 bits resultaat
op het LCD display zien (huiswerk voor les 6).
- adc_double.c Dit programma converteerd
de analoge waarde op pin PA0 door middel van de ADC, rekent het 10 bits
resultaat om naar een spanning tussen 0.00 en 5.00 V en laat dit op het
LCD display zien (huiswerk voor les 6).
- timer_counter0_ctc.c Nog een
variant van het programma uit les 2 deze keer met behulp van de CTC
mode (huiswerk voor les 7). Zie eventueel ook: Bitn... voor gevorderen: Het strijken van de vlag.
- timer_counter0_kamertoon.c
Dit programma genereert een kamertoon (440 Hz) op pin PB3 = OC0 van de
ATmega32 met behulp van Output Compare en de CTC mode van
Timer/Counter0 (huiswerk voor les 7). Let op: dit programma zet
een toon op pin PB3. De speaker op het STK500 practicumbord is echter
niet aangesloten op PB3 maar op PD5. PD5 kun je aansturen met
Timer/Counter1.
- timer_counter0_PWM_low_25.c
Dit programma stuurt de LED op PB3 met 25% van het vermogen aan, actief
laag dus geschikt voor STK500 bord (huiswerk voor les 8).
- timer_counter0_counter_interrupt.c
Dit programma geeft telkens na 24 neergaande pulsen op pin PB0 een
interrupt (huiswerk voor les 9).
- USART_echoput.c Dit programma stuurt
elk karakter dat ontvangen wordt via de seriële poort 2x terug
(huiswerk voor les 10).
- USART_echoput_interrupt.c
Idem maar nu met behulp van interrupts zodat je in het hoofdprogramma
iets anders kunt doen (huiswerk voor les 11).
- avrserial.c Dit programma wacht
totdat het karakter 'S' ontvangen wordt via de seriële poort
(9600-7-E-1) en verstuurt dan de string "HalloQ" via de seriële poort
(huiswerk voor les 13).
- knightriderpro1.c Dit programma laat
een eenvoudig aan te passen patroon heen en weer lopen met een
instelbare vertraging.
- knightriderpro2.c Idem als het
bovenstaande programma maar de ingestelde vertraging blijft behouden
als de spanning uitvalt en er wordt minder RAM gebruikt.
- timer_counter_1_sleep.c
Dit programma laat een ledje knipperen met een frequentie van 1 Hz met
behulp van Timer/Counter1. Het programma werkt met een interrupt en zet
de ATmega32 tussen de interrupts in de Idle mode. De ATmega32 gebruikt
in de Idle mode maximaal 8 mA in plaats van maximaal 15 mA in de Active
mode.
- timer_counter_2_sleep.c
Dit programma laat een ledje knipperen met een frequentie van 1 Hz met
behulp van Timer/Counter2 in de asynchrone mode. Het programma werkt
met een interrupt en zet de ATmega32 tussen de interrupts in de Power
Save mode. De ATmega32 gebruikt in de Power Save mode maximaal 20 µA
in plaats van maximaal 15 mA in de Active mode.
- Programma's voor de PC:
- stand.c Dit programma bevat de functie
void printWinnaars(Stand st)
die de winnaars
opspoort in de, in de les behandelde, datastructuur Stand
(huiswerk voor les 12).
- tekstfile_schrijven.c Dit
programma laat zien hoe je een tekstfile kunt aanmaken met een C
programma.
- tekstfile_lezen.c Dit programma
leest de tekstfile stand.txt in en drukt de
inhoud af op het scherm.
- stand_met_tekstfile_simpel.c
Dit programma leest de, in de les behandelde, datastructuur
Stand
in uit de tekstfile stand.txt in en drukt de winnaar(s) af op het
scherm (huiswerk voor les 12).
- stand_met_tekstfile.c Dit
programma doet hetzelfde als het vorige programma maar maakt geen
gebruik van tijdelijke variabelen bij het inlezen.
- demotijd.c Dit programma haalt de
huidige tijd en datum op en drukt die op verschillende manieren af.
- welkedag.c Dit programma leest een
datum in en drukt dan af welke dag het op die datum is.
- Ook op het internet is veel informatie beschikbaar:
- ... googlen kun je zelf ...
- ATmega32A documentatie:
- avr-libc documentatie:
Practicumomgeving.
We maken op
het practicum gebruik van AVR Studio 4, de GNU toolchain voor de AVR (WinAVR),
de JTAGICE mkII en de STK500 met een zelfgemaakt opsteekprintje.
Op de STK500 zijn de volgende verbindingen gemaakt:
- De klok van de ATmega32 is verbonden met de klok die op het STK500 bordje
wordt gegenereerd. Deze klok is instelbaar op het STK500 bord en staat
ingesteld op 3.686 MHz.
- De SPI (Serial Programming Interface) van de ATmega32 is verbonden met de
ISP (In System Programming) connector van de STK500. Hierdoor kan de
ATmega32 via ISP geprogrammeerd worden. Het is echter eenvoudiger om de
ATmega32 via de JTAGICE mkII te programmeren.
- De pinnen PA0 t/m PA7 zijn verbonden met de drukknoppen aan de voorkant
van de STK500. Je mag deze alleen gebruiken als de schakelaar rechtsboven
op de stand "Switches" staat. Schakelaar PA0 werkt alleen als de
potentiometer (rechtsboven) in het midden staat. De schakelaars zijn actief
laag (ingedrukt = 0, niet ingedrukt = 1).
- De pinnen PB0 tm PB7 zijn verbonden met de LEDs aan de voorkant van de
STK500. De LEDs zijn actief laag (1 = LED uit, 0 = LED aan).
- De pinnen PD0 (RXD) en PD1 (TXD) zijn via een RS232 driver verbonden met
de RS232 spare connector (rechtsboven). Deze connector is via een seriële
kabel verbonden met de PC.
- De JTAG pinnen PC2 t/m PC5 van de ATmega32 zijn via de opsteekprint
verbonden met de JTAGICE mkII. Dit is het blauwe kastje aan de linkerkant.
Deze In Circuit Emulator is via een USB kabel verbonden met de PC en maakt
het mogelijk om een programma in de ATmega32 te laden en dit programma te
debuggen. Het is m.b.v. AVR Studio mogelijk om het programma op een
bepaalde plaats te stoppen (breakpoint) en variabelen te bekijken
(watches). Ook kunnen de interne registers van de ATmega32 bekeken worden
(I/O View).
Het opsteekprintje bevat:
- Een LCD display. Dit display is aangesloten op PA1 tm PA7 van de
ATmega32. Er is C code beschikbaar waarmee dit LCD
eenvoudig beschreven kan worden.
- Een potentiometer waarmee een spanning tussen 0 en AREF ingesteld kan
worden. AREF van de target AVR controller is instelbaar op het STK500 bord
en staat ingesteld op 5.0 V.
- Een speaker aangesloten op PD5.
- Een frequentiegenerator. Deze generator levert een frequentie van
ongeveer 4 KHz en is aangesloten op PB1 en PD6 van de ATmeg16. De
frequentie kan verlaagd worden door een externe condensator aan te sluiten
tussen de zwarte en blauwe connector.
- Een horloge-kristal van 32.768 KHz op PC6 en PC7 zodat timer 2 als Real
Time Clock gebruikt kan worden.
- Een circuit waarmee een weerstand gemeten kan worden. Deze weerstand moet
worden aangesloten tussen de rode en de zwarte connector.
- Een TC72 digitale temperatuursensor met SPI interface die via de SPI bus
van de ATmega32 uit te lezen is.
- Een PCF8563 RTC (Real Time Clock) die via de I2C bus van de
ATmega32 te programmeren is.
- Een PCAA9555 16 bit I/O poort die via de I2C bus van de
ATmega32 aan te sturen is. 6 van de outputs zijn verbonden met LEDs en 2
van de inputs zijn verbonden met schakelaars (links).
Details over het opsteekprintje kun je hier vinden: STK500 opsteekprintje.
Meer informatie over de gebruikite software tools:
Practicumopdrachten.
- Opdracht 1 (week 1). Uiterlijk
inleveren tijdens het practicum in week 2.
In de eerste practicumopdracht maak je kennis met de C programmeeromgeving
voor de ATmega32 microcontroller. Je begint met het testen van een
voorbeeldprogramma. Daarna moet dit voorbeeldprogramma worden
uitgebreid.
Opdracht 1: Knight Rider.
-
- Opdracht 2 (week 2). Uiterlijk inleveren tijdens
het practicum in week 3.
Bij deze practicumopdracht gebruik je de Timer interrupt van de ATmega32 om
de eerste opgave "op tijd" te laten lopen.
Opdracht 2: Timer interrupt.
-
- Opdracht 3 (week 3). Uiterlijk inleveren tijdens
het practicum in week 4.
In deze practicumopdracht leer je de Analoog naar Digitaal Converter (ADC)
van de ATmega32 te gebruiken om je bier op temperatuur te houden!
Opdracht 3: Bierkelder.
-
- Opdracht 4 (week 4). Uiterlijk inleveren tijdens
het practicum in week 5.
In deze practicumopdracht gebruik je de Output Compare of PWM mode van een
van de Timer/Counters van de ATmega32 om een pulsvormig signaal te
maken.
Let op! De practicumdocent zal je 1 van de 3 onderstaande opdrachten
toewijzen.
Opdracht 4a: Muziekgenerator.
Opdracht 4b: Morsegenerator.
Opdracht 4c: Dimmer.
-
- Opdracht 5 (week 5). Uiterlijk inleveren tijdens
het practicum in week 6.
In deze practicumopdracht leer je met behulp van een van de Timer/Counters
van de ATmega32 een pulsvormig signaal te meten.
Opdracht 5: Periodetijdmeter.
-
- Opdracht 6 (week 6). Uiterlijk inleveren tijdens
het practicum in week 7.
In deze practicumopdracht gebruik je de USART van de ATmega32 om via een
seriële verbinding te communiceren met een PC.
Let op! De practicumdocent zal je 1 van de 2 onderstaande opdrachten
toewijzen.
Opdracht 6a: Spanningsmeter.
Opdracht 6b: Capaciteitsmeter.
Beschikbaar materiaal voor het practicum:
- Include en library files:
- Testprogramma's:
- t.hex Dit testprogramma is bedoeld om de
STK500 LEDs en schakelaars te testen. De schakelaars worden uitgelezen
en weergegeven op de LEDs.
- f.hex Dit testprogramma bepaalt de frequentie
in Hz van het signaal op PD6 en PB1 en geeft dit elke kwart seconde
weer op het LCD. Dit programma kan gebruikt worden om de 555 timer te
testen.Telkens als ledje PB7 knippert wordt het display opnieuw
beschreven.
- p.hex Dit testprogramma bepaalt de pulsduur
in µs van het signaal op PD6 en PB1 en geeft dit elke kwart seconde
weer op het LCD. Dit programma kan gebruikt worden om de 555 timer te
testen. Telkens als ledje PB7 knippert wordt het display opnieuw
beschreven.
- v.hex Dit testprogramma meet de analoge
spanning op PA0. De waarde (in V) wordt naar het LCD geschreven. Dit
programma kan gebruikt worden om de ADC van de ATmega32 te testen.
- s.hex Dit testprogramma stuurt alle seriële
karakters (9600 Baud, 7 bit mode, geen pariteit en 1 stopbit) die via
de seriële ingang (PD0 = RxD) binnenkomen weer terug via de seriële
uitgang (PD1 = TxD). Dit programma kan gebruikt worden om de seriële
poort van de ATmega32 te testen.
- speaker-tst.hex Dit programma test
de speaker van het opsteekprintje. De speaker maakt alleen geluid als
de schakelaar SW2 wordt ingedrukt.