ES1 Project 1: Microcontrollers

Vergelijkbare documenten
ES1 Project 1: Microcontrollers

ES1 Project 1: Microcontrollers

ES1 Project 1: Microcontrollers

Microcontrollers. Week 5 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/

Technology, Innovation & Society Delft

Microcontrollers Week 5 Interrupts, Timer/Counter 0 Jesse op den Brouw INLMIC/

Microcontrollers. Bart Kardinaal E Verslag microcontrollers Rev 1.0 Status definitief.

EmSE presentatie. Starten met de ATtiny2313: Een RGB powerled driver Kees Moerman, 13 juli 2010

De Arduino-microcontroller in de motorvoertuigentechniek (4)

Pulse generator. Output compare. Timer/Counter0. T/C0 count-ingang. T/C0 Output Compare. Microcontroller Programmeren in C. MICPRG 15 januari 2014

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (3)

De Arduino-microcontroller in de motorvoertuigentechniek (3)

Opgave Tussentijdse Oefeningen Jaarproject I Reeks 3: Tijd, licht en warmte

Fig. 2. Fig ,5 4 3,5 3 2,5 2 1,5 U (V) 0, temperatuur ( C)

MICPRG 15 januari Toets: Theorie:

In- en uitgangssignalen van microprocessoren

RCL Arduino Workshop 1

7,6. Samenvatting door A woorden 12 april keer beoordeeld. Natuurkunde. Natuurkunde Systemen. Systemen

b) Teken op de bijlage welke lampjes van het klokje branden om 19:45:52. Schrijf eronder hoe je dit bepaald/berekend hebt. (3p)

Arduino CURSUS. door Willy - 09-juni-2017

GEÏNTEGREERDE PROEF. VTI Sint-Laurentius. Pakketweegschaal. Industriële informatie & communicatietechnologie SCHOOLJAAR

9 Tijdsfuncties. 9.1 Voorstelling tijden

Pulse output High speed counter Input interrupts

Arduino. Arduino UNO. Sam Decoster. CoderDojo Roeselare. Sam Decoster

Projectwerk microcontrollers:

De Arduino-microcontroller in de motorvoertuigentechniek (8)

Hoofdstuk 5: Signaalverwerking

Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files

VANTEK Discovery set. N. B. De OPITEC bouwpakketten zijn gericht op het onderwijs. N991240#1

TECHNISCHE UNIVERSITEIT EINDHOVEN FACULTEIT DER TECHNISCHE NATUURKUNDE

De CB channel controller TMS1022NL/NLL en TMS1023NL/NLL. ( Dit is een maskrom-programmed version van de Texas Instruments TMS1000 family)

Time (tijd): Instelbaar van 00:00 tot 99:00, met een toename van 1:00 minuut.

De computerhandleiding bestaat uit de volgende hoofdstukken:

Antwoorden Systeembord Fysische informatica voor de onderbouw havo/vwo

Werkbladen voor Arduino workshop 1

Inhoud vandaag. Interrupts. Algemeen ARM7 AIC

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (4)

Oefeningen Interpretatie I Reeks 6 : Registermachines

Arduino Workshop 1 Zuid-Limburg

MAX display handleiding

Getalformaten, timers en tellers

Infiniti ST-790 Computerhandleiding Introductie

(energie) meten via Qbus

DDS chips. DDS = Direct Digital (frequency) Synthesis. Output = sinusvormig signaal. Maximum frequentie = ½ klokfrequentie

Wat is Arduino? Arduino = microprocessor (Atmel)

Elektronische dobbelsteen met de ATtiny2313

Inhoud. 1 De Microcontroller 1. 2 De taal C Declaraties Functies In- en uitvoer Voorwaardelijke opdrachten 41

Timer TI 100. Nederlandse Handleiding. w w w. b i t n e d e r l a n d. n l

Basisoefeningen en uitwerkingen Systeembord. Opgaven en antwoorden op It s learning en agtijmensen.nl

VTI Sint-Laurentius De school voor Wetenschap, Techniek en Technologie Pr. Thuysbaertlaan Lokeren info@vti-lokeren.

Deel 8: stappenmotoren en interrupts

Software beschrijving Epoluthon 2.0

Bedrade afstandbediening Introductie van het spare part. Knoppen en display van de afstandbediening.

A Quick Start Guide: AVR programmeren

1 Mitsubishi Alpha XL

Gebruiksaanwijzing. Cameo V6

Computer Instructies voor de SM-5062

Meervoudige Smart-Card Duplicator. Gebruiksaanwijzing

Deel 2 S7 Graph Ont4 - GA3

Pico Timer - Programmer EM

Module nummer Elke speciale module krijgt een eigen module nummer om de betreffende module in te stellen en uit te lezen. Ethernet module FX3u-ENET

digitale ontwerp technieken SketchUp

Computer handleiding PAR-5500

Handleiding KCVR9NE KCVR9NE

VOLAUTOMATISCHE SPUI

Gebruiksaanwijzing AVR910 USB Programmer

INHOUD. KHLim dep IWT MeRa 1/22

Microcontrollers Week 1 Introductie microcontroller Jesse op den Brouw INLMIC/

Opdracht 1: Toss Als een voetbalwedstrijd begint, gooit de scheidsrechter een muntje om te beslissen wie aftrapt. Dat heet de toss.

ADVANTAGE. L /2010 rev 0. system ONE2 WI ONE2 WB INSTALLATIEHANDLEIDING

Peripheral Interface Controllers. BRAC clubavond PE2WDO

LET OP: PIN BLOKKERING EN VOIC UITSCHAKELEN!

Beschrijving bedieningsunit, Serie AK30.

Microcontrollers Introductie INLMIC Jesse op den Brouw INLMIC/

S88XPressNetLI v1.0. Installatie- en gebruikershandleiding en naslagwerk KDesign Electronics, PCB ontwerp door RoSoft

Verfmengmachine Service Manual

Handleiding Vibralite 8 horloge

Seriële bluetooth verbinding ATmega128

Android apps met App Inventor 2 antwoorden

Workshop Arduino - deel 2

Opladen Opmerkingen Vragen?... 11

Tinyserir-RC5. Datasheet. Tinyserir-RC5 Page: 1 of 8

Draadloze Installatie Handleiding

C:\PIC\Navigatielichten\Navigatielichten.c

HANDLEIDING RZ-D-4.40WD / RZ-D-4.433WD

In het standaardscherm kunt u op de UP knop drukken om langs de. CONTROL, USER en WATT CONTROL te lopen om vervolgens een programma te selecteren.

DF405_V5 Universele uitlezing opbouw

b Geluid waarnemen, meten en omzetten in elektrische spanning.

Hardware High Speed Counters (HSC) dienen aangesloten te worden op de general-purpose inputs X0 t/m X7.

ewon Reset en Recovery

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

Besturing van de Miniatuurwereld OC32. Apparaatdefinities (Generiek)

Auto Alarm FM5000 FM500 FM600 FM700 LCD MINI

Hard- en software. 1 Gebruiksaanwijzing voor Labview-grafieken. 2 Data-acquisitie met de computer

Transcriptie:

ES1 Project 1: Microcontrollers Les 5: Timers/counters & Interrupts Timers/counters Hardware timers/counters worden in microcontrollers gebruikt om onafhankelijk van de CPU te tellen. Hierdoor kunnen andere instructies door de CPU uitgevoerd worden terwijl deze extra hardware telt. Het aflopen van een timer/counter kan op verschillende manier geregistreerd worden, bijvoorbeeld via (software) polling en via interrupts. Documentatie In de datasheet worden de timers/counters uitvoerig beschreven. Er zijn in de ATmega32A aanwezig: een 8-bit Timer/Counter0 with PWM, een 16-bit Timer/Counter1, en een 8-bit Timer/Counter2 with PWM and Asynchronous Operation. Aangezien de werking van alle timers/counters in principe hetzelfde is, zullen we in deze les uitsluitend de 8-bit Timer/Counter0 bespreken. De werking van een aantal features wordt uitgelegd aan de hand van Figure 14-1. 8-bit Timer/Counter Block Diagram uit de datasheet. Bron: http://www.atmel.com/dyn/products/product_card.asp?pn=atmega32a De module Timer/Counter is de hardware waarin het tellen plaatsvindt. Dit tellen kan zowel naar boven als naar beneden, maar geschiedt altijd in stapjes van één. Dit is een 8-bits register, dus de timer/counter kan alle waarden van 0 t/m 255 aannemen. Het lezen en schrijven naar en van dit register in AVR Studio gaat met de define TCNT0. Control Logic bevat de logica om de timer/counter aan te sturen. Als input heeft dit blok het signaal clk T0. Deze clock bepaald hoe snel de timer/counter met één veranderd. Het signaal is afkomstig van de prescaler of een externe pin. De prescaler is een hardware module met als ingang de systeem clock (F_CPU) en als uitgang een instelbare deling hiervan. Is bijvoorbeeld F_CPU gelijk aan en de prescaler wordt ingesteld op 2, dan is de uitgang. Het resultaat is een puls iedere. De Control Logic module gebruikt deze puls om de timer/counter te laten tellen (met het signaal count). De Control Logic module stelt de richting (Direction) in van het tellen en heeft de mogelijkheid TCNT0 1

op 0 te zetten (Clear). Met bijvoorbeeld een puls iedere om de timer/counter van 0 naar 0 te laten tellen. duurt het dus Het instellen van de 8-bit Timer/Counter0 gaat via register TCCR0. Er zijn verschillende instellingen mogelijk, bijvoorbeeld de mode waarin de timer/counter moet werken en wat de clock source is. Bron: http://www.atmel.com/dyn/products/product_card.asp?pn=atmega32a Het register OCR0 staat voor Output Compare Register Zero. Naar dit register kan een 8-bits waarde worden geschreven. Deze waarde wordt vergeleken met de waarde van TCNT0. Zodra deze gelijk zijn kan er een actie op volgen, waaronder het genereren van een Output Compare OC0 interrupt. Er zijn nog twee bijzondere hardware modules, namelijk =0 en =0xFF. Afhankelijk van de modus waarin de timer/counter ingesteld staat kan de waarde van TCNT0 hiermee vergeleken worden. Is TCNT0 gelijk aan één van beiden, dan kan daar afhankelijk van de modus een actie op volgen. Zodra het register TCNT0 de waarde 0xFF heeft bereikt is de maximale waarde bereikt. Wordt er dan nogmaals een puls gegeven dan zal het register TCT0 de waarde 0x00 krijgen. De Control Logic detecteert dit vollopen van de timer/counter en set de vlag TOV0 om dit aan te geven. Interrupts De term interrupt is nu al vaak gevallen, maar wat is dat nu eigenlijk. Stel dat er door een microcontroller twee taken moeten worden uitgevoerd. De eerste taak is het uitvoeren van een ingewikkelde berekening. De tweede taak is het tellen hoe vaak er op een switch wordt gedrukt. Als de microcontroller voor beide taken de helft van de CPU tijd heeft, dan staat de microcontroller dus de helft van de tijd te wachten op input van de gebruiker. Deze tijd kan beter gebruikt worden om de berekening uit te voeren. Interrupts kunnen gebruikt worden om dit te realiseren. Het woord zegt het al, een (lange) taak wordt tijdelijk geïnterrumpeerd door een (korte) taak. De trigger voor het uitvoeren van een interrupt is vaak afkomstig van hardware. Bijvoorbeeld: zodra er een logische 0 wordt gedetecteerd op een input pin (switch wordt ingedrukt) wordt door de microcontroller even de korte taak uitgevoerd. Daarna gaat de lange taak weer verder en krijgt alle processortijd tot er weer een interrupt plaatsvindt. Timers/counters kunnen ook interrupts genereren. Dit is afhankelijk van de mode waarin de timer/counter gebruikt wordt. In bijvoorbeeld de Normal mode wordt interrupt vlag TOV0 geset zodra TCNT0 gelijk is aan 0. In de Clear Timer on Compare Match (CTC) Mode wordt een OC0 interrupt gegenereerd zodra TCNT0 gelijk is aan OCR0 (ga dit na in de datasheet). Aan de hand van een tweetal voorbeelden zullen we bekijken hoe 8-bit Timer/Counter0 ingesteld kan worden om op gezette tijden een interrupt te genereren. 2

Voorbeeld 1 Normal Mode We ontwikkelen een solution genaamd blinky dat een LED zal laten knipperen op PB0. Hiervoor gebruiken we de Normal Mode. Grafisch gezien gebeurt er het volgende. De timer/counter begint in register TCNT0 te tellen. Zodra de stand 255 bereikt is zal bij de volgende clock puls de teller de stand 0 aannemen. Op dit moment moet de timer/counter een Timer Overflow interrupt geven. TCNT0 value 255 TCNT0 0 TOV0 interrupt TOV0 interrupt TOV0 interrupt t Dit wordt gerealiseerd met de code zoals hiernaast weergegeven. Wat opvalt is dat dit programma zijn werk doet geheel op basis van interrupts! Na de initialisatie van PORTB, de timer/counter 0 en de interrupts wordt er in de main routine géén code meer uitgevoerd. NB. Kijkend naar de datasheet, dan zien we dat de inhoud van TCCR0 gelijk wordt aan: TCCR0 0 0 0 0 0 0 0 1 Ga dit voor jezelf na! De grote vraag is nu natuurlijk hoe lang de tijd is tussen twee TOV0 interrupts. Dit laat zich gemakkelijk uitrekenen. Deze is namelijk afhankelijk van twee variabelen: De systeem clock van de microcontroller: F_CPU De ingestelde prescaler Aangezien er geen prescaler ingesteld is, zal de timer/counter dus tellen met de snelheid van F_CPU. Dat betekent een puls iedere (bij 1 MHz). De 8 bits timer/counter telt van 0 t/m 255, dus dat zijn 256 stappen. Daarmee wordt de tijd tussen twee TOV0 interrupts: 3

Dat komt neer op een frequentie van: Deze frequentie is veel te hoog voor ons oog om de LED te zien knipperen! Om de frequentie te verlagen hebben we verschillende opties. De meest voor de hand liggende is de prescaler te gebruiken. Stel TCCR0 opnieuw in, maar nu zo dat de prescaler op 1024 staat (het duurt nu dus 1024 pulsen voordat de timer counter een puls krijgt). Zoek in de datasheet op welke bits van TC- CR0 logisch 0 en 1 moeten worden. De tijd tussen twee TOV0 interrupts wordt dan: Dat komt neer op een frequentie van: Dit kunnen we prima waarnemen. De LED zal per seconde ongeveer twee maal aan en twee maal uit zijn! Voorbeeld 2 CTC Mode Willen we een exacte timing realiseren, dan kunnen we 8-bit Timer/Counter0 gebruiken in de Clear Timer on Compare Match Mode. In dit voorbeeld wordt de timer/counter ingesteld om iedere 100 ms een interrupt te laten genereren. De solution blinky wordt aangepast, zodat de LED knippert met een frequentie van exact 10 Hz. Dit programma werkt volledig op basis van interrupts. In de main routine worden dus geen instructies uitgevoerd, op initialisatie na. Grafisch gezien moet er het volgende gebeuren. De timer/counter begint in register TCNT0 te tellen. Het duurt een bepaalde tijd (100 ms) voordat deze de waarde x bereikt. Op dat moment moet er een Output Compare interrupt gegenereerd worden en TCNT0 gereset, zodat het weer opnieuw kan beginnen. Een dergelijke oplossing kan gerealiseerd worden met de CTC mode. De waarde van x wordt opgeslagen in het register OCR0 en er wordt een OC0 interrupt gegenereerd wanneer OCR0 gelijk is aan TCNT0. Tevens wordt TCNT0 gereset. TCNT0 value 255 OCR0 x TCNT0 0 100ms 100ms 100ms t OC0 interrupt OC0 interrupt OC0 interrupt Er zijn in de CTC mode niet twee, maar drie variabelen van invloed op de tijd tussen twee OC0 interrupts: De systeem clock van de microcontroller: F_CPU De ingestelde prescaler De waarde in OCR0 tot waar er geteld wordt We gaan er van uit dat F_CPU gelijk is aan 1MHz. 4

Optie 1: géén prescaler. De timer/counter telt nu met een frequentie (= aantal pulsen per seconde) van. Dan moet dus de timer/counter tellen tot om een interrupt te genereren iedere 100 ms. Dit levert echter een probleem op, omdat timer/counter0 een 8-bit counter is en er dus slechts tot 255 geteld kan worden!! Optie 2: De prescaler wordt ingesteld op 1024. De timer/counter telt nu met een frequentie van. Dan moet dus de timer/counter tellen tot om een interrupt te genereren iedere 100 ms. Afgerond past dit getal wel in een 8-bit register! Dit wordt gerealiseerd met de code zoals hiernaast weergegeven. Na de initialisatie van PORTB wordt de timer/counter ingesteld. het OCR0 register krijgt de zojuist berekende waarde. Vervolgens wordt TCNT0 op nul gezet, zodat zeker is dat deze netjes vanaf nul begint te tellen. NB. Kijkend naar de datasheet, dan zien we dat de inhoud van TCCR0 gelijk wordt aan: TCCR0 0 0 0 0 1 1 0 1 Ga dit voor jezelf na! De LED knippert nu per seconde vijf keer aan en vijf keer uit! Hoewel timing erg lastig te debuggen is, heeft Atmel Studio een handige manier geïmplementeerd om toch tijd te kunnen meten. Zet een breakpunt (F9) in de ISR en start de debugger (F5). 5

Maak de Processor view zichtbaar ( ) en reset de Stop Watch (rechtermuis knop). Continue de debugger (F5) en wacht tot het programma wederom stopt bij het breakpoint in de ISR. Bij de Stop Watch lees je nu de tijd af die verstreken is sinds de vorige interrupt. Dit klopt aardig goed met de berekeningen! Tot slot nog het volgende. De CTC mode kent veel mogelijkheden, maar kent ook beperkingen. Een aantal interessante vragen hierover vind je hieronder. Kun je ze allemaal beantwoorden? De prescaler van de ATmega32A kan ook nog ingesteld worden op 8, 64 en 256. Welke van deze waarden is bruikbaar in bovenstaand voorbeeld? Ga voor jezelf dus na wat de waarde van OCR0 moet worden met deze prescalers en ga na of dit past in de 8 bits ruimte. Met F_CPU gelijk aan 1 MHz, hoe lang bedraagt de maximale tijd tussen twee interrupts die met een 8-bit timer/counter in de CTC mode gerealiseerd kan worden? En met F_CPU is 8 MHz? Opdracht 1 Start in AVR Studio een nieuw project met de naam blinky. Neem de code over uit het tweede voorbeeld en test het programma. Realiseer vervolgens de volgende taken. Stel de systeem clock van de microcontroller in op 2 MHz. Dit doe je door de fuses aan te passen met de AVR Programming tool. Pas tevens het symbol F_CPU aan (zie les 1 als je niet meer weet hoe dat moet). Pas de instellingen van timer/counter0 dusdanig aan dat de LED met een frequentie van 10 Hz blijft knipperen. Pas de instellingen van timer/counter0 dusdanig aan dat de LED met een frequentie van 20 Hz gaat knipperen. Stel de systeem clock van de microcontroller in op 8 MHz. Pas de instellingen van timer/counter0 dusdanig aan dat de LED met een frequentie van 50 Hz gaat knipperen. Opdracht 2 Start in AVR Studio een nieuw project met de naam knip. Neem de volgende code over waarin Timer/Counter1 gebruikt wordt. #include <avr/io.h> int main(void) { // Initialize Timer/Counter1 TCCR1A = (1<<COM1A0); TCCR1B = (1<<WGM12) (1<<CS12); // Interrupt every 1s // F_CPU = 1 MHz // prescale = 256 // Compare value = (1 MHz / 256) * 1s = 3906,25 OCR1A = 3906; 6

// Reset timer/counter TCNT1 = 0x00; // Initialize OC1A port DDRD = (1<<PD5); } while(1) { ; // Do nothing!! } Stel de systeem clock van de microcontroller in op 1 MHz (via de fuses) en test het programma met een STK500. Verbindt PORTD met de LED s. Geef antwoord op de volgende vragen: In welke mode staat timer/counter1 ingesteld (= Waveform Generation Mode)? Hoe staat het gedrag van de output compare pin ingesteld (= Compare Output Mode)? Welke pin van de microcontroller is verbonden met OC1A? Op welke waarde staat de prescaler ingesteld (= Clock Select)? Waarom is het met een 16-bit timer/counter wel mogelijk om iedere seconde een interrupt te laten genereren bij F_CPU = 1 MHz en prescale = 256 in tegenstelling tot een 8-bit timer/counter? Waarom is het niet nodig om een ISR te realiseren? Extra: Voeg aan het programma een ISR toe. Deze ISR zorgt ervoor dat PD0 9 seconde uit is en 1 seconde aan. Opdracht 3 Start in AVR Studio een nieuw project met de naam stopwatch. Dit programma start met tellen zodra SW0 ingedrukt wordt. De verstreken tijd in seconden wordt binair op de LED s weergegeven. Zodra SW0 weer ingedrukt wordt stopt het tellen en blijft de verstreken tijd zichtbaar op de LED s. Wordt SW0 nogmaals ingedrukt, dan gaat het tellen verder. Wordt SW1 ingedrukt, dan wordt de verstreken tijd gereset, maar alleen als de stopwatch niet aan het tellen is. Maak gebruik van een timer/counter om de tijd bij te houden. TIP: Houdt rekening met dender van de switches. Tijd over Breidt de stopwatch opdracht uit, door de snelheid van tellen instelbaar te maken met SW2. De default snelheid van tellen bedraagt 1Hz. Wordt SW2 ingedrukt dan verdubbeld die snelheid naar 2 Hz. Wordt SW2 nogmaals ingedrukt, dan vertienvoudigd die snelheid naar 10 Hz. Wordt SW2 nogmaals ingedrukt, dan wordt de telfrequentie weer 1 Hz. De snelheid moet aangepast kunnen worden als de stopwatch loopt, maar ook als de stopwatch niet loopt. In deze onderwijspublicatie is géén auteursrechtelijk beschermd werk opgenomen. 7