Embedded systems V1.0
|
|
|
- Henriette Kuipersё
- 10 jaren geleden
- Aantal bezoeken:
Transcriptie
1 Embedded systems Pauwels D. Embedded systems
2 Hoofdstuk Inleiding Wat is een embedded systeem? We leven in een "embedded" wereld. We worden omringd door een groot aantal embedded systemen en in ons dagelijks leven zijn we vaak afhankelijk van het correct functioneren van deze gadgets. Embedded systemen zijn elektronische systemen waarin microprocessoren zijn verwerkt. De hoofdredenen waarom deze zijn gebruikt is het vereenvoudigen van het systeemontwerp, het voorzien van de gewenste flexibiliteit en het drukken van de kostprijs per systeem. Een microprocessor aan boord hebben betekent dat het verbeteren van tekortkomingen, het maken van aanpassingen en het toevoegen van nieuwe features slechts een kwestie is van het herschrijven of aanpassen van de software die het toestel bedient. De hedendaagse embedded systemen zijn zo goedkoop geworden dat ze bijna in elk toestel zitten dat we gebruiken in ons alledaags leven. Embedded systemen zijn doorgedrongen in onze televisie, radio en CD speler. Ook de afwasmachine of microgolfoven uit onze keuken, kredietkaartlezers, en toegangscontrole-systemen of Palm computers en GSM's bevatten allemaal een embedded systeem. In heel wat gevallen zijn we er ons zelfs niet van bewust dat een "computer" aanwezig is daardoor beseffen we dikwijls niet wat de impact van embedded systemen is op ons leven. Onze desktop PC waarmee we versturen, tekstverwerking doen, speadsheets en databases raadplegen is ontworpen om verschillende toepassingen uit te voeren. Een embedded systeem is ontworpen om slechts een beperkt aantal taken uit te voeren zoals bv. er voor zorgen dat de toast niet aanbrandt of het instellen van de kookcyclus in de microgolfoven. Een embedded systeem kan dus niet voor iets ander worden gebruikt. 1.1 Wat is er uniek aan het ontwerp van embedded systemen? Het ontwerp van een embedded systeem vormt een uitdaging voor een elektronica ingenieur wat de betrouwbaarheid, performantie en systeemkost betreft. Pauwels D. Embedded systems 1
3 De betrouwbaarheidsvereisten zullen een grotere verantwoordelijkheid leggen bij de ontwerpers van het systeem, om fouten te elimineren en om de software zo te ontwerpen dat onverwachtte situaties of fouten getollereerd worden. Veel embedded systemen moeten 24 uur per dag, zeven dagen per week, 365 dagen per jaar werken. Men kan ze niet gewoon "rebooten" wanneer er iets verkeerd gaat. Daarom zijn soliede ontwerpmethoden en een grondige testfase heel belangrijk voor elk embedded systeem, dit wat de hardware- als de software-implementatie betreft. Door de behoefte om te communiceren met sensors, actuatoren, toetsenborden, display's enz. zal verondersteld worden van de programmeur dat hij (zij) een goede kennis heeft over hoe men op alternatieve manieren aan I/O kan doen, om vereisten qua snelheid, complexiteit en systeemkost op elkaar af te stemmen. Alhoewel we meestal (ahfankelijk van de gebruikte processor of controller) programmeren in een hogere programmeertaal voor een betere productiviteit, zal het toepassen van deze alternatieve methoden dikwijls aanleiding geven om af te dalen tot op het hardwareniveau van het systeem en te programmeren in assembler. 1.2 Hoe krachtig zijn embedded processoren? De embedded systemen die we vinden in de meeste consumer producten bevatten een microcontroller. De kracht van deze controllers is meestal vergelijkbaar met deze van de eerste PC's, maar krachtiger processoren worden steeds meer en meer gebruikt omdat ook de toepassingen die lopen op embedded sytemen steeds complexer worden. De grootste hoeveelheid embedded systemen die vandaag in productie zijn, zijn gebaseerd op 4-bit, 8-bit of 16-bit processoren. Alhoewel 32-bit processoren nu nog maar voor een relatief klein percentage meetellen voor het gebruik in embedded systemen stijgt hun gebruik voor deze doeleinden zeer snel. Ontwerpers van embedded systemen hebben vandaag de keuze uit een groot aanbod aan processoren en controllers. Vooral in het 8-bit segment kan de beschikbare variëteit zelfs een ervaren ontwerper soms overweldigen. Het selecteren van de meest geschikte controller voor een bepaalde toepassing is soms een moeilijke eerste stap. Het wordt er ook niet eenvoudiger op doordat er steeds nieuwe controllers op de markt komen. 1.3 Embedded systemen werken meestal "REAL-TIME". Real-time systemen verwerken 'events'. Events zijn gebeurtenissen die voorkomen aan systeeminputs en die andere gebeurtenissen veroorzaken aan systeemoutputs. Een voorbeeld van een event is het blokeren van een wiel van een wagen bij het remmen. De reactie van het ABS systeem (embedded systeem) hierop is het gepulseerd bekrachtigen van de remkracht zodat het wiel weer gaat draaien en er weer besturing van de wagen mogelijk is. Het hoofddoel van een real-time systeem is de responcetijd te minimaliseren. Het ABS systeem moet het blokeren van het wiel detecteren binnen enkele milliseconden; een vertraging van enkele seconden zou hier ontoelaatbaar en zelfs potentiëel dodelijk zijn. Wat real-time betekent voor een embedded systeem is afhankelijk van de toepassing, zo zal de besturing van een microgolfoven minder tijdskritisch zijn en zullen we tevreden zijn als de controller zijn responce zo snel mogelijk berekent, hij heeft immers geen echte deadline, de gebruiker of de installatie is niet in gevaar als de responce iets langer duurt. We spreken hier van soft real-time. Wanneer er wel een deadline is opgelegd aan het systeem, zoals in het geval van het ABS systeem spreken we van hard real-time systemen. Pauwels D. Embedded systems 2
4 Hoofdstuk Wat is een microcontroller? Iedereen heeft wellicht al wel de benaming 'microprocessor' gehoord, met als belangrijkste vertegenwoordiger de Pentium processor uit de Intel x86 reeks. Je vind deze term zeker in een aantal commerciële publicaties waarmee de PC-shops ons om de oren slaan. Men zou door al dat commerciële 'geschreeuw' bijna vergeten dat dit type van 'PC'-processor maar een klein stukje van de totale processormarkt vertegenwoordigd en dat er daarnaast ook nog een zeer groot en bloeiend segment is van embedded microprocessoren en microcontrollers. Dit zijn meteen ook termen die de modale PC gebruiker vreemd zijn! Wat is dan wel zo'n microcontroller? 2.1 Een typisch microprocessorsysteem. Om aan te geven wat een microcontroller is, gaan we eerst even het blokschema van een typisch embedded microprocessorsysteem van nabij bekijken. X-tal Osc. POR ADRES DECODER ADRESBUS CPU ROM (FLASH) (EPROM) (EEPROM) SRAM PAR. POORT SER. POORT TIMER COUNTER DATABUS Fig Een blokschema van een typisch microprocessorsysteem Pauwels D. Embedded systems 3
5 Op de figuur zien we de CPU (een single chip CPU is een microprocessor) die is verbonden met de nodige geheugenchips (ROM en RAM) en met een aantal I/O chips, in dit geval parallelle poorten, seriële poorten en timers. De verbinding van de CPU met de andere componenten verloopt via een aantal bussen. Een bus is een verzameling van geleiders die signalen van een zelfde aard transporteren. De draden die de gegevens van en naar het geheugen vervoeren, wordt de DATABUS genoemd. De geleiders die het adres (locatienummer) vervoeren dat aangeeft waar er informatie gelezen of geschreven wordt, noemen we de ADRESBUS. Omdat we moeten kunnen lezen en of schrijven naar het geheugen, zijn er ook controlesignalen nodig, die we de CONTROLEBUS noemen. Aangezien het de processor is die de controlebus stuurt, hebben alle namen van de signalen betrekking op de functie die ze vanuit de processor krijgen. Zo wordt de 'read' lijn actief als de processor wil lezen, en de 'write' lijn als de processor wil schrijven. Wat zijn nu de nadelen van een klassiek microprocessorsysteem voor embedded toepassingen? MTBF. Alles gaat stuk! Niets is helaas voor de eeuwigheid. Het systeem dat je zo geduldig en met zoveel liefde hebt ontworpen zal het na een poos opgeven bij de klant. De kunst bestaat erin dat je systeem de klant overleeft, je levert dus best kwaliteit af, zo hou je gelukkige klanten tot op hun sterfbed. Een systeem bestaat meestal uit verschillende componenten die allemaal hun eigen "Failure rate" hebben. Deze FIT-rate ( FIT of Failures In Time) is de statistische waarde die voor een component aangeeft hoeveel failures of defecten de component zal hebben per miljard werkingsuren. De FIT rate van een component is een gegeven dat door de fabrikant ter beschikking kan worden gesteld voor elke component, of in het beste geval gegevens waaruit je de FIT rate kan berekenen.. Aan de hand van deze cijfers kan voor een bepaald systeem de MTBF worden bepaald. MTBF staat voor Mean Time Between Failure. De MTBF is geen exact gegeven, het is een voorspelling, waar van een systeem met een aantal componenten met een bepaalde FIT-rate, een gemiddelde werkingsduur wordt berekend. Waarin: n het aantal verschillende componenten. q i hoeveelheid van de i de component. de FIT rate. r i Hieruit blijkt dat voor een bepaalde FIT rate de betrouwbaarheid van het systeem afneemt als het aantal componenten toeneemt, iets wat je met wat boerenwijsheid ook al wel kon inschatten. In de volgende figuur staat bv. de FIT-rate van een PowerPC 603r processor van Freescale weergegeven in functie van de junctietemperatuur met de voedingsspanning als parameter. Pauwels D. Embedded systems 4
6 Fig De FIT rate van een XPC 603 e processor van Freescale. Ontwerp van een PCB. Voor je fonkelnieuw embedded processorsysteem moet er helaas ook een PCB (Printed Circuit Board) worden ontworpen. Met de steeds hoger liggende clockfrequenties en pincount van de processoren is dit eveneens een niet zo voor de hand liggende en vaak een tijdrovende zaak. Sommige ontwerpers zullen, niet gehinderd door enige kennis ter zake, aanvoeren dat het tekenen van een PCB louter en alleen het omzetten is van schema verbindingen naar echte bedrading. Niets is minder waar! Het tekenen van een PCB is het met kennis van zaken creëren van een nieuwe component met eigen elektrische eigenschappen en met een aanzienlijk aandeel in het al dan niet slagen van een project! Zelfs bij de meest ervaren ontwerper, en bij het gebruik van de meest geavanceerde CAD pakketten zullen er waarschijnlijk een aantal designfouten in de eerste prototype PCB's van een complex systeem zitten. Dikwijls liggen deze problemen op het vlak van overspraak en wederzijdse koppelingen of signaalintegriteit. En ook op het vlak van EMC (Elektro Magnetische Compatibiliteit) kunnen er een aantal problemen aan het licht komen bij de eerste metingen op de prototypes. Het systeem kan immers te stoorgevoelig zijn, of kan zelf teveel storing veroorzaken. Dit heeft als gevolg dat er een aantal aanpassingen of zelfs een redesign van de PCB moet worden gedaan. Dit is een kostelijke zaak. Je kan dus maar beter deze complexe en grote PCB's vermijden. Pauwels D. Embedded systems 5
7 2.2 Een microcontrollersysteem. Wanneer we het blokschema van een microcontrollersysteem van fig vergelijken met het blokschema van een processorsysteem van fig dat is opgebouwd uit diskrete componenten dan merken we dat deze praktisch gelijkaardig zijn. Het grote verschil is echter dat bij een microcontroller het hele systeem op één chip is geïntegreerd, wat grote voordelen heeft tegenover een diskreet opgebouwd systeem. Omdat het hier gaat om een single-chip oplossing is de MTBF van het eindproduct meestal groter. Er moet meestal ook geen complexe PCB meer ontworpen worden. Uiteraard moet nog wel een PCB worden ontworpen voor je embedded toepassing, waar dan de microcontroller (single chip) in geïntegreerd wordt, maar deze is dan meestal veel minder complex dan bij een processorsysteem. Het systeem kan ook veel compacter worden gemaakt met een microcontroller dan met de diskrete oplossing, dit heeft samen met het vorige argument als gevolg dat het eindproduct economischer wordt. Op technisch vlak hebben de testingenieurs het ook gemakkelijker, immers daar de digitale bussen waar de snelle signalen over getransporteerd worden on-chip blijven zal het systeem veel sneller voldoen aan de gangbare EMC normen. Vandaar de gestadige groei van het aantal microcontrollers op de markt. Fig Een voorbeeld van een typisch microcontrollersysteem In het 8-bit segment is de meest populaire en meest gebruikte architectuur die van de Intel Doordat deze architectuur wijd aanvaardt is door een zeer groot aantal gebruikers, ontwikkelen verschillende fabrikanten nog steeds controllers met nieuwe features gebaseerd op deze architectuur. Er zijn naar schatting ongeveer een 400-tal verschillende derivaten van een oorspronkelijke 8051 op de markt, en na 25 jaar komen er nog elke dag bij. Men schat dat de helft van alle gebruikte microcontrollers gebaseerd zijn op deze architectuur. Pauwels D. Embedded systems 6
8 2.3 Wat is er op de markt? Er is tegenwoordig een groot assortiment aan verschillende microcontrollers terug te vinden op de markt. In de figuur wordt aangegeven wat de verdeling is tussen 4-bit, 8-bit, 16-bit en 32-bit controllers. Zoals blijkt zijn 64-bit en andere (DSP, 128-bit, ) tegenwoordig nog te verwaarlozen ten opzichte van de rest. Types van gebruikte controllers in embedded systemen bit 8-bit 16-bit 32-bit 64-bit Andere Fig Verdeling van de meest gebruikte architecturen naar verwerkingsbreedte. Wat opvalt is dat het overgrote deel van de huidige embedded systemen op de markt voorzien zijn van een 8-bit of 16-bit controller, terwijl het 32-bit segment nog relatief klein is. Een andere trend die we opmerken in de volgende figuur is dat door de steeds groeiende complexiteit van embedded systemen er een omgekeerde tendens is in het gebruik van controllers voor nieuwe ontwerpen. Hier is de 32-bit controller het snelst groeiende segment. Types van controllers gebruikt voor nieuwe ontwerpen bit 8-bit 16-bit 32-bit 64-bit Andere Fig Gebruik van controllers in nieuwe ontwerpen. Het komt er in de praktijk op neer dat voor een bepaalde toepassing steeds de meest geschikte controller moet gekozen worden uit het globale aanbod. Dit rekening houdend met een aantal aspecten zoals: reeds beschikbare tools voor de ontwikkeling (compilers,simulatoren, debuggers, enz ), reeds bestaande software bibliotheken, ervaring van de ingenieurs met bepaalde controllerreeksen, beschikbaarheid van componenten, economische gegevens enz. Dit is meestal geen gemakkelijke keuze. Pauwels D. Embedded systems 7
9 2.4 Een voorbeeld uit elke categorie. 4-Bit controller: bv. OKI MSM63184 Deze familie van controllers worden gebruikt voor 'low-end' toepassingen, zoals calculators, telefoons (geen GSM's of DECT toestellen ), uurwerken (in 'DIE' te verkrijgen), spelletjes, speelgoed, fietskilometertellers, thermostaat, enz Dit type heeft ingebouwde 640-dot matrix LCD drivers, wat ideaal is voor een aantal van de genoemde toepassingen. Andere types hebben een ingebouwde 'melody' module waarmee tonen, toonlengten en tempo's kunnen opgewekt worden: ideaal voor speelgoed. Een eigenschap van deze reeks controllers is dat ze low power devices zijn. Ze kunnen werken op een zeer lage voedingsspanning van 0,9V tot 2,7V en dit bij een stroomverbruik van 15µA in actieve toestand! Dit is ideaal voor batterijgevoede toepassingen. Een gevolg van dit zeer laag stroomverbruik is dat ze met een lage clockfrequentie werken, in dit geval 32KHz tot enkele honderden KHz. Bij 32KHz geeft dit een uitvoeringstijd van 61µS per instructie, zeker iets waar rekening moet mee gehouden worden. Een eigenschap van de meeste 4-bit controllers is dat ze slechts in mask ROM uitvoering of in OTP (One Time Programmable) ROM uitvoering beschikbaar zijn, en dat ze meestal van een hardware stack voorzien zijn. Hun kostprijs zit voor de meest performante controller uit deze reeks rond 3.5 voor grote aantallen. 8-Bit controller: bv. SAB 80C517 De groep van 8-bit controllers worden gebruikt in medium end toepassingen zoals: harddisk controle, keyboards, PLC's (vb. LOGO van SIEMENS), sensoren, stappenmotorsturingen, subsystemen (vb. display units), enz. De hier weergegeven SAB 80C517 van Infineon (vroeger SIEMENS) is een erg veelzijdige controller die een heleboel verschillende I/O mogelijkheden heeft meegekregen, vandaar zijn toepassing in voornamelijk industriële systemen. Deze controller is geen low power type, actief en 5V) verbruikt hij 40mA stroom, maar hij beschikt over een idle mode waar hij 15mA verbruikt en een power down mode waar hij maar 50µA verbruikt. De systeemclock moet tussen 3.5 en 16MHz liggen, het is dus geen statisch ontwerp. De SAB80C517 is een controller die meestal ROM-less gebruikt wordt, alhoewel hij door de fabrikant ook met mask ROM kan geleverd worden. Dit is een nadeel, er moet immers steeds een extern programmageheugen worden toegevoegd. De meeste fabrikanten integreren tegenwoordig minstens enkele Kbytes FLASH ROM in hun controllers die dan ISP (In System Programmable) worden. Dit is een algemene trend. De SAB80C517 is een controller die is afgeleid van de Intel 8051, waar heel wat nieuwe periferie-elementen werden aan toegevoegd. Het grote voordeel van deze familie is dat er reeds immense hoeveelheden software zijn geschreven voor deze controller-core die binnen de familie upward compatibel en dus herbruikbaar is. Naast deze periferie valt ook de hardware Division/Multiplication unit op, die 32-bit/16-bit bewerkingen en 16-bit*16-bit bewerkingen kan maken los van de CPU, wat een enorme tijdswinst kan opleveren bij wiskundige bewerkingen. De kostprijs voor dit type controller zit rond 8 voor grote aantallen. Pauwels D. Embedded systems 8
10 Fig Blokschema van de C517 controller van Infineon. Pauwels D. Embedded systems 9
11 16-bit controller: bv. XC167 van Infineon. 16-bit controllers worden gebruikt in high-end toepassingen, dit zijn meestal allemaal rekenintensieve toepassingen zoals: PID motorsnelheidsregelingen (servo-controllers), PLC's (S7 reeks van SIEMENS), industriële controlesystemen, management van verbrandingsmotoren, ABS systemen, enz. Het is zo dat industriële systemen meer en meer in staat moeten zijn om te communiceren met elkaar of met een subsysteem, hier vormt de CAN bus (industriëel- en automotive communicatie netwerk) een uitstekende oplossing. Deze chip bezit: een clockgenerator met PLL en verschillende types intern geheugen zoals 128Kbytes programma Flash, programma RAM en data RAM. Fig Blokschema van de XC167 controller van Infineon. Pauwels D. Embedded systems 10
12 32-Bit controller: bv. de MB91F361 van Fujitsu. Dit is een voorbeeld uit een reeks van controllers voor zeer rekenintensieve taken zoals: laseren high end inktjet printers, communicatie producten (routers, bridges ), high end gaming producten, muziek instrumenten, GPS systemen, next generation dashboards Zijn clocksnelheid ligt tussen 16 en 64MHz en is onder programmacontrole instelbaar, wat nuttig is om het stroomverbruik te beperken wanneer dit nodig is. Verder valt de massale hoeveelheid intern geheugen op (512 Kbytes Flash en 16Kbytes RAM) wat nuttig is voor het stockeren van een (real time) OS, wat bij 32-bit controllers meestal het geval is. Merk ook op dat deze controller beschikt over een volledige 32-bit externe bus interface zodat hij een groot extern geheugen kan aanspreken (max. 4Gbyte). Hij is dan ook ruim behuisd, met zijn 208 pins TQFP verpakking. De externe bus interface maakt de grens tussen een microcontroller en een embedded microprocessor zeer vaag. De microcontroller heeft hier in tegenstelling met een embedded processor echter nog altijd het voordeel single-chip te kunen werken. Fig Blokschema van de MB91F361 controller van Fujitsu. Pauwels D. Embedded systems 11
13 Hoofdstuk 8051 embedded controller hardware 8051,C517,ADµC832 De 8051 familie is een verzameling van controllers met dezelfde interne basisstructuur. De oorspronkelijke 8051 controller werd ontwikkeld door Intel en kwam omstreeks 1980 op de markt. Door het grote succes van deze µc ( microcontroller) voor industriële- en consumertoepassingen zijn er een groot aantal chip fabrikanten die onder licentie ook deze 8051µC gaan produceren. Men schat dat de helft van alle embedded systemen worden bestuurd door een controller uit de 8051 familie. Sommige van deze fabrikanten zoals PHILIPS, INFINEON (C517), DALLAS, ATMEL, ANALOG DEVICES (ADµC832), SILICON LABORATORIES enz. voegen aan deze µc nog interne componenten toe, terwijl ze de originele kern µc of CPU-CORE behouden. Dit heeft het voordeel dat bestaande software kan worden behouden, omdat de CPU-CORE alle originele hardware onderdelen bevat, terwijl de fabrikant toch eigen periferie componenten kan aanbrengen voor bepaalde toepassingen. Ook het feit dat de meeste ontwerpers "second-sources" willen voor hun componenten is een reden voor dit succes. Zo zijn er op het ogenblik honderden verschillende µc s die allemaal 8051 compatibel zijn, maar toch verschillen door hun specifieke extra s zoals bv. extra parallelle of seriële poorten, I 2 C Bus, AD/DA converters, extra hoeveelheid intern geheugen... Ook het tegenovergestelde doet zich voor; voor minimale toepassingen bevat de oorspronkelijke 8051 nog te veel mogelijkheden. Door een aantal parallelle poorten weg te laten, krijgt men een µc met minder aansluitpinnen en mogelijkheden, maar wel een µc die veel compacter is, bv. de ATMEL 89C5115 in een 28 pin SO behuizing. De ATMEL 89C5115 µc bestaat uit de 8051 CPU-CORE waarbij extra periferie werd toegevoegd en andere dan weer werd weggelaten. Dit heeft het voordeel dat men zeer compact en zeer economisch bepaalde toepassingen toch intelligentie kan verschaffen. Pauwels D. Embedded systems 12
14 3.1 De oorspronkelijke 8051 architectuur. De oorspronkelijke 8051µC bestaat uit: -Een 8-bit CPU ( Central Processing Unit ) die er voor zorgt dat de instructies worden opgehaald uit het geheugen, worden gedecodeerd en worden uitgevoerd. Deze CPU is geoptimaliseerd voor controletoepassingen ( bit bewerkingen). -4K bytes ROM. Voor programma opslag bytes interne RAM, voor het opslaan van variabelen, data, enz... -Twee 16 bit timer / counter circuits (TIMER0,TIMER1) -Een full duplex UART (Universele Asynchrone Receiver Transmitter) dit is een seriële poort voor commumicatie toepassingen (COM poort). - On chip clock oscillator. -4 acht bit parallel poorten. (P0,P1,P2,P3) waarvan ook twee poorten gebruikt kunnen worden als ADRES en DATA BUS om extern geheugen aan te spreken. Dit heeft als nadeel dat deze poorten dan hun functie als I/O poort verliezen. - Interrupt controller met twee interrupt niveau s, die 5 interrupt bronnen kunnen verwerken. Dit is dus de basisstructuur die we bijna altijd zullen terugvinden in de hele 8051 familie, en die compatibel is voor alle componenten in deze controllerfamilie. 3.2 De externe systeemarchitectuur. In sommige van de 8051 compatibele controllers is geen (of onvoldoende) intern programmageheugen geïntegreerd, dit is bv. zo bij de C517 van Infineon of de 8031 van Intel, die helemaal geen intern programmageheugen bezitten In deze gevallen gebruiken de controllers uit deze reeks extern aangesloten geheugenchips op dezelfde manier als een microprocessor. Op deze manier kan men extern bijkomend programmageheugen, datageheugen of bijkomende periferiechips zoals: parallelle- of seriële poorten, toevoegen aan een systeem door ze te verbinden met de bussen van de microcontroller De externe geheugen ruimte bij de 8051 reeks. De 8051 verschilt van een traditionele processor doordat hij een gescheiden geheugenruimte heeft voor data- en programmacode. Het verschil tussen programma- en datageheugen is een heel bijzondere eigenschap van de 8051 familie. De totale geheugenruimte voor programmacode is 64Kbytes, en deze kan extern of gedeeltelijk intern (bv. 4Kbyte bij de 8051) gesitueerd zijn. Ook het externe datageheugen is maximaal 64Kbytes groot. De 8051 compatibele controllers hebben bijkomend ook nog minstens 128 bytes intern datageheugen. De externe memorymap van een 8051 controller wordt in figuur weergegeven. Bij instruction fetches zal de controller instructies (code) steeds ophalen uit het code geheugen, dat intern of extern van de controller kan gelegen zijn. Extern codegeheugen wordt aangesproken onder twee voorwaarden: wanneer de /EA (External Access) pin met een logisch laag niveau is verbonden of wanneer de program counter (PC) een adres aangeeft dat groter is dan de interne geheugenruimte. Pauwels D. Embedded systems 13
15 De bedoeling is dus dat bij ROM-less (zonder intern codegeheugen) controllers vb. C517 en 8031 de /EA-pin laag gemaakt wordt, om aan te geven dat instructies extern moeten opgehaald worden. Niet alleen voor instruction fetches kan het codegeheugen aangesproken worden, maar a.d.h.v. een MOVC instructie kan ook data (bv. een tabel met constanten) die in dit codegeheugen staat gelezen worden. Wanneer het externe codegeheugen gelezen wordt, zal de /PSEN (Program Store Enable) lijn door de controller geactiveerd worden als leescontrolesignaal naar het geheugen toe. Merk op dat er geen voorzieningen zijn getroffen om naar het codegeheugen te schrijven vanuit de controller, de code zit immers in ROM geheugen! Codegeheugen Datageheugen FFFFh FFFFh Externe code geheugenruimte Externe data geheugenruimte Codegeheugen kan intern of extern zitten afhankelijk van de controller en de toestand van de EA-pin 1000h 0FFFh 0000h 0000h Fig De externe memorymap van een 8051 controller. Het externe datageheugen kan wel worden gelezen en geschreven, het moet immers geschikt zijn om variabelen te bevatten, het is dan ook uitgevoerd als RAM geheugen. Dit kan onder programmacontrole gelezen of geschreven worden met volgende instructies: MOVX en MOVX om data te lezen uit het geheugen en en om data te schrijven naar het geheugen. Waneer het externe datageheugen wordt gelezen of geschreven zal de controller respectievelijk de /RD of de /WR lijn activeren als controle signaal. Merk op dat de controller niet in staat is om uit het datageheugen instructies op te halen, daar hij hiervoor een ander leescontrolesignaal gebruikt. Pauwels D. Embedded systems 14
16 In sommige gevallen (bv. bij programma-ontwikkeling ) is het wenselijk dat een programma kan opgehaald (en uitgevoerd) worden uit het datageheugen, want daar kan men wel een programma in downloaden, het is immers schrijfbaar (RAM). Bij de 8051 reeks kan dit (het overlappen van data- en codegeheugenruimte) gedaan worden door de beide actief lage leescontrolesignalen (/RD en /PSEN) via een AND functie te combineren tot een nieuw actief laag leessignaal dat dan naar het fysische geheugen (RAM) met een bepaald geheugenbereik gaat. De externe verbindingen van een 8051 compatibele controller worden aangegeven in de figuur Fig Pinbeschrijving van een 8051 compatibele AT89s8252 in dil behuizing. De vier I/O poorten worden hier weergegeven samen met hun alternatieve functies. In een basis 8051 systeem kunnen de vier poorten als 8-bit parallelle poorten gebruikt worden. Het is belangrijk te begrijpen dat wanneer een pin gebruikt wordt met zijn alternatieve functie deze pin zijn gewone I/O functie verliest. Wanneer bv. externe periferiechips of geheugen nodig zijn, worden poort 0 en poort 2 gebruikt met hun alternatieve functie nl. als businterface. Poort 0 wordt dan de 8-bit gemultiplexte adres/data bus en poort 2 krijgt de functie toegewezen van hoogste byte van de adresbus. Enkele pinnen van poort 3 worden controlelijnen zoals /RD (read) en /WR (write). Deze poortpinnen zijn dan verloren als I/O-pinnen en er blijven in dit geval niet veel pinnen meer over die kunnen gebruikt worden als vrij programmmeerbare I/O pin. Het probleem wordt nog groter indien we ook enkele externe interrupts willen verwerken via de interruptingangen van poort 3. Ook de seriële poort en de timeringangen zitten als alternatieve functie op deze poort 3. Pauwels D. Embedded systems 15
17 Het besluit is dan ook dat we de 8051 controllers met vier poorten liefst single-chip gebruiken en niet met een externe businterface daar we immers op deze manier de voordelen (I/O) van de controller verliezen. Fig C517 systeem met externe EPROM en SRAM. Een 8051 compatibele controller met businterface gebruiken wordt pas interessant wanneer we kunnen beschikken over extra I/O poorten zoals bv. het geval is bij de C517 van Infineon, die beschikt over 8 poorten, zoals aangegeven in de figuur De RST (reset) ingang moet bij power-up even hoog worden gehouden ( bij de C517 is dit het inverse signaal, dat dus laag moet gemaakt worden) om de controller zich te laten initialiseren en met de programmauitvoering te beginnen op locatie 0000h. De oscillator pinnen (XTAL1, XTAL2) worden gebruikt om een quarts kristal aan te sluiten op de inwendige clockoscillator. Andere controlelijnen zijn: de adres latch enable (ALE) pin die gebruikt wordt om de adres/databus te demultiplexen, de program store enable (/PSEN) pin om het externe codegeheugen aan te spreken en de external access (/EA) pin die gebruikt wordt om de controller in het externe codegeheugen instructies te laten ophalen. Pauwels D. Embedded systems 16
18 3.2.2 De bus architectuur. De volgende figuur geeft de bus-structuur aan voor het aanspreken van externe geheugen- of periferie-elementen. We zien hier een 16 bit adresbus en een 8 bit databus, samen met een viertal controlesignalen. Om het aantal poortpinnen die gebruikt worden voor de adres-en databus te beperken worden de laagste byte van de adresbus en de data tijdgemultiplexed op dezelfde bus. Het Address Latch Enable (ALE) signaal wordt gebruikt om de laagste byte van het adres te latchen en zo deze twee types informatie te demultiplexen. Op deze manier kan een stabiele 16 bit adresbus worden aangeboden aan het systeem, tewijl de adres/databus daarna wordt gebruikt voor een datatransfert. De /RD en /WR lijnen controleren de datastroom van en naar de externe datageheugenruimte. De /PSEN lijn controleert de datastroom van de externe programmaruimte. In deze architectuur zijn er geen voorzieningen voor een gescheiden I/O ruimte (bv. voor andere periferiechips enz.) wat wil zeggen dat externe periferie in de geheugenruimte moet worden ondergebracht, we zeggen dat de periferie "memory-mapped" is compatibele controller P2 MSB adresbus (A8-A15) 16-bit adresbus ALE P0 LSB adres/ databus AD0-AD7 Adres latch LSB adresbus A0-A7 databus P3 RD WR PSEN Fig Busstructuur van een 8051 compatibele controller. 3.3 De externe timing De controllerclock en de relatie tot systeemtiming. De controller systeemclock bepaalt alle timing-eigenschappen van het systeem en wordt opgewekt door een interne oscillator in de controller. De XTAL1 en XTAL2 pinnen zijn de ingang en de uitgang van een inverterende versterker die kan werken als een on-chip oscillator van het Pierce type. Hiertussen sluiten we een quartskristal aan waarvan de parallelresonantiefrequentie gelijk is aan de gewenste clockfrequentie. Hoe hoger de clockfrequentie wordt gekozen, hoe sneller de controller instructies zal uitvoeren, maar hoe hoger het stroomverbruik en hoe groter de EMI. De minimum frequentie is afhankelijk van de functionaliteit van het systeem, m.a.w. de controller Pauwels D. Embedded systems 17
19 moet snel genoeg zijn om het systeem normaal te laten werken. De minimum frequentie is ook afhankelijk van de technologie waarmee de controller intern is opgebouwd (fully static?). Het bereik van de clockfrequentie wordt in de datasheet van de controller opgegeven en heeft meestal een maximum van enkele (tientallen) MHz. Men gebruikt in heel wat 8051 compatibele systemen een clock (en dus ook een quartskristal) van MHz. Men gebruikt deze frequentie omdat ze intern in de controller kan worden afgedeeld naar een standaard bitrate (communicatiesnelheid) voor de seriële poort. Naast dit quartskristal worden er ook nog twee capaciteiten vanuit XTAL1 en XTAL2 verbonden naar de massa, zoals wordt aangegeven in de figuur De datasheet van een parallel resonant kristal geeft de load capaciteit weer, wat de serieschakeling is van C1 en C2. De waarde van C1 en C2 ligt meestal tussen 30 en 40 pf. Het vergroten van de capaciteiten heeft als gevolg dat de start-up tijd van de oscillator stijgt tot het punt waar de oscillator niet meer start. De capaciteitswaarden verminderen heeft als gevolg dat de oscillator kan gaan oscilleren op een hogere harmonische (overtone) van de grondfrequentie. Daar dit een circuit is waar signalen worden gegenereerd van relatief hoge frequentie worden er ook enkele eisen gesteld aan de fysische layout van het circuit (EMI). De signaalbanen op de PCB (Printed Cicuit Board) die het kristal, de capaciteiten en de controller oscillatorpinnen verbinden, moeten zo kort en zo breed mogelijk zijn om parasitaire inductantie en weerstand te beperken. Het kristal en de capaciteiten moeten dus zo kort mogelijk bij de oscillatorpinnen van de controller geplaatst worden, terwijl de signaalbanen naar de oscillator moeten afgeschermd worden van andere signalen om overspraak te vermijden, dit doet men meestal met een massavlak of met een massaring rond de signaalbanen. Fig Oscillatorcircuit dat meestal wordt gebruikt bij controllers. De systeemclock bepaalt de interne clockphases, states en machinecycli m.a.w. de snelheid waarmee externe bustransacties en instructies worden uitgevoerd. Een machine cyclus bestaat uit 6 toestanden (states) en is 12 oscillator periodes lang. Elke state is onderverdeeld in een phase1 (P1) en een phase2 (P2). Een machinecyclus bestaat dus uit 12 oscillatorperiodes die genummerd worden van S1P1 (State1, Phase1) tot S6P2. Rekenkundige en logische bewerkingen vinden typisch plaats gedurende phase1 en register naar register transferts gedurende phase2. Pauwels D. Embedded systems 18
20 Fig Relatie tussen de clock en de verschillende states en machinecycli. De uitvoering van een één-cyclus instructie start op S1P2 (stijgende flank PSEN), wanneer de opcode wordt binnengelezen in het instructieregister. Als het een twee-byte instructie is, wordt de tweede byte gelezen tijdens S4 van dezelfde machinecyclus. Wanneer het over een één-byte instructie gaat, zal er ook tijdens S4 een byte gelezen worden (dit is de volgende opcode) maar deze wordt niet verder gebruikt. In elk geval is de uitvoering klaar op het einde van S6P2. De meeste 8051 instructies worden uitgevoerd in één machinecyclus, maar sommige doen er twee of vier cycli over. Pauwels D. Embedded systems 19
21 3.3.2 Timing van de buscontrolesignalen. De timing en de logische gedachtengang van de controlesignalen is belangrijk om de buswerking van een 8051 controller te begrijpen. De timingdiagramma's voor het lezen van een byte uit het programmageheugen en het lezen en het schrijven van een byte uit het datageheugen worden hier in figuur weergegeven en spreken voor zich. Fig Controlesignalen bij verschillende types van busacces. Pauwels D. Embedded systems 20
22 Alle buscycli starten met het aanbieden van de adresinfo op P0 en P2. Op de dalende flank van ALE wordt de info op P0 in de externe latch opgeslagen, het volledige 16 bit adres is nu stabiel tot het einde van de buscyclus. P0 kan nu veranderen van waarde en de data kan nu weergegeven of gelezen worden langs P0. Voor het ophalen van een instructiebyte uit het programmageheugen zal de stijgende flank van de /PSEN lijn de data (programmabyte) binnenlezen. In het geval het datageheugen wordt aangesproken zal de stijgende flank van het /RD signaal aangeven wanneer de data gelezen wordt, de data moet door het geheugen tegen deze tijd stabiel op de databus geplaatst zijn. Bij het schrijven naar het datageheugen zal de stijgende flank van /WR aangeven dat de data stabiel op de databus zit en dat de geheugencomponent deze mag latchen (lezen). Het ALE signaal wordt gebruikt om de adres/data info op P0 te demultiplexen, maar zelfs bij het uitvoeren van intern opgeslagen code zal dit signaal worden gegenereerd, het is dus een nuttig signaal voor debugdoeleinden, dat aangeeft of de controller daadwerkelijk code uitvoert. In single-chip toepassingen kan het ALE signaal, afhankelijk van het type van controller, softwarematig worden uitgeschakeld wat nuttig is voor het beperken van EMI, ALE wordt immers anders geactiveerd met een constante frequentie van 1/6 van de oscillatorclock wat aanleiding kan geven tot elektromagnetische straling. 3.4 I/O systemen. De 8051 gebaseerde controllers hebben naast twee interne timers meestal minstens vier parallelle poorten en één seriële poort als I/O. Zoals reeds eerder werd aangehaald heeft door het beperkte aantal pinnen van een behuizing (bv. 40 pins dip) bijna elke pin een alternatieve functie toegewezen gekregen. Het nadeel is dat wanneer deze pinnen met hun alternatieve functie worden gebruikt, ze natuurlijk niet tegelijk als gewone I/O pinnen kunnen gebruikt worden. Eigenlijk kan dit wel, maar dit kan nogal vreemde gevolgen hebben, de gebruiker moet dan wel weten wat hij doet. Na een RESET zijn de vier poorten (I/O pinnen ) allemaal geconfigureerd als Input pinnen, en zijn de alternatieve functies uitgeschakeld. Over de verschillende I/O blokken die in de controllers aanwezig (kunnen) zijn zullen we het hebben in het hoofdstuk 'Interne bouwstenen van een microcontroller'. Pauwels D. Embedded systems 21
23 Hoofdstuk 4 Software software basics. Er bestaan verschillende programmeertalen voor de 8051 compatibele controllers. Ze kunnen geprogrammeerd worden in assembler of in één van de verschillende beschikbare 'hogere' programmeertalen zoals C, BASIC, PL/M of Forth. Om de verschillende mogelijkheden te kunnen begrijpen, is het belangrijk om machinetaal, assembler en de hogere programmeertaal te begrijpen. Machinetaal bestaat uit getallen die de microcontroller interpreteert als commando's en data die aangeven hoe een taak moet uitgevoerd worden. Een voorbeeld hiervan is de sequentie 02h,12h,34h in het programmageheugen. Deze getallen worden door de controller geïnterpreteerd als een sprong (02h, de operation code of opcode) naar een geheugenlocatie 1234h (de operand of data). De instructies voor een 8051 controller kunnen bestaan uit 1, 2 of 3 bytes, afhankelijk van de hoeveelheid data die nodig is in de instructie. Al de programma's in de verschillende programmeertalen die beschikbaar zijn, moeten eerst worden omgezet naar machinetaal vooraleer ze bruikbaar zijn voor de controller. Elke instructie die kan uitgevoerd worden door de controller heeft een unieke opcode (eerste getal). Daar opcodes nogal moeilijk zijn om mee om te gaan voor de programmeur worden ze voorgesteld door een engelstalige afkorting of samentrekking van een aantal woorden (Mnemonic) die aangeeft wat de instructie doet. Dit noemen we een assembler instructie. De instructie die hoort bij de vorige getalsequentie is LJMP 1234h. De assemblerinstructie is de vorm die bruikbaar is voor de programmeur, tewijl de machinetaal door de controller wordt gebruikt. De instructieset zijn alle mogelijke instructies (op het laagste niveau) die een controller kan uitvoeren en die dus ter beschikking staan van de programmeur om een programma te schrijven. De 8051 instructieset is geoptimaliseerd voor 8-bit en single bit controletoepassingen. Zo zijn er heel wat instructies die toelaten 1-bit variabelen (Booliaanse variabelen) te manipuleren. Deze bitvariabelen kunnen bits zijn van interne poorten of van verschillende special-function registers of, bits uit interne bit-aanspreekbare RAM locaties voor het gebruik als flags. Dit is nuttig voor heel wat controle- en logische functies die Booliaanse bewerkingen vereisen. Dit wordt duidelijk in de volgende delen van de tekst. Assembler programma's laten totale controle toe over uitvoeringssnelheid en geheugengebruik, dit betekent dat de programmacode compacter kan gemaakt worden dan bij een hogere programmeertaal en de uitvoeringssnelheid perfect kan gecontroleerd worden. Pauwels D. Embedded systems 22
24 Wanneer men over weinig geheugen beschikt en de timing kritisch is kan het aangeraden zijn om in assembler te programmeren. Het grote nadeel van assembler is dat de programmeur elk detail van het programma voor zijn rekening moet nemen, inclusief geheugen allocatie voor code en data, registergebruik, en de controle over de opslag van variabelen. Hogere programmeertalen verlossen de programmeur van de details die gepaard gaan met assemblerprogrammatie. Geheugen allocatie, beveiliging van variabelen, stackgebruik en vele andere details worden afgehandeld door de compiler. Het nadeel hiervan is echter dat de programmeur de controle verliest over deze details. Gewoonlijk zal de machinecode die resulteert van een programma, dat werd gemaakt in een hogere programmeertaal, beduidend groter zijn en trager werken dan de code uit een assembler programma dat dezelfde taak uitvoert. De keuze van de taal is afhankelijk van de aard van het project. Een programma schrijven op een succesvolle manier, in om het even welke taal vereist echter een grondige kennis van de controller en zijn periferiebouwstenen en van het totale embedded systeem. Hierdoor is het schrijven van embedded software een uitdagender en dikwijls veel complexer geheel dan het schrijven van desktop software. 4.2 De interne 8051 familie architectuur. De CPU van de 8051 familie is een 8-bit processor die o.a. bestaat uit volgende delen: een instructiedecoder, een arithmatic section met hierin de ALU of Arithmatic Logic Unit (rekenkundige en logische eenheid), een program controller, een timing- en controledeel en een array van registers (8-bit geheugenlocaties in de controller) die aanspreekbaar zijn door de programmeur. Elke programma-instructie wordt door de instructie decoder ontcijferd, en de juiste interne timing signalen worden door de timing/controle-eenheid gegenereerd voor het controleren van de interne werking van de verschillende delen van de CPU. De Timing/Controle eenheid zorgt voor de syncronisatie van de dataflow in en uit de CPU. Hij coördineert de verplaatsing van data op de interne en externe bussen van de microcontroller en hij genereert de /PSEN, /RD en /WR signalen waarvan eerder sprake. De arithmatic section zorgt ervoor dat de data op de juiste manier bewerkt wordt en bestaat uit de ALU ( Arithmatic & Logic Unit), ACCU of A werkregister, B hulpregister, en PSW (Processor Status Word). De ALU is verantwoordelijkvoor het rekenkundig bewerken van bytes. Hij handelt de optelling, aftrekking, vermenigvuldiging, deling en de logische bewerkingen af zoals 'and'en en 'or'en van data. De ALU zit intern in de CPU en staat niet rechtstreeks onder controle van de programmeur. Het enige deel van de CPU waar de programmeur directe controle over heeft zijn de registers. Registers zijn in dit geval byte-brede latches (geheugenlocaties) die gebruikt worden om data te stockeren en te manipuleren. De registers bij de 8051 familie bevatten: een accumulatorregister (ACCU of gewoon A) dat ingangsdata bevat voor de rekenkundige bewerkingen die met de ALU worden uitgevoerd. De ACCU is ook het register dat het resultaat bevat na een rekenkundige bewerking met de ALU, een 16 bit datapointer register (DPTR), dat gebruikt wordt voor het aanwijzen van data die in het externe geheugen zitten en die moeten worden gemanipuleerd, Pauwels D. Embedded systems 23
25 het PSW is een geheugenplaats (register) met een speciale functie. Het bestaat uit een aantal bits die informatie vasthouden over de processor status, of m.a.w. over de instructies die reeds uitgevoerd werden door de µc. Fig Het processorstatusregister van een 8051 controller. De CY bit (CarrY flag), is een bit die aangeeft of er een overflow of underflow conditie is opgetreden, tijdens een vorige bewerking. De carry-bit wordt ook gebruikt als accumulator bij Booleaanse (bit) bewerkingen. De RS0 en RS1 bits worden gebruikt om één van de vier registerbanken te selecteren zoals aangegeven in de tabel onderaan in figuur De AC (Auxiliary Carry) wordt gebruikt bij BCD bewerkingen en geeft een overflow aan van de LS nibble naar de MS nibble. De P bit geeft de pariteit aan van de accu. P=1 bij een oneven aantal 1's in de accu. De twee bits F0 en F1 zijn general purpose flagbits voor de gebruiker. een reeks general-purpose registers (registerbanken) voor opslag van data. De program controller controleert de sequentie waarin de instructies worden uitgevoerd door de CPU. Een 16-bit Program Counter (PC) register bevat steeds het adres van de volgende uit te voeren instructie. Het PC register wordt beïnvloed door de spronginstructies. Al deze registers zitten in het inwendige datageheugen van de microcontroller. De registers van een 8051 controller bestaan uit twee soorten registers, de special-function registers (SFR's) en de registerbanken. Pauwels D. Embedded systems 24
26 4.2.1 De interne geheugen architectuur. De 8051 familie heeft intern een aantal datageheugenlocaties (RAM) die het mogelijk maken de controllers single-chip te gebruiken. Het interne datageheugen is opgedeeld in twee functionele blokken. Eén blok van 128 bytes data RAM en één blok van 128 mogelijke Special Function Registers ook wel SFR s genoemd. De interne geheugenindeling wordt aangegeven in de figuur Fig Intern datageheugen van een 8051 controller. Het data RAM gedeelte bestaat op zijn beurt uit twee delen: de gewone interne geheugenlocaties voor het opslaan van data en een deel geheugenlocaties die we registers noemen. Dit is een blok van general purpose registers die gegroepeerd zijn als 4 banken van acht registers die we R0 tot R7 noemen. De registers van dit registerblok dienen voor het opslaan van tijdelijke gegevens, het zijn de normale processorregisters. Zie figuur De SFR s zijn geheugenlocaties met een speciale functie in de controller zoals de CPU registers (bv. de ACCU, B,het PSW en pointers zoals SP, en de datapointer). Of het zijn geheugenlocaties waarvan de geheugencellen gebruikt worden om de op de chip aanwezige I/O componenten te besturen. Zo zijn oa. de poorten ook SFR's. De data die in deze SFR s geplaatst wordt, wordt door de bijhorende I/O component (bv, een timer) gebruikt om zijn werking te bepalen. Op deze manier worden de interne periferiecomponenten via software instelbaar. Een belangrijke eigenschap van de SFR's is hun resetwaarde. Na een power-up of reset van de 8051 wordt in de meeste SFR's een specifieke opstartwaarde geplaatst. Dit is belangrijk, want zo kan men interne periferie uitschakelen om te voorkomen dat er na het opstarten onvoorspelbare fouten zouden optreden. Zo worden bv. de poorten na een reset allemaal op een logisch 1 niveau (input mode) gezet, iets waar men in de software rekening moet mee houden. Pauwels D. Embedded systems 25
27 De SFR's nemen meestal ook niet alle 128 beschikbare geheugenadressen in. De niet gebruikte adressen kunnen echter niet gebruikt worden voor dataopslag, de geheugencellen op deze adressen bestaan gewoon niet. Dit wordt aangegeven in figuur Fig SFR's bij een 8051 compatibele AT89S8252. Microcontrollers hebben als voordeel t.o.v. processoren dat hun SFR's intern zitten en dat ze kunnen worden aangesproken als CPU registers. Een controller kan de SFR's dus snel aanpassen en kan ook met SFR's rekenen, iets wat geen enkele processor kan. Om al de interne geheugenlocaties (datalocaties, registers en SFR's) aan te spreken zijn er 256 adressen van 00h tot FFh voorzien. Om deze twee soorten geheugenlocaties, data of SFR's, aan te spreken wordt er gebruik gemaakt van instructies met directe en indirecte adressering. Bij directe adressering staat het adres van de geheugenlocatie waarop de instructie betrekking heeft in de operand (na de op-code) van de instructie zelf. De hoogste 128 bytes interne locaties (80h tot FFh) zijn voorzien voor de SFR s. Voor de SFR s kan enkel de directe adressering gebruikt worden. Bij indirecte adressering staat in de operand van de instructie het adres van een andere interne geheugenlocatie, zeg maar register, en die geheugenplaats bevat op haar beurt het adres van de geheugenplaats die we willen aanspreken met de instructie. Dit register kan dus beschouwd worden als een pointer naar een interne locatie. Dit lijkt zeer omslachtig doch voor veel toepassingen o.a. het aanspreken van tabellen is het een zeer handige adresseermethode. Pauwels D. Embedded systems 26
28 De laagste 128 bytes, van de interne data RAM, met de adressen 00H tot 7FH kunnen volgens beide adresseermethodes aangesproken worden. De meeste varianten van de 8051 famile hebben net zoals de 8052 (een 8051 compatibele opvolger) nog 128 bytes extra intern datageheugen. Er zijn in de architectuur echter maar 256 interne geheugenlocaties voorzien en deze zijn reeds door de vorige blokken ingenomen. Als oplossing voor dit probleem heeft men de 128 extra geheugenlocaties op dezelfde interne adressen geplaatst als de SFR's, dus van 80h tot FFh. Zie figuur Er is toch geen conflict tussen beide overlappende delen doordat men ervoor zorgde dat de extra locaties enkel via indirecte adressering kunnen aangesproken worden, waar dit voor de SFR's, die op dezelfde adressen zitten, met directe adressering het geval was. Fig Intern datageheugen van een 8052 compatibele controller Waarom wordt er nu een onderscheid gemaakt tussen de gewone interne RAM locaties en de registers? De lengte (het aantal bytes) van de opcode is heel belangrijk. De opcode van een instructie is de bitcombinatie in de instructie, die aangeeft over welke instructie het gaat. Hoe langer de opcode, hoe meer tijd de CPU nodig heeft om de instructie uit het geheugen te halen en uit te voeren. Voor een µc waar het programma in het interne codegeheugen (bv. Flash of eprom) zit is dit ook heel belangrijk, want deze hoeveelheid geheugen is beperkt. De fabrikanten besteden dan ook de nodige aandacht aan het inkorten van opcode s. Ideaal zijn instructies die 1 byte lang zijn, de CPU kan ze dan in één maal ophalen. Dit is onmogelijk voor instructies die het adres bevatten van een interne geheugenlocatie, want dit adres neemt zelf al één byte in beslag! Om dit op te vangen geeft men bij een 8051 compatibele µc acht geheugenlocaties een drie bit adres. Pauwels D. Embedded systems 27
29 Dit laat toe om in een 8-bit opcode, waar er dan nog 5 bits vrij zijn, ook nog de aard van de instructie te omschrijven. De instructies die dit 3 bit adres gebruiken kunnen dus enkel voor die 8 geheugenlocaties gebruikt worden. Deze 8 geheugenlocaties behoren tot de set van 128 locaties die zowel direct als indirect adresseerbaar zijn. Ze behouden echter ook ten allen tijde nog hun normaal 8 bit adres. Omdat deze instructies veel gebruikte instructies zijn, ze zijn immers snel, had men ze graag laten inwerken op meer geheugenlocaties, en dit zonder de opcode te verlengen. Dit kan enkel als meer adresbits gebruikt worden, waardoor er dan weer minder bits ter beschikking staan om de aard van de instructie aan te geven. De oplossing voor dit probleem is de extra adresbits niet in de opcode te stoppen, maar ze in een SFR onder te brengen. Bij een 8051 compatibele CPU zitten er zo 2 extra adresbits (RS1 en RS0) in het PSW register ( Processor Status Word ). De programeur kan deze 2 extra adresbits aanpassen, en er kan op deze manier met deze 2 bits een selectie gemaakt worden tussen 4 groepen (BANKEN) van telkens 8 geheugenlocaties met een 3-bit adres nl. registers R0 tot R7. Deze 4 BANKEN van telkens 8 registers zitten onderaan in de laagste 128 databytes. De 8 registers hebben ook telkens dezelfde naam gekregen, R0 tot R7. De registerstructuur in de laagste 128 interne databytes wordt weergegeven in figuur waar ook de 4 registerbanken terug te vinden zijn. Fig Registerstructuur in de laagste 128 interne geheugenlocaties. Merk op dat na de vier registerbanken (vanaf adres 20h) er 16 bytes datageheugen zitten die ook op bitbasis (flags) kunnen aangesproken worden met het aangegeven bitadres. Dit kan via één van de bitmanipulatie-instructies (bit set, bit clear, bit and, bit or, bit complement, bit Pauwels D. Embedded systems 28
30 test) die typisch zijn aan deze controller. Ze kunnen echter ook ten alle tijde als een gewone byte worden aangesproken. Het deel van 30h tot 7Fh (scratch pad area) kan gebruikt worden voor het opslaan van data en variabelen Programma- flow en controle. Zoals reeds gezegd, zijn alle microprocessoren essentiëel sequentiële machines. Ze kijken naar een lijst van instructies (machinecode) en voeren ze één na één uit tot de voedingsspanning wegvalt of tot ze softwarematig gestopt worden (low power gebruik). Het 16-bit register dat aangeeft waar de volgende uit te voeren instructie opgeslagen is noemt men de Program Counter (PC). De inhoud van de PC wordt bij het begin van elke buscyclus gebruikt om de adresbus te sturen. Bij het uitvoeren van de instructie zal de PC aangepast worden zodat het adres van de volgende instructie aangegeven wordt. Dit kan het adres zijn van een instructie die in het codegeheugen volgt op de instructie die wordt uitgevoerd. Maar bij spronginstructies is dit het adres waar naartoe gesprongen moet worden. Na een RESET wordt de PC op 0000h gezet. Op dit fysisch adres moet dus het programma starten De systeemstack. De STACK van een µp of µc systeem is een deel van het RAM geheugen dat gebruikt wordt voor het tijdelijk opslaan van gegevens, en heeft een FILO (first-in, last-out) structuur. De stack van een i8051 compatibele microcontroller kan alleen in interne RAM geplaatst worden. De gegevens die in de stack bewaard worden zijn de terugkeeradressen bij: een subroutineoproep via een CALL instructie, of bij een interrupt-routine oproep via interruptverwerking. Bij de stack hoort een Stack Pointer (SP), wat ook een SFR is. Deze SP geeft de eerst volgende vrije plaats aan in de STACK (RAM geheugen) waar de controller een terugkeeradres kan bewaren bij een CALL of INTERRUPT. Na RESET staat de SP op 07H (default waarde). De SP wordt automatisch geïncrementeerd, voordat data wordt gestockeerd op de plaats waar de SP naar wijst ( pre-increment ) bij een call instructie, de SP wordt gedecrementeerd nadat de data werd gelezen ( post-decrement ) tijdens een return ( RET,RETI) instructie. Dit mechanisme verloopt trouwens volledig automatisch! Als programmeur moet u hiervoor niets ondernemen. De stack kan zich overal in interne RAM bevinden, en moet dus niet starten op adres 08H. De programmeur kan dit veranderen door in de SP een andere waarde te plaatsen a.d.h.v. een MOV SP,# xx instructie, waar xx staat voor het adres waar de stack moet starten. Dit automatische mechanisme bij een subroutine-call wordt aangegeven in fig De programmeur kan ook zelf data op de stack plaatsen, en data van stack halen, door gebruik te maken van resp. PUSH en POP instructies. Hij moet dit echter doen met de nodige omzichtigheid, immers de stack heeft een FILO structuur. Data-elementen die in een bepaalde volgorde op stack worden geplaatst moeten er in de omgekeerde volgorde weer worden afgehaald. Indien de programmeur in een subroutine, of in een interruptroutine, (terugkeeradres staat telkens op stack) data-elementen op de stack plaatst, moeten deze er weer worden afgehaald vooraleer de subroutine of interruproutine wordt verlaten. Pauwels D. Embedded systems 29
31 Op deze manier zal de RETurn instructie het correcte terugkeeradres van de stack kunnen halen en op de juiste plaats terugkeren in de onderbroken routine. In het andere geval zullen twee databytes van stack worden gehaald en zullen deze door de controller worden aanzien als het terugkeeradres. De controller maakt dan een sprong naar een willekeurig programma-adres. Onnodig te zeggen dat dit tot zeer ergerlijke fouten en willekeurig gedrag van het systeem kan leiden. Adres van de instructies 16-bits XXYY Externe controllergeheugen met instructies instructie n instructie n+1 instructie n+2 instructie n+3 call subroutine instructie n+5 instructie n Stack-pointer register (wijst naar intern geheugen in de controller) SP+1 SP+1 SP 8-bit SP na reset Interne controllergeheugen YY XX 07h 08h 09h 0Ah 0Bh 2 opslaan LSB opslaan 4 MSB 5 PC = subroutine 9 Jump to XXYY Program counter 16-bit PChigh PClow subroutine 6 Jump to subroutine return 7 8 PChigh =XX SP-1 PClow =YY SP-1 Fig Voorbeeld van stack-werking bij een CALL en RETurn instructie. Pauwels D. Embedded systems 30
32 In de figuur wordt aangegeven hoe het stackmechanisme werkt bij een CALL- en een RETurn instructie. Als vertreksituatie nemen we aan dat de SP nog op de resetwaarde 07h staat en dat de controller instructies uitvoert in een hoofdroutine en zo bij de 'CALLsubroutine' instructie komt. De controller zal een routine op het adres 'subroutine' moeten gaan uitvoeren, maar eerst zal de SP met één worden verhoogd en zo wijzen (1) naar de volgende vrije locatie 08h op de stack. Dan zal de controller de low byte van het adres van de volgende uit te voeren instructie (YY) op stack plaatsen (2), deze haalt hij uit de PC. De volgende actie is de SP weer met één verhogen tot locatie 09h (3) en ook de high byte (XX) van het adres op stack plaatsen (4). De PC kan nu worden geladen met het adres 'subroutine' (5) zodat de controller op dit adres de volgende instructie gaat ophalen (sprong naar subroutine). Bij het beëindigen van de subroutine zal de RETurn instructie als gevolg hebben dat de high byte van de PC zal geladen worden met de inhoud van de geheugenlocatie waar de SP naar wijst (7) en dat de SP daarna met één wordt verminderd. Daarna wordt op het adres waar de SP naar wijst de byte opgehaald die in de low byte van de PC wordt geplaatst (8) waarna de SP weer met één wordt verminderd. De SP staat nu op de waarde die hij had bij aanvang. Doordat de PC nu is geladen met het terugkeeradres (XXYY) dat op stack werd geplaatst bij de CALL, zal de vogende instructie op dit adres worden opgehaald, de controller is m.a.w. terug naar de hoofdroutine gesprongen. Dit mechanisme verloopt volledig automatisch bij een CALL en RET instructie en de programmeur moet hiervoor geen acties ondernemen. Pauwels D. Embedded systems 31
33 assembler Adressering. Om de instructieset van de controller te begrijpen, moet men eerst nagaan hoe de controller data in het systeem kan aanspreken of adresseren. De algemene vorm van een instructie, met tussen vierkante haakjes een parameter die niet steeds aanwezig is of [OPTIONEEL] wordt hier aangegeven. MNEMONIC [BESTEMMING],[BRON] MNEMONIC: BESTEMMING: BRON: de omschrijving van wat de instructie doet. vb: MOV = VERPLAATS ADD = TEL OP... het register waarop de bewerking wordt uitgevoerd, of de bestemming van het te verplaatsen getal, soms optioneel. vb: 030H = adres register 30H A = de accumulator R0 = verkort adresseerbaar register,... het register of het getal dat aangeeft van waar de tweede operand moet komen, of wat de tweede operand is. Deze parameter is niet steeds aanwezig (optioneel). MOV A,A MOVC Rn,Rn DPTR,#GETAL 8/16 BIT C BIT,@A+DPTR,@A+PC,C,BIT MOV: Mnemonic voor de verplaats instructie tussen registers of bits. MOVC: Mnemonic voor de verplaats instructie met het externe codegeheugen. MOVX: Mnemonic voor de verplaats instructie met het externe datageheugen. EERSTE KOLOM: Alle mogelijke bestemmingen. TWEEDE KOLOM: Alle mogelijke bronnen. Niet alle combinaties tussen de kolommen zijn mogelijk. Om na te gaan wat welke mogelijkheden toegelaten zijn moet de instructieset geraadpleegd worden. Pauwels D. Embedded systems 32
34 Verklaring van bronnen en bestemmingen: A: accumulator (rekenregister) Rn: werkregister uit de huidig geselecteerde bank (twee bits in PSW) een 8 bit hex getal dat het adres is van een direct adresseerbaar register vb: 15H i kan 0 of 1 zijn. Die twee registers kunnen gebruikt worden voor indirecte wil zeggen dat indirecte adressering gebruikt wordt. de Data PionTeR is het enige register dat door de CPU als een 16 bit register kan gebruikt worden. Het bestaat uit twee 8 bit registers (DPH en DPL), die afzonderlijk ook aangesproken kunnen worden. Voor sommige instructies worden ze als een geheel gezien. De DPTR is het enige register dat met een instructie aangepast of geladen kan worden als 16 bit register. de DPTR is het enige register dat gebruikt kan worden voor indirecte adressering met een 16 bit adres. Dit is ook de enige manier om gegevens uit het external data- of code memory op te halen. Dit is een omslachtige werkwijze, aangezien eerst de datapointer geladen moet worden met het adres van de variabele, alvorens via de indirecte adressering de variabele gelezen of geschreven kan worden. Als bron of bestemming in de CPU kan alleen de accu gebruikt idem voorgaande, maar bij de waarde in de DPTR, wordt voor de duur van de instructie, de waarde van de accu opgeteld. Dit is een vorm van geïndexeerde #getal: PC staat voor Program Counter of programmateller. Dit 16 bit register wordt door de CPU gebruikt om bij te houden op welk adres de volgende opcode gelezen moet worden. Deze adressering werkt enkel met code memory. Dit is een vorm van geïndexeerde adressering. Wordt het '#' teken gebruikt, voor een getal, dan wordt het getal als een numerische waarde gezien, in het andere geval zal de assembler het getal als een adres zien (directe adressering). Het getal is normaal 8 bit, alleen voor het laden van de DPTR, wordt een 16 bit getal toegelaten. C: carry vlag in de PSW. BIT: elke bit die via bitadressering bereikbaar is. Pauwels D. Embedded systems 33
35 Enkele voorbeelden kunnen dit duidelijk maken. MOV A,#03FH ;plaats in de accu het getal 3FH Het getal dat in de accu moet komen staat expliciet als operand in de binaire instructie. We spreken in dat geval van immediate adressering. Getallen mogen in verschillende notaties ingegeven worden: 030H = 030 of 030D = 030O = het getal 30 HEXADECIMAAL (16 tallig talstelsel) het getal 30 in het decimale talstelsel. Het vertaalprogramma (ASSEMBLER) zal dit getal wel eerst omzetten naar hexadecimaal, alvorens het in de instructie te plaatsen. 030 of 030D wordt dan 01EH. De omrekening zie je enkel in de opcode, ze is niet merkbaar in de broncode (naam.asm file), en ook niet in de listing (naam.lst). octaal talstelsel. Verder verloopt de verwerking zoals bij de decimale getallen. Het getal wordt 18H.(Dit talstelsel passen we niet toe.) B = binair talstelsel. Dezelfde redenering is van toepassing zoals bij de decimale getallen. Het getal wordt 21H. Merk op dat er voor elk getal een extra 0 wordt ingegeven. De 0 heeft geen numerische betekenis, en is enkel nodig om de assembler een foutloze omzetting te laten uitvoeren. De assembler herkent getallen alleen wanneer ze met een cijfer tussen 0-9 beginnen. Voor hexadecimale getallen die beginnen met de letters A-F is de extra 0 noodzakelijk. Uit gewoonte plaatsen we de 0 er overal bij. MOV A,03FH ;neemt een kopie van de inhoud van het ;register met adres 3FH naar de accumulator Alle adressen tussen 00H en FFH zijn toegelaten. Deze registers bevinden zich in de controller. Voor de onderste 128 registers is er geen verwarring mogelijk omdat zij slechts een keer in de controller aanwezig zijn. Voor de adressen 80H-FFH zijn er bij de meeste 8051 compatibelen (vanaf 8052) per adres twee registers aanwezig (zie figuur ). Omdat het adres van het bronregister expliciet in de instructie is opgenomen spreken we van directe adressering. Voor de mogelijke talstelsels die gebruikt mogen worden bij de ingave verwijzen we naar de immediate adressering. MOV A,Rn ;zet in de accumulator de inhoud van ;een verkort adresseerbaar register. In de figuur kan je zien dat er 8 registers zijn waarop de verkorte adressering van toepassing is: R0 t.e.m. R7. Ze worden ook wel een registerbank genoemd. De verkorte adressering geeft kortere (en dus ook snellere) opcodes dan andere vormen van directe adressering. In de controller zijn er 4 registerbanken aanwezig. De verkorte adressering is slechts van toepassing op één bank. In de PSW zijn er twee bits die bepalen welke bank dat is. De PSW is opgenomen in figuur Pauwels D. Embedded systems 34
36 Bovendien zijn er instructies die alleen gebruikt kunnen worden met de verkorte adresseerbare registers (R0-R7). Samen met de accumulator en het PSW register vormen deze registers de meest gebruikte registers in een programma. MOV ;in Ri (i=0 of 1), staat een adres dat verwijst naar het eigenlijke ;register dat we wensen te lezen. Dit type van instructies wordt vooral gebruikt voor het adresseren van tabellen. Het wordt indirecte adressering genoemd omdat het adres van het te lezen/schrijven register niet expliciet in de instructie voorkomt. Wel wordt de plaats aangegeven waar dat adres te vinden is. Er zijn zo maar twee mogelijke plaatsen: R1 of R0 van de huidig geselecteerde registerbank. De vier instructies die werden besproken geven bijna alle mogelijke manieren aan om gegevens tussen registers te verplaatsen. Om dit te illustreren hebben we MOVE instructies gebruikt. Ook bij de andere instructies zijn dezelfde adresseringsmethoden mogelijk. Bij het maken van een programma in assembler kan je best met de instructielijst controleren of de instructie die je wenst te gebruiken wel bestaat. In de volgende drie voorbeelden geven we aan hoe het mogelijk is gegevens van en naar het externe geheugen te verplaatsen. Hier kán enkel indirecte adressering gebruikt worden via het 16 bits DPTR register. Omdat het externe adres 16 bit groot is, kan R0 of R1 niet meer gebruikt worden. Die zijn immers maar 8 bit groot. Daarom zijn er in de controller 2 SFR s DPH en DPL beschikbaar die samen een 16 bit DPTR register vormen. Ze zijn zowel afzonderlijk, als twee 8 bit SFR registers bruikbaar, of als één 16 bit SFR. Sommige instructies gebruiken enkel de 16 bit samenvoeging. Die zijn herkenbaar door dat in de mnemonic de afkorting DPTR gebruikt wordt. Om ze als 8 bit registers aan te spreken kan men alle die instructies gebruiken die van toepassing zijn op SFR s (directe adressering). MOVX A,@DPTR ;lezen van het externe data RAM geheugen. ;schrijven naar het externe RAM geheugen. In beide gevallen bevat de DPTR het adres van de externe RAM locatie die gelezen/geschreven wordt. Het lezen of schrijven naar externe RAM kan enkel via de accumulator gebeuren. MOVC A,@A+DPTR ;lezen van het codegeheugen. Het externe programmageheugen kan enkel gelezen worden via de accumulator. Vermits het een ROM geheugen is, heeft het geen zin er naar te schrijven. Er zijn dan ook geen hardware mogelijkheden om dat te doen. Pauwels D. Embedded systems 35
37 4.3.2 De 8051 instructieset. De 8051 instructieset is geoptimaliseerd voor 8-bit controletoepassingen. Er zijn enkele adresseringsmethodes voor het snel aanspreken van variabelen in interne RAM locaties. De instructieset is ontworpen om op een vlotte manier bit-variabelen te manipuleren voor controlesystemen en systemen waar veel logische bewerkingen moeten gebeuren. Een overzicht van de 8051 instructieset kan een indruk geven van de verschillende mogelijkheden. Rekenkundige bewerkingen. Tabel Instructies voor rekenkundige bewerkingen. De 8051 CPU core is accumulator gebaseerd, dit heeft gevolgen voor de instructieset. De meeste bewerkingen kunnen enkel met deze ACCU (A) gebeuren, wat als gevolg heeft dat er in een programma ook heel wat instructies zullen zitten die eerst de nodige data in de ACCU plaatsen en daarna het resultaat weer terug in geheugenlocaties of registers copieëren. Merk op dat elke byte van het inwendige datageheugen kan worden geïncrementeerd of gedecrementeerd zonder gebruik van de ACCU. De DAA is bedoeld voor BCD bewerkingen. Bij BCD bewerkingen moet een ADD of ADDC altijd direct worden gevolgd door een DAA instructie, deze zorgt ervoor dat het resultaat naar BCD vorm wordt gecorrigeerd. De DAA instructie converteert geen binair getal naar BCD vorm. De DAA instructie heeft enkel zin als tweede stap na de optelling van twee BCD bytes! In de instructieset kan voor iedere instructie in detail worden nagegaan wat het effect is op de flags in het PSW. Pauwels D. Embedded systems 36
38 Logische bewerkingen. Tabel Instructies voor logische bewerkingen. De instructies die logische bewerkingen uitvoeren op bytes (AND, OR, Exclusive OR, NOT) voeren deze uit op een bit-met-bit basis. De meeste instructies spreken voor zich. De SWAP instructie verwisselt de high en low nibbles van de ACCU, wat nuttig kan zijn bij BCD bewerkingen. De ondersteuning in de instructieset voor de BCD bewerkingen is het gevolg van het feit dat heel wat embedded systemen nog altijd LED zeven segment displays gebruiken als aanduiding. Dit zijn instructies die minder worden gevonden op een processor, omdat ze daar minder relevant zijn. Pauwels D. Embedded systems 37
39 Data transfert instructies. Interne dataram. Tabel Instructies voor interne datatransferts. Dit zijn de instructies voor het verplaatsen van data in het interne datageheugen. Merk op dat de SFR's enkel via directe adressering en de bovenste 128 bytes data RAM (indien ze aanwezig zijn) enkel via indirecte adressering dienen aangesproken te worden. Bij de 8051 controllers zit de stack in interne RAM, en deze groeit naar hoger liggende adressen. PUSH en POP instructies kunnen enkel directe adressering gebruiken om de byte aan te duiden die op stack moet bewaard worden of die van stack moet gehaald worden. De stack zelf wordt aangesproken met indirecte adressering via het SP register. Dit betekent dat de stack ook in de hoogste 128 bytes datageheugen gelocaliseerd kan worden. Extene RAM. Tabel Instructies voor externe datatransferts in dataspace. Pauwels D. Embedded systems 38
40 Dit zijn instructies voor het aanspreken van het externe datageheugen (/RD en /WR worden geactiveerd bij het uitvoeren van deze instructies). Hier kan enkel indirecte adressering gebruikt worden. Men heeft de keuze om een één-byte te gebruiken waar Ri ofwel R0 of R1 van de geselecteerde registerbank kan zijn. Ofwel gebruikt men een twee-byte Het nadeel van een 16-bit adres te gebruiken als er maar enkele Kbytes externe RAM aanwezig zijn in het systeem is, dat er steeds een 16 bit adres gebruikt wordt. Dus alle 8 bits van poort 2 worden als adresbus gebruikt. Wanneer een 8-bit adres gebruikt wordt moet de programmeur op poort 2 zelf de nodige resterende adresbits aanbieden, maar kunnen de overige bits van poort 2 gebruikt worden voor een andere toepassing. Extern programmageheugen, lookup tabellen. Tabel Instructies voor externe datareads uit code space. Dit zijn de enige twee instructies die kunnen gebruikt worden voor het lezen van data uit het (externe) programmageheugen. Indien het externe programmageheugen wordt aangesproken zal het controlesignaal PSEN geactiveerd worden als lees-strobe. Ze worden meestal gebruikt voor het lezen van gegevens uit een lookup tabel. Merk op dat de instructies enkel toe laten dat er gelezen wordt en dat er geen gegevens kunnen geschreven worden naar programmageheugen. Booleaanse (bit) instructies. Tabel Instructies voor bit-bewerkingen. Pauwels D. Embedded systems 39
41 De 8051 controllers beschikken over een complete Booleaanse (single-bit) processor. De interne data RAM bevat 128 afzonderlijk adresseerbare bits, en in de SFR's kunnen ook 128 adresseerbare bits voorkomen ondergebracht in de verschillende registers de de hardware besturen. Alle poorten zijn bitadresseerbaar en elke poortpin kan als een afzonderlijke single-bit poort beschouwd worden. De instructies die deze bits aanspreken zijn niet alleen conditionele sprong-instructies, maar een complete set instructies zoals move, set, clear, complement, OR en AND instructies. Dit is typisch voor de 8051 en één van zijn grote troeven, de meeste andere processor- of controllerfamilies kunnen enkel op bytebasis hun poorten aanspreken. Een bitvariabele kan enkel via directe adressering worden aangesproken, waarbij bitadressen 00h tot 7Fh in de data RAM zitten en bitadressen 80h tot FFh in de SFR's. Sprong instructies. Onconditionele spronginstructies. Tabel Jump (branch) instructies. In deze tabel wordt enkel een 'JMP addr ' aangegeven, maar er bestaan er eigenlijk drie nl. SJMP, AJMP en LJMP. Ze verschillen enkel in het bereik van het sprongadres. JMP is een 'generische' mnemonic die door de programmeur kan gebruikt worden wanneer de gegenereerde code voor hem om het even is. Bij de SJMP instructie wordt het sprongadres als een relatieve offset geëncodeerd t.o.v. het startadres van de instructie die volgt op de SJMP. De instructie is twee byte lang en bestaat uit de opcode en de relatieve offsetbyte, die een complement 2 getal is. Het sprongbereik is dus beperkt van -128 tot +127 bytes relatief t.o.v. de instructie die volgt op de SJMP. De AJMP instructie encodeert het sprongadres als een 11-bit constante. De instructie is twee bytes lang en bestaat uit de opcode, die al 3 van de 11 adresbits bevat en een byte die de 8 laagste adresbits bevat. Bij het uitvoeren van deze instructie worden deze 11 bits gewoon in de 11 laagste bits van de PC geplaatst, en de 5 hoogste bits blijven onveranderd. Het sprongadres ligt dus in dezelfde 2K blok als de instructie die volgt op de AJMP. De LJMP instructie encodeert het sprongadres als een 16-bit constante. De instructie is drie bytes lang en bestaat uit een opcodebyte gevolgd door twee adresbytes. Het sprongadres kan dus om het even waar liggen in het 64K programmageheugenbereik. In asasembler zal de programmeur het sprongadres steeds op dezelfde manier aangeven, als een label of als een 16-bit constante. De assembler zal het sprongadres dan in het correcte formaat in de gegeven instructie plaatsen. Indien het sprongadres te ver gelegen is voor een bepaalde spronginstructie, zal de assembler dit aangeven met een 'destination out of range' boodschap. Pauwels D. Embedded systems 40
42 De A+DPTR instructie supporteert de 'case' functie. Het sprongadres wordt berekend bij de uitvoering van de instructie als de som van de DPTR en de accu. De DPTR wordt op het startadres van de sprongtabel geplaatst en de accu krijgt de offsetwaarde in de tabel. In de tabel wordt er ook maar één 'CALL' instructie aangegeven, maar er zijn ook hier meerdere call instructies nl. LCALL en ACALL. Deze verschillen in de manier waarop het sprongadres wordt geëncodeerd. CALL is de generische mnemonic die kan gebruikt worden als het voor de programmeur om het even is welke binaire instructie er gegenereerd wordt. De LCALL instructie gebruikt een 16-bit adresformaat waardoor het sprongadres in het volledige 64K programmageheugen kan gelegen zijn. De ACALL instructie gebruikt maar een 11-bit adres, waardoor het sprongadres in hetzelfde 2K blok moet gelegen zijn als het startadres van de instructie die volgt op de ACALL. Subroutines moeten worden afgesloten met een RET instructie die terugspringt naar de instructie na de CALL. RETI wordt gebruikt voor het beëndigen van een interrupt service routine. Het verschil met een RET instructie is dat de RETI instructie aan het interrupt controlesysteem aangeeft dat de interrupt die afgehandeld wordt klaar is. Indien er geen interruptafhandeling bezig is, is een RETI functioneel hetzelfde als een RET instructie. Conditionele spronginstructies. Tabel Conditionele spronginstructies. Zoals men kan opmerken, kan bij deze instructies alleen relatieve offsetadressering worden toegepast, waar er in de instructie maar 1 byte wordt voorzien om het sprongadres op een relatieve manier aan teduiden t.o.v. het adres van de volgende instructie. Dit betekent een sprongbereik van -128 tot +127 bytes. Pauwels D. Embedded systems 41
43 4.4 De taal voor programma-ontwikkeling. Er wordt wel eens gezegd, dat men zichzelf niet als een echte embedded programmeur mag beschouwen indien men geen assembler kan schrijven. Dit is misschien een beetje overdreven, maar het is zeker zo dat bij de meeste embedded systemen er een deel van de code in assembler is geschreven. Dit komt doordat de hogere programmeertalen of HLL's (High Level Languages) meestal ervan uit gaan dat dingen zoals de stack reeds zijn geïnitialiseerd. Omdat function-calls in elke programmeertaal de stack gebruiken, die in RAM geheugen is ondergebracht, kan men bv. geen C functie oproepen die de stack initialiseert of die bv. de onchip chipselect logica instelt voor de RAM. Dit moet gewoon gebeuren in eerder uitgevoerde startupcode die dan in assembler is geschreven. Het is wel zo dat tegenwoordig de meeste C-compilers zelf voor een bepaalde controller in een bepaald systeem (waarvan de omgeving beschreven werd in de IDE van de compiler) een voorstel van assembler startupcode genereren. De startupcode moet meestal echter nog worden "gefinetuned" door de programmeur. Een tweede reden waarom er nog assembler geschreven wordt is snelheid. De beste code optimisers zijn nog steeds niet zo goed als een programmeur in het genereren van de snelste code, en dit zal zeker nog een tijdje zo blijven. Dit kan men duidelijk zien in de voorbeelden uit de volgende paragraaf. Hogere programmeertalen voor embedded toepassingen worden wel steeds gesofisticeerder en efficiënter en ze zijn beter in staat om de typische hardware van een embedded systeem beter te ondersteunen. De keuze van een programmeertaal wordt, zoals elke engineering tool, bepaald door een compromis tussen kostprijs, eenvoud in gebruik en gebruiksnut. Voor heel eenvoudige projecten kan een eenvoudige assembler reeds volstaan. Veel kleine projecten zijn helemaal niet sneller afgewerkt door een HLL te gebruiken. Sommige fabrikanten zoals bv. Atmel, stellen via hun website gratis assemblers ter beschikking voor hun controllers. Maar de kostprijs is niet noodzakelijk de bepalende factor in de keuze voor een assembler. Soms is assembler de enige manier om alles snel genoeg te laten verlopen in een systeem. Wanneer het grootste deel van de code bestaat uit het aanpassen van bits van I/O poorten in reactie op events, of het laden van timerwaardes dan gaat het grootste deel van de code bestaan uit dingen zoals het berekenen van timerwaardes. De eigenlijke code is dan redelijk eenvoudig en assembler is hier op zijn plaats. Het nadeel is dat voor het onderhouden van de code de programmeurs in de toekomst ook de instructieset van de controller moeten aanleren. Wanneer de complexiteit van een project en tijd voor het coderen zelf groter wordt, begint assembler minder aantrekkelijk te worden voor het project. De tijd die nodig is voor het debuggen van de code wordt groter en de mogelijkheid om code te schrijven voor meerdere controllers zonder een nieuwe taal te moeten leren wordt belangrijk. Alhoewel dit laatste argument meestal wegvalt bij simpele contollers. De HLL's hebben voor deze controllers meestal een aantal beperkingen, zoals het ontbreken van floating-point mogelijkheden, wat de programma-overdraagzaamheid beperkt. Voor de meeste controllers zijn er ook instructies nodig, om de specifieke hardware van de controller aan te spreken, die dan moeilijk overdraagzaam zijn. Een aantal dingen die moeten bekeken worden bij de keuze van een taal (compiler) worden nu kort aangegeven. Pauwels D. Embedded systems 42
44 Processor- of controllersupport. C is de meest universele programmeertaal die beschikbaar is voor de meeste processoren en controllers. PL/M en Pascal zijn bijna helemaal uitgestorven en BASIC is maar voorhanden voor een beperkt aantal controllers. Zoals reeds aangehaald moet men er rekening mee houden dat HLL versies voor controllers niet noodzakelijk alle mogelijkheden van een taal ondersteunen. Sommige dingen die normaal zijn voor een HLL op een PC of workstation zijn nu eenmaal niet mogelijk op een microcontroller van 2,5. Wat ook zeer belangrijk is bij de aanschaf van een compiler voor een controllerfamilie is dat hij de controllerversie ondersteunt die men daadwerkelijk gebruikt. Een compiler voor de 8051 familie moet bv. aangepaste code genereren voor rekenkundige routines wanneer we een C517 variant uit deze familie gebruiken, deze heeft immers een eigen 32-bit multiply/divide unit wat de uitvoeringstijd van deze programma's enkele grootteordes verkleint. Emulator support. De meeste emulatoren (controller hardware-simulators) kunnen inplaats van hex adressen de labels uit de source code van het programma weergeven (source level debug). Men kan inplaats van te "single-steppen" door de machinecode direct door een C instructie stappen, of zelfs door complete functies alsof het statements waren. Op dezelfde manier kunnen breakpoints worden gezet in de code. Dit kan het debuggen enorm vereenvoudigen. De emulator software heeft hiervoor echter een tabel nodig waarin aangegeven staat welk label met welk adres overeenkomt. Men moet nagaan of de compiler een fileformaat kan genereren dat compatibel is met de emulator. Ideaal is dat de emulator de data weergeeft in het correcte formaat en dat hij char, int en andere types van variabelen herkent. Grootte van de code (codegeheugen). Sommige compilers zijn zeer inefficiënt in het gebruik van ROM (Flash) en RAM geheugengrootte. Ga na of de compiler er niet voor zorgt dat er een enorme stijging van de hardware kosten zal volgen, voor het extra benodigde geheugen. Hetzelfde geldt ook voor de snelheid van de gegenereerde code. Ga na wat de grootte is van de gebruikte libraries en of ze wel in het beschikbare geheugen kunnen, een C printf functie in een controllertoepassing kan aanleiding geven tot een plotse stijging van 50Kbyte in code! Programma optimalisatie. Optimaliserende compilers proberen de efficiëntste code te genereren en kunnen het verschil maken tussen een toepassing die werkt of niet werkt. Een optimaliserende compiler elimineert de overbodige machine code. Bijvoorbeeld, als de code een variabele test om te zien of een bit is geset en daarna dezelfde variabele test om een andere bit te checken, dan zou een niet optimaliserende compiler de variabele twee keer kunnen lezen. Een optimaliserende compiler zal de variabele maar één keer lezen, in een register bewaren en wetende dat de variabele ondertussen niet is veranderd, dit register gebruiken voor de tweede bittest. Opgelet, dit kan ook voor problemen zorgen! Indien de variabele geen gewone RAM locatie is maar een hardwareregister, dat door de interne hardware los van het programma kan aangepast worden. Een aanpassing van een bit door de interne hardware kan zo ongedetecteerd blijven in de geoptimaliseerde versie van het programma en voor problemen zorgen. Dit is de reden waarom optimalisatie meestal kan uitgeschakeld worden voor bepaalde delen van de code. Meestal laten ze ook toe om memory-mapped hardware te definiëren zodat deze anders wordt bekeken dan gewone RAM. Sommige compilers, meestal bij controllers, laten toe te optimaliseren naar codegrootte of naar snelheid, maar meestal kan je dit alleen selecteren voor het hele programma. Pauwels D. Embedded systems 43
45 Assembler support. De meeste toepassingen vragen nog steeds assembler voor dingen zoals initialisatie, interrupts of snelle I/O. De compiler zou het moeten mogelijk maken om gemakkelijk assemblerfiles (mogelijks als inline code) te includen in de software. Een ander probleem bij controllers is dat de parameterpassing door de zeer beperkte stackruimte niet via de stack gebeurt maar via een gebied in (externe) RAM. Dit is meestal een overlay, die gedeeld wordt met andere functies. De HLL compiler moet op dit gebied een goed gedefiniëerde interface hebben, zeker naar assemblerroutines toe. De programmeur moet immers goed weten op welke manier variabelen worden doorgegeven. Debugging tools. Wanneer tools worden gekocht, moet er ook aandacht worden besteed aan het feit dat het systeem moet worden gedebugd. Bij het gebruik van controllers ondervindt men de meeste beperkingen hierrond. Sommige debuggersoftware voor controllers maakt gebruik van de on-chip seriële poort voor communicatie met de host PC. Als in de toepassing deze poort gebruikt wordt voor communicatie met andere controllers van het systeem, moet er een andere oplossing gevonden worden. Een emulator kan dan de oplossing zijn. Een emulator is echter wegens economische redenen niet altijd ter beschikking, of kan om andere redenen niet gebruikt worden. Denk bv. maar aan een embedded systeem dat om zijn werking te kunnen testen, bevestigd moet zijn op een (bewegende) robotarm. Een emulator is hier niet bruikbaar. In gevallen zoals deze is het ook nuttig om over een simulator te beschikken, die toelaat grote delen van de code te testen vanop de ontwerptafel. In een echte omgeving, met motoren en schakelende relais, waar de meeste embedded sytemen terecht komen, komen de meeste beperkingen van een simulator aan het licht, want omgevingsfactoren kunnen niet mee worden gesimuleerd. Indien er geen emulatoren of simulatoren kunnen gebruikt worden moet de ontwerper creatief zijn en naar andere oplossingen zoeken. Een nieuwe trend is echter de benodigde debughardware mee te intergreren in de controller of processor, de emulator wordt als het ware mee ingebouwd in de controller! Deze speciale hardware wordt wel eens een Background Debug Module (BDM) genoemd. Via een dedicated of standaard (JTAG) interface met een PC kan dan eenvoudig debug informatie worden bekomen uit een werkend systeem. Pauwels D. Embedded systems 44
46 en een hogere programmeertaal. Voor de 8051 familie zijn er verschillende programmeertalen beschikbaar van verschillende fabrikanten. De meest gebruikte hogere programmeertaal is uiteraard C. Als voorbeeld wordt eenzelfde kleine routine voor de 8051 controller (een kleine en eenvoudige controller) geprogrammeerd in C, in BASCOM BASIC en in assembler. Het is aan de lezer om conclusies te trekken over de meest geschikte omgeving om te programmeren. Een voorbeeld van een zeer eenvoudig programma in C wordt in figuur gegeven. Fig Programmavoorbeeld in C. Pauwels D. Embedded systems 45
47 De assemblerlisting van de uitvoerbare code die de compiler hiervan maakte wordt hierna weergegeven, deze kan bekomen worden door de IntelHEX file die door de compiler werd gegenereerd te disassembleren naar een assemblerfile, in de meeste gevallen wordt er bij het compileren echter ook een assembler listfile aangemaakt. De vergelijking tussen de C-sourcefile en de gegenereerde code geeft de lezer een idee van de efficiëntie (?) van een doorsnee C-compiler voor 8051 controllers. Rigel\Reads51\Work\_blink\a01.xsf C:\Rigel\Reads51\Include\pcx51.inc extern code add extern code add extern code add1n extern code sub extern code and extern code or extern code incwp extern code addsp extern code getb1p extern code getb1p extern code getb1pu extern code getb1pu extern code getb1s extern code getb1s extern code getb1su extern code getb1su extern code getb2s extern code getb2s extern code getb2su extern code getb2su extern code getw1m extern code getw1p extern code getw1p extern code getw1s extern code getw1s extern code getw2m extern code getw2p extern code getw2s extern code putwp extern code point1s extern code point2s extern code ne extern code ge extern code gt extern code uge extern code ugt extern code pushm ; not used extern code pushp extern code pushp extern code pushs extern code push2 ; not used extern code enterisr extern code enter extern code return extern code returnisr extern code return_n extern code switch extern code lneg extern code eq extern code lt extern code le extern code ult extern code ule extern code neg extern code rinc extern code rdec extern code asl extern code asr extern code udiv extern code umul extern code mul extern code div extern code mod extern code push extern code pop extern code pushab extern code swap extern code _ccargc extern code pushp extern code pushs extern code dbl extern code putwm extern code prtocarry extern code putw1s extern code putw1s extern code putb1s extern code putb1s extern code call1 ; not used extern code umod12 ; not implemented extern code debug ; conditional use C:\Rigel\Reads51\Include\Rc51Regs.inc Pauwels D. Embedded systems 46
48 PRL data 0x PRH data 0x SRL data 0x SRH data 0x MDL data 0x MDH data 0x CNT data 0x MODFLAGREG data 0x SPL data 0x SPH data 0x BPL data 0x0A BPH data 0x0B ARGCNT data 0x0C ; registers ACC data 0xE B data 0xF DPH data 0x DPL data 0x IE data 0xA IP data 0xB P0 data 0x P1 data 0x P2 data 0xA P3 data 0xB PCON data 0x PSW data 0xD SBUF data 0x SCON data 0x SP data 0x TCON data 0x TH0 data 0x8C TH1 data 0x8D TL0 data 0x8A TL1 data 0x8B TMOD data 0x ; register bit fields ; IE EA bit 0xAF ES bit 0xAC ET1 bit 0xAB EX1 bit 0xAA ET0 bit 0xA EX0 bit 0xA ; IP PS bit 0xBC PT1 bit 0xBB PX1 bit 0xBA PT0 bit 0xB PX0 bit 0xB ; P RD bit 0xB WR bit 0xB T1 bit 0xB T0 bit 0xB INT1 bit 0xB INT0 bit 0xB TXD bit 0xB RXD bit 0xB ; PSW CY bit 0xD AC bit 0xD F0 bit 0xD RS1 bit 0xD RS0 bit 0xD OV bit 0xD P bit 0xD ; TCON TF1 bit 0x8F TR1 bit 0x8E TF0 bit 0x8D TR0 bit 0x8C IE1 bit 0x8B IT1 bit 0x8A IE0 bit 0x IT0 bit 0x ; SCON SM0 bit 0x9F SM1 bit 0x9E SM2 bit 0x9D REN bit 0x9C TB8 bit 0x9B RB8 bit 0x9A TI bit 0x RI bit 0x ; macros to access the function argument stack in assembler C0Seg segment code CodeSeg segment code XDataSeg segment xdata Pauwels D. Embedded systems 47
49 ; --- external and public functions extern code _InitSerialPort extern code _putc public _LedOff public _main public _LedOn ; --- external and public variables ; #line 1 // READS51 generated header ; #line 2 // module : a01.c ; #line 3 // created : 19:51:27, Monday, October 09, ; #line 4 // Example routines for the textbook ; #line 5 // Programming and Interfacing the 8051 in C and Assembly ; #line 6 // by S. Yeralan and H. Emery ; #line 7 // (C) 2000, Rigel Press, ; #line 8 // ; #line ; #line ; #line 11 // prototypes ; #line 12 /*"#C:\Rigel\Reads51\Include\Sio51.h"*/ ; #line ; #line 14 // prototypes ; #line 15 void PrtDec(int n); ; #line 16 void PrtHex(unsigned int u); ; #line 17 void putc(char c); ; #line 18 void puts(char *sz); ; #line 19 char getc(void); ; #line 20 void printf(char *sz); ; #line 21 void InitSerialPort0(int nmode); ; #line ; #line ; #line 24 // global definition of serial mode ; #line ; #line 26 // macros to access the function argument stack in assemb ; #line ; #line ; #line 30 void LedOn(void){ ; rseg CodeSeg ; CHGSEG(2) _LedOn: ; DECLPUBm(LedOn) D0F0 pop b ; ENTER D0E0 pop acc lcall enter ; #line 31 #asm C290 clr P ; #line 34 } ; lcall return ; RETURN(0) 00004A C ; #line C ; #line 36 void LedOff(void){ C ; C _LedOff: ; DECLPUBm(LedOff) C D0F0 pop b ; ENTER E D0E0 pop acc lcall enter ; #line 37 #asm D290 setb P ; #line 40 } ; lcall return ; RETURN(0) 00004A ; #line ; #line 42 main(){ ; _main: ; DECLPUBm(main) mov SPH, #0x40 ; ENTERMAIN(16384) B mov SPL, #0x E 85090B mov BPH, SPH A mov BPL, SPL ; #line 43 int n; ; #line ; #line 45 // --- initialize serial port (9600 Baud) ; #line 46 InitSerialPort0(0); //DEF_SIO_MODE is defined in <csio51.h> ; mov a, #0x02 ; ADDSP(2) F000 mov b, #0x lcall addsp C mov PRL, #0x00 ; GETw1n(0) F mov PRH, #0x lcall push1 ; PUSH E C01 mov ARGCNT, #0x01 ; ARGCNTn(1) lcall _InitSerialPort0 ; CALLm(_InitSerialPort0) B 74FE mov a, #0xFE ; ADDSP(-2) D 75F0FF mov b, #0xFF lcall addsp ; #line 47 putc('\n'); ; A mov PRL, #0x0A ; GETw1n(10) mov PRH, #0x lcall push1 ; PUSH E C 750C01 mov ARGCNT, #0x01 ; ARGCNTn(1) F lcall _putc ; CALLm(_putc) Pauwels D. Embedded systems 48
50 FE mov a, #0xFE ; ADDSP(-2) F0FF mov b, #0xFF lcall addsp A ; #line A ; #line 49 // endless loop A ; #line 50 while(1) A ; A _1: ; LABm(_1:) A _2: ; LABm(_2:) A ; #line 51 { A ; #line 52 LedOn(); A ; A 750C00 mov ARGCNT, #0x00 ; ARGCNTn(0) D lcall _LedOn ; CALLm(_LedOn) ; #line 53 putc('+'); ; B mov PRL, #0x2B ; GETw1n(43) mov PRH, #0x lcall push1 ; PUSH E C01 mov ARGCNT, #0x01 ; ARGCNTn(1) C lcall _putc ; CALLm(_putc) F 74FE mov a, #0xFE ; ADDSP(-2) F0FF mov b, #0xFF lcall addsp ; #line 54 for(n=0; n<100; n++); // waste some cycles ; mov PRL, #0x00 ; GETw1n(0) A mov PRH, #0x D lcall putw1s0 ; PUTw1s(0) 00000D ; _4: ; LABm(_4:) lcall getw1s0 ; GETw1s(0) mov SRL, #0x64 ; GETw2n(100) mov SRH, #0x lcall ge12 ; JGE12n(_6) 00004E C 5003 jnc $ E 02009D ljmp _6 009D ; _5: ; LABm(_5:) A02 mov SRL, BPL ; POINT2s(0) B03 mov SRH, BPH lcall incwp ; INCwp A ; #line 55 LedOff(); A ; A ljmp _4 ; JMPn(_4) D _6: ; LABm(_6:) D ; D 750C00 mov ARGCNT, #0x00 ; ARGCNTn(0) A C lcall _LedOff ; CALLm(_LedOff) 000C A3 ; #line 56 putc('0'); A3 ; A mov PRL, #0x30 ; GETw1n(48) A mov PRH, #0x A lcall push1 ; PUSH E AC 750C01 mov ARGCNT, #0x01 ; ARGCNTn(1) AF lcall _putc ; CALLm(_putc) B2 74FE mov a, #0xFE ; ADDSP(-2) B4 75F0FF mov b, #0xFF B lcall addsp BA ; #line 57 for(n=0; n<100; n++); // waste some cycles BA ; BA mov PRL, #0x00 ; GETw1n(0) BD mov PRH, #0x C lcall putw1s0 ; PUTw1s(0) 00000D C3 ; C3 _7: ; LABm(_7:) C lcall getw1s0 ; GETw1s(0) C mov SRL, #0x64 ; GETw2n(100) C mov SRH, #0x CC lcall ge12 ; JGE12n(_9) 00004E CF 5003 jnc $ D1 0200E0 ljmp _9 00E D4 ; D4 _8: ; LABm(_8:) D4 850A02 mov SRL, BPL ; POINT2s(0) D7 850B03 mov SRH, BPH DA lcall incwp ; INCwp DD ; #line 58 } DD ; DD 0200C3 ljmp _7 ; JMPn(_7) Pauwels D. Embedded systems 49
51 00C E0 _9: ; LABm(_9:) E0 ; #line 59 } E0 ; E A ljmp _1 ; JMPn(_1) 005A E3 _3: ; LABm(_3:) E3 74FE mov a, #0xFE ; ADDSP(-2) E5 75F0FF mov b, #0xFF E lcall addsp EB ; EB ljmp _main ; RETMAIN EE ; EE end ; ENDSEG(2) Dit is de code die werd gegenereerd door de C compiler, 238 (EEh) bytes lang, niet meteen de meest geschikte oplossing indien men beschikt over een kleine hoeveelheid geheugen in het systeem. Als volgende omgeving werd BASCOM BASIC genomen. Fig BASCOM BASIC programmavoorbeeld. Pauwels D. Embedded systems 50
52 Fig BASCOM compiler build rapport. De gegenereerde code werd gedisassembleerd en geeft voorzien van commentaar dit resultaat. Uit het compiler report kunnen we afleiden dat er 199 bytes (C7h) code werden aangemaakt om het probleem op te lossen. ;===============================================================; ; Disassembled Using DIS (C)1989 Data Sync Engineering ; ;===============================================================; ORG 00000H ;STARTADRES IN CODEGEHEUGEN LJMP L004E ;SPRONG NAAR STARTUP CODE ORG 002CH ;STARTADRES VAN DE SUBROUTINES NA DE INTERRUPTVECTOREN ; L0036: CLR C ;GEEN BORROW GEBRUIKEN SUBB A,B ;VARIABELE MIN MAX TELLERWAARDE RET ; ;L003A: LCALL L0036 ;VARIABELE MIN MAX TELLERWAARDE JZ L0043 ;NUL ALS VARIABELE= MAX TELLERWAARDE JC L0043 ;ANDERS KLEINER EN AANGEVEN IN A CLR A ;IN A AANGEVEN DAT VARIABELE > MAX TELLERWAARDE RET L0043: MOV A,#001H ;VARIABELE IS KLEINER OF GELIJK AAN MAX TELLERWAARDE RET ; L0046: JNB TI,L0046 ;CHECK TRANSMIT BIT IN UART CLR TI ;ALS TI=1 DAT IS VORIG CHAR WEG, FLAG TERUG CLEAREN MOV SBUF,A ;NIEUWE CHAR IN TRANSMITBUFFER RET ; ; STARUP CODE INIT VAN DE SERIELE POORT EN ERROR VARIABELE L004E: MOV R0,#0FFH ;AANTAL BYTES INTERNE DATARAM CLR A ; L0051: ;INTERNE DATARAM OP NUL ZETTEN DJNZ R0,L0051 ;BLIJF LUSSEN TOT R0=0 MOV SP,#022H ;STACKPOINTER INITIALISEREN NA DE VARIABELEN CLR TR1 ;TIMER1 STOPPEN MOV SCON,#052H ;INIT UART MOV TMOD,#022H ;INIT BAUDRATE TIMER (TIMER1) MOV TH1,#0FDH SETB TR1 ;TIMER1 WEER STARTEN MOV 020H,#000H ;ERROR VARIABELE VOOR INTERN GEBRUIK CLEAREN Pauwels D. Embedded systems 51
53 ORL 08EH,#001H ;ALE LIJN DISABLEN L006A: SETB P1.0 ;LED AANSCHAKELEN MOV R0,#00BH ;CHAR OFFSET LADEN L006E: MOV A,R0 ;OM CHAR GEINDEXEERD OP TE HALEN MOVC ;TEN OPZICHTE VAN PC JZ L0078 ;INDIEN NULL DAN GEDAAN LCALL L0046 ;ANDERS CHAR NAAR BUITEN STUREN INC R0 ;VOLGENDE CHAR SJMP L006E ;BLIJF LUSSEN ; L0078: LJMP L007D ;GEDAAN MET CHAR AFDRUKKEN ; DB 02BH, 000H ;'+', NULL L007D: MOV 021H,#000H ;VARIABELE OP NUL ZETTEN L0080: MOV B,#064H ;TELLERWAARDE =100 MOV A,021H ;VARIABELE OPHALEN ACALL L003A ;VARIABELE MIN TELLERWAARDE JNZ L008C ;NIET NUL, DAN VARIABELE KLEINER OF GELIJK AAN TELLERWAARDE LJMP L0095 ;VARIABELE IS TELLERWAARDE ; L008C: INC 021H ;VARIABELE +1 MOV A,021H ;CHECK VARIABELE JZ L0095 ;OP OVERFLOW, INDIEN NUL DAN OVERFLOW LJMP L0080 ;VOLGENDE TEST ; L0095: CLR P1.0 ;LED UITSCHAKELEN MOV R0,#00BH ;CHAR OFFSET LADEN L0099: MOV A,R0 ;OM CHAR GEINDEXEERD OP TE HALEN MOVC A,@A+PC ;TEN OPZICHTE VAN PC JZ L00A3 ;INDIEN NULL DAN GEDAAN LCALL L0046 ;ANDERS CHAR NAAR BUITEN STUREN INC R0 ;VOLGENDE CHAR SJMP L0099 ;BLIJF LUSSEN ; L00A3: LJMP L00A8 ; DB 030H, 000H ;'0', NULL L00A8: MOV 021H,#000H ;VARIABELE OP NUL ZETTEN L00AB: MOV B,#064H ;TELLERWAARDE =100 MOV A,021H ;VARIABELE OPHALEN ACALL L003A ;VARIABELE MIN TELLERWAARDE JNZ L00B7 ;NIET NUL, DAN VARIABELE KLEINER OF GELIJK AAN TELLERWAARDE LJMP L00C0 ;VARIABELE IS TELLERWAARDE ; L00B7: INC 021H ;VARIABELE +1 MOV A,021H ;CHECK VARIABELE JZ L00C0 ;OP OVERFLOW, INDIEN NUL DAN OVERFLOW LJMP L00AB ;VOLGENDE TEST ; L00C0: LJMP L006A ;MAIN LOOP ; CLR EA ;EXIT CODE (ONNODIG HIER) L00C5: SJMP L00C5 ;DUMMY LOOP, PROGRAMMA IS AFGEWERKT EN GEEN O.S. END Pauwels D. Embedded systems 52
54 In figuur ziet men de assembler omgeving, waar op machine-instructieniveau wordt geprogrammeerd en waar de programmeur zelf alle nodige initialisaties van de hardware moet programmeren. De programmeur wordt hier verplicht om de instructieset van de controller onder de knie te krijgen, wat niet altijd eenvoudig is. Als besluit zouden we hierbij het volgende kunnen stellen: om een embedded systeem te programmeren wordt er van de programmeur altijd verwacht dat hij de specifieke controllerarchitectuur en zijn interne hardware door en door kent. Dit is immers wanneer er moet gedebugd worden (altijd dus) een eerste vereiste om tot een werkend systeem te komen, ongeacht in welke programmeertaal de controller wordt geprogrammeerd. Fig Programmavoorbeeld in 8051 assembler. Pauwels D. Embedded systems 53
55 TEST 1 $nolist 250 $list led bit p F 253 stack equ 07fh var equ 020h org 0000h C 258 ljmp init C 260 org 002ch 002C 78FF 261 init: mov r0,#0ffh ;aantal interne bytes dataram 002E E4 262 clr a F F6 264 clrmem: ;clear memory byte 0030 D8FD 265 djnz r0,clrmem ;alle locaties F 267 mov sp,#stack ;init stackpointer 0035 C28E 268 clr tr1 ;timer 1 stoppen mov s0con,#052h ;init uart 003A mov tmod,#022h ;init baudrate timer (timer1) 003D 758DFD 271 mov th1,#0fdh 0040 D28E 272 setb tr1 ;timer 1 starten D main: setb led ;led aan B 276 mov a,#'+' ;'+' acall putc ;afdrukken acall delay ;delayloop A C clr led ;led uit 004C mov a,#'0' ;'0' 004E acall putc ;afdrukken acall delay ;delayloop EE 284 sjmp main ;FOR-NEXT LUS delay: mov r0,#100 ;1 microsec 0056 D8FE 287 delay1: djnz r0,delay1 ;2 microsec ret ;2 microsec FD 290 putc: jnb ti0,putc ;test transmitbuffer empty bit 005C C clr ti0 ;buffer vrij, dan flag clearen 005E F mov s0buf,a ;char in transmitbuffer en naar buiten ret end VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND Van de drie uitgewerkte versies is dit niet alleen het compactste programma met 96 bytes code (0060h), maar ook het snelste. Vergelijk de lege FOR-NEXT lus uit het BASCOM programma of de FOR lus uit het C programma, die honderd maal doorlopen wordt, maar met de delay routine uit het assemblerprogramma (203 microseconden). Pauwels D. Embedded systems 54
56 Hoofdstuk Interne Periferie van een 8051 controller De 8051 familie bevat net zoals elke reeks van microcontrollers een hele variëteit aan periferiebouwstenen die intern (on-chip) aanwezig is. Zo zijn er op de oorspronkelijke 8051 vier 8-bit parallelle poorten, twee counter/timers en een seriële poort aanwezig. Afhankelijk van de variant uit deze familie zullen er nog extra periferiebouwstenen aanwezig zijn. Elk van deze periferiebouwstenen is gerelateerd met één of meerdere SFR's. Met andere woorden, de periferie wordt geïnitialiseerd door de bitsetting in de controle SFR's en dan kan de werking van de periferie bekeken worden via de statusbits in de overeenkomstige SFR's. In dit hoofdstuk wordt dieper ingegaan op de on-chip periferie die typisch is voor controllers en dan meer bepaald, maar niet exclusief, voor de 8051 reeks. 5.1 Parallelle poorten. Elke microcontroller heeft parallelle poorten,die meestal 8-bit breed zijn, of minstens enkele bits die samen of individueel kunnen aangesproken worden. Microcontrollers gebruiken parallelle poorten om data (bits of bytes) binnen te lezen van een aantal pinnen waar de externe hardware informatie opzet, of om informatie naar buiten te sturen op een aantal pinnen waar externe hardware mee verbonden is. In het geval van de 8051 reeks kunnen de poorten als 8-bit poorten gebruikt worden, of als individuele bits. De poorten van de 8051 reeks werken principiëel zoals de meeste parallelle poorten van andere controllers of processoren. Er is echter één groot verschil. De poorten van de 8051 reeks hebben geen initialisatie nodig. Daarmee bedoelen we dat er geen configuratie van de poorten nodig is om te werken als input of als output, dit in tegenstelling met andere reeksen van controllers. De enige vereiste is dat voor een poortbit die men als input wenst te gebruiken er een 1 is geschreven in de poortlatch. Één en ander wordt later duidelijk. Pauwels D. Embedded systems 55
57 5.1.1 Parallelle poort-structuur en werking. De vier basispoorten van de 8051 reeks zijn bidirectioneel. Ze zijn opgebouwd uit een latch (SFR's P0 tot P3), een output driver en een input buffer. De output drivers van poorten 0 en 2, en de inputbuffers van poort 0, kunnen worden gebruikt om het eventuele externe geheugen aan te spreken. In deze toepassing zal poort 0 de low byte van het externe geheugenadres naar buiten sturen, en dit in de tijd gemultiplexed met de databyte die wordt gelezen of geschreven. Poort 2 stuurt de high byte van het externe geheugenadres naar buiten indien het over een 16-bit adres gaat. In de andere gevallen wordt op de pinnen van poort 2 de inhoud van het SFR P2 naar buiten gestuurd. Alle pinnen van poort 3, en indien er een TIMER2 aanwezig is in het systeem ook twee pinnen van poort 1, zijn multifunctioneel. Ze hebben m.a.w. niet alleen de functie van poortbit, maar kunnen ook gebruikt worden als input- of outputpin voor een andere interne periferiebouwsteen die aanwezig is in de controller. De verschillende mogelijke functies worden hieronder weergegeven. Deze alternatieve functies kunnen maar worden geactiveerd als de Port bitlatch in het poort SFR met een 1 is geschreven, m.a.w. als de poort in inputmode staat. Dit wordt schematisch aangegeven in de figuur Na reset staan de alternatieve functies op een '1' niveau en kan de poortpin als parallelle I/O pin gebruikt worden. Indien een 8051 variant wordt gebruikt met meerdere parallelle poorten en meer interne periferieblokken (vb. een C517 van Infineon) moet hier dan nagegaan worden welke poortpinnen overeenkomen met welke alternatieve functie I/O configuraties. Fig Alternatieve functie van de 8051 poortpinnen. In de figuur wordt de typische bitlatch of portlatch en I/O buffer functioneel weergegeven voor de vier basispoorten van de 8051 reeks. De bitlatch (één bit van een poort SFR) wordt voorgesteld door een D-type flip-flop, waar een waarde van de interne bus wordt binnengeclocked bij een "write to latch" signaal van de CPU. De Q uitgang van de flip-flop wordt op de interne bus gezet als gevolg van een "read latch" signaal van de CPU. Pauwels D. Embedded systems 56
58 Het niveau van de poortpin zelf, wordt op de interne bus gezet bij een "read pin" signaal van de CPU. Sommige instructies die een poort lezen activeren het "read latch" en andere activeren het "read pin" controlesignaal. Dit kan in sommige gevallen een groot verschil zijn. Read Latch Alternatieve output functie Int.Bus Write to Latch D Port bitlatch CLK Q Q & Port pindriver Read pin Alternatieve input functie Fig Functionele voorstelling van de poortstructuur bij de 8051 familie. Het port pindriver gedeelte uit de vorige figuur bestaat uit een aantal pfets en een nfet, die er voor zorgen dat de poortpin een open drain structuur heeft met een interne pull-up die wordt gevormd door de interne pfet's. Dit wordt in de figuur weergegeven. Actief bij een 0 naar 1 flank Weak pull-up Actief als V-portpin > 1..1,4V 1 OSC. PERIOD Delay OR Laag niveau voor een '1' niveau op de poortpin Fig Poortpindriver bij de 8051 familie. Pauwels D. Embedded systems 57
59 De nfet zal niet geleiden bij een logisch '0' niveau op zijn gate, terwijl de pfet's dan juist wel zullen geleiden. De portdriver zal er voor zorgen dat P1 gedurende twee oscillatorperiodes wordt aangestuurd en gaat geleiden voor een uitgangstransitie van '0' naar '1'. Dit heeft als doel de parasitaire capaciteit, van het circuit dat is aangesloten op de poortpin, snel op te laden en dus de 'weak pull-up' P2 gedurende 2 clockperiodes te 'versterken' terwijl P2 altijd in geleiding is wanneer de nfet spert. De FET P3 zal slechts in geleiding gaan wanneer de spanning op de poortpin groter is dan 1 á 1,4V. Dit heeft ook gevolgen wanneer de poortpin als ingang staat geschakeld en wordt aangestuurd vanuit een open-collector of open-drain uitgang van een ander device. Zie onderstaande figuur Wanneer de pin op een '0' niveau wordt gestuurd door het externe device zal de FET P3 niet geleiden en alleen de 'weak pull-up' P2 zal stroom voeren naar de poortpin. Een '0' naar '1' transitie op deze pin, die wordt gestuurd door het externe device, zal dus niet snel verlopen tot P3 ook mee in geleiding komt en de oplaadtijd zo ongeveer tien keer kleiner maakt. Dit wordt duidelijk in de grafiek in figuur Fig Effect van de parasitaire capaciteit van een pin als input geschakeld. In het gebied A zal alleen P2 stroom leveren om de capaciteit op te laden tot ongeveer 1,4V. Vanaf dan zal (in gebied B) de FET P3 mee in geleiding komen en de capaciteit veel vlugger opladen tot een hoog niveau. V poortpin 5 A B Met P3 4 Zonder P3 3 P3 komt in geleiding T (us) Fig Spanningsverloop op een poortpin bij een '0' naar '1' transitie via een OC driver. Pauwels D. Embedded systems 58
60 De figuur geeft aan dat er dus een zekere tijd (enkele machinecycli) nodig is om een logisch hoog niveau te bereiken bij een '0' naar '1' overgang, wat zeker niet uit het oog mag verloren worden wanneer externe devices worden aangesproken. Zeker in het geval van een aanzienlijke capacitieve belasting zoals bij het gebruik van flat-cable om een poort te verbinden met een extern device zoals bv. een LCD display. Meestal is het beter een actief lage sturing van externe devices te gebruiken, indien mogelijk, omdat de interne nfet dan stroom kan 'sinc'-en naar de massa. Deze toegelaten stroom is veel groter dan de stroom die bij een actief hoge sturing kan 'gesourced' worden door de pfet's (interne pull-up). Doordat de controller bij power-up of reset zijn poortpinnen allemaal op logisch '1' zet (als input) krijgen we het bijkomend voordeel dat bij een actief lage sturing alle uitgangen op 'niet actief' staan bij startup. In het geval er toch een actief hoge sturing moet gebruikt worden moet men er op letten dat de uitgangsspanning minstens 1,4V kan worden, op deze manier garanderen we dat ook FET P3 mee stroom kan leveren naar de poortpin. In het geval van het aansturen van een NPN transistor kunnen we in serie met de basis een diode opnemen om zo de uitgangsspanning tot op1,4v te kunnen brengen. Read Latch Alternatieve output functie Vcc Vcc Vcc Interne Pull-up Int.Bus Write to Latch D Q Port bitlatch CLK Q & Actief hoge sturing Actief lage sturing Read pin Alternatieve input functie Fig Mogelijke configuraties voor het aansturen van externe devices via transistoren De read-modify-write instructies en hun eigenschappen. Sommige instructies die data op een poort lezen, lezen de poortlatch waar andere instructies de poortpin lezen. Welke instructies lezen nu welke data? De instructies die de poortlatch lezen in plaats van de poortpinnen zijn diegenen die de poortdata lezen, ze eventueel aanpassen en dan terugschrijven naar de poort. Dit noemen we de 'read-modify-write' (RMW) instructies. De instructies die hieronder aangegeven worden in de tabel zijn zulke RMW instructies. Wanneer de destination operand in de instructie een poort is, of een poortbit, zullen deze instructies de poortlatch lezen en niet de poortbit. Het is niet zo voor de hand liggend dat de laatste drie instructies ook RMW instructies zijn, maar toch is het zo. Ze lezen de poortbyte, alle 8 bits, passen de geadresseerde bit aan en schrijven de nieuwe byte terug naar de poortlatch. De reden waarom de RMW instructies de latch lezen en niet de poortpinnen is om een verkeerde interpretatie te vermijden bij het lezen van het spanningsniveau van een poortpin. Wanneer bv. zoals in de figuur een NPN transistor wordt aangestuurd, zal voor een Pauwels D. Embedded systems 59
61 logisch niveau '1' dat naar de pin is gestuurd er bij het lezen van de pin maar 0,7V (of in het geval van de bijkomende diode 1,4V) gezien worden door de ingangsbuffer, wat overeenkomt met een logisch '0' niveau, en wat het verkeerde logische niveau is. Het lezen van de latch levert in dit geval wel de logiche waarde op. RMW- Omschrijving Instructie ANL Logische AND bv. ANL P1,A ORL Logische OR bv. ORL P2,A XRL Logische EX-OR bv. XRL P3,A JBC Jump als bit 1 is en clear bit bv. JBC P1.1, label CPL Complement bit bv. CPL P3.0 INC Increment bv. INC P2 DEC Decrement bv. DEC P3 DJNZ Decrement and jump if not zero bv. DJNZ P2,label MOV PX.Y,C Move carrybit in bit Y van poort X CLR PX.Y Clear bit Y van poort X SETB PX.Y Set bit Y van poort X Tabel Read Modify write instructies bij Voordelen van deze 'open-drain' poortdrivers. Door de open drain poortstructuur is het mogelijk verschillende poortpinnen die als uitgang zullen werken met elkaar door te verbinden. Dit kan zonder dat er beschadiging zal optreden van één van de poortdrivers wanneer de poortpinnen worden gestuurd op een verschillend logisch niveau. Bij controllers met een actieve push-pull uitgang is dit niet mogelijk! Deze eigenschap kan nuttig zijn bij het lezen van externe schakelaars, of keyboards. Ook kunnen op deze manier verschillende controllers via een parallelle poort gewoon worden verbonden met elkaar. We zullen deze twee voorbeelden even verder bespreken Keyboards en schakelaars Een groot aantal embedded producten (bijna allemaal) hebben een keyboard interface als input voor de gebruiker of moeten een aantal schakelaars lezen. Een keyboard kan zowel gebruikt worden voor het ingeven van numerische data als voor het selecteren van een werkingsmode van het toestel. Er bestaan voor het lezen van keyboards kant en klare oplossingen in chipvorm, maar een software aanpak voor keyboardscanning of het lezen van schakelaars heeft het voordeel dat de kostprijs van het product kleiner wordt en dit in ruil voor een kleine CPU overhead. De meeste keyboards bestaan uit een matrix van aansluitdraden waar op elk kruispunt een drukschakelaar is mee verbonden. De controller kan dan zeer eenvoudig bepalen welke schakelaar er is ingedrukt. De keyboardhardware basics. Bij een keyboard wordt meestal een drukschakelaar gebruikt, waarvan het sluiten eenvoudig kan worden gedetecteerd door volgend circuit. De pull-up weerstand zorgt ervoor dat er een logisch '1' signaal aan de uitgang staat wanneer de schakelaar open staat, en een logische '0' wanneer de schakelaar is gesloten. Pauwels D. Embedded systems 60
62 De pull-up weerstand zit bij de 8051 familie principiëel reeds intern in de pindriver, maar meestal plaatst men extern toch nog een laagohmige pull-up weerstand (enkele KΩ) uit betrouwbaarheidsoverwegingen. +5V Schakelaar open Contactdender Schakelaar open Naar de controlleringang +5V Schakelaar GND dicht Schakelaar ingedrukt Fig Interfacing van een schakelaar, met bounce, via een pull-up d Helaas zijn schakelaars niet ideaal en genereren ze geen gedefinieerde '1' of '0' wanneer ze worden ingedrukt of losgelaten. Alhoewel een contact snel en stevig lijkt te sluiten, is dit voor de snelle controller een zeer trage gebeurtenis. Wanneer het contact wordt gesloten 'botst' het nog enkele keren als een bal. Dit botsen noemt men contactdender of bounce. Het effect hiervan wordt aangegeven in de vorige figuur. De contactdender zorgt voor meerdere pulsen op de controller-ingang en deze dender duurt typisch tussen de 5 en 30mS. Zie fig Wanneer meerdere schakelaars nodig zijn in een systeem kan men elke schakelaar op deze manier verbinden met een poortpin van de controller. Voor een groot aantal schakelaars zijn er al snel niet genoeg poortpinnen voorhanden. De meest efficiënte manier om schakelaars te verbinden met een controller is in de vorm van een twee-dimensionale matrix zoals aangegeven in de figuur Dit levert winst op van poortpinnen vanaf 6 schakelaars. t Scanlijnen (rijen) Keyboard matrix "0" 1 1 POORT X 1 1 AT89S Leeslijnen (kolommen) Fig Schakelaars verbonden in matrixvorm. Pauwels D. Embedded systems 61
63 Het aantal schakelaars nodig in de matrix is natuurlijk afhankelijk van de toepassing. Elke rij wordt aangestuurd door een poortbit (output), terwijl elke kolom wordt omhoog getrokken door de (interne) pull-up van de poortpin (input) waarmee hij is verbonden. Uiteraard kan ook met elke kolom extern nog een extra pull-up weerstand worden verbonden. Keyboard scanning is het proces waarbij de controller op regelmatige tijdstippen naar de keyboard matrix kijkt om te zien of er een toets is gedrukt. Als er een toets werd ingedrukt is het aan de keyboard scanningsoftware om de dender weg te filteren en te bepalen welke toets er werd ingedrukt. Uiteraard hoeft het niet altijd te gaan om een keyboard dat op deze manier wordt verbonden, wanneer in een systeem een groot aantal contacten moet worden gelezen zoals bv. einderitschakelaars, contacten van relais,naderingsschakelaars enz. kan dit ook op deze manier. Een matrix (keyboard) scanning algoritme. Een matrix kan op verschillende manieren worden gelezen, een eenvoudig algoritme wordt hier aangegeven. In de vertrektoestand worden alle rijen (outputpinnen) op een logische '0' gezet. Wanneer er geen toets is gedrukt zullen alle kolommen (inputpinnen) als logisch '1' gelezen worden. Het indrukken van een toets (sluiten van een contact) heeft als gevolg dat één van de kolommen laag gemaakt wordt. Om te zien of een toets is ingedrukt moet de controller dus alleen kijken of er een inputpin (kolom) laag staat. Wanneer de controller gedetecteerd heeft dat er een toets is ingedrukt, moet hij nog bepalen welke toets het is. Dit mechanisme is heel eenvoudig. De controller stuurt een '0' op slechts één van de rijpinnen (outputpinnen). Als er een '0' wordt teruggevonden op de ingangspinnen (kolommen) dan weet de controller dat de ingedrukte toets zich bevindt op de met een '0' aangestuurde rij. Dit kan een probleem geven bij controllers die niet beschikken over een open-drain pindriver. Indien er immers twee toetsen worden ingedrukt op dezelfde kolom zal een rijpin die '0' is kunnen verbonden worden met een rijpin die op '1' gestuurd is. Dit geeft bij de 8051 familie geen probleem, maar bij een aantal controllers met een actieve (push-pull) uitgangstrap zal dit het defect van een pin veroorzaken. Als alle ingangen hoog blijven bevindt de ingedrukte toets zich niet op de geselecteerde rij en de controller maakt dan de volgende rij logisch '0' en het proces herhaalt zich. Wanneer de rij is bepaald kan de controller nagaan welke van de kolommen (inputpinnen) er '0' is, dit geeft de kolom aan van de ingedrukte toets. De tijd die de controller nodig heeft om deze handelingen uit te voeren is zeer klein (enkele µs) vergeleken met de minimale tijd dat een schakelaar wordt ingedrukt (enkele honderden ms), er wordt dan ook verondersteld dat de schakelaar gesloten blijft tijdens dit proces. Om de contactdender weg te filteren zal de controller het keyboard scannen met een bepaald tijdsinterval, typisch tussen de 20 ms en de 100ms, wat de debounce periode wordt genoemd. Een toets is pas echt ingedrukt wanneer hij tweemaal na elkaar ingedrukt wordt terug gevonden, anders kan het gaan om een stoorsignaal of om de contactdender. Soms is het nodig te reageren op een toets die wordt ingedrukt of die wordt losgelaten, en niet op een ingedrukt gehouden schakelaar. Een dalende flank van een ingedrukte toets heeft men na opeenvolgend een niet ingedrukte en twee ingedrukte toestanden, en een stijgende flank van een losgelaten toets heeft men na opeenvolgend een ingedrukte en twee niet ingedrukte toestanden. De rij- en kolominformatie van de toets kan dan worden omgezet naar een scancode die dan in een buffer kan worden geplaatst. Pauwels D. Embedded systems 62
64 Buffering is handig omdat het voorkomt dat er toetsinfo verloren gaat wanneer de toepassing niet direct de toetsinfo kan verwerken. De buffergrootte is weer afhankelijk van de toepassing. Een 'keyflag' kan aangeven aan de toepassing dat er nog toetsinfo in de buffer aanwezig is Het scannen met een bepaald tijdsinterval kan worden opgestart door een periodische timerinterrupt die meestal in elk systeem wel aanwezig is als systeem-'time-tick' Parallelle communicatie tussen twee controllers. Wanneer twee controllers op éénzelfde systeem (PCB) met elkaar moeten communiceren kan dit op verschillende manieren. De eenvoudigste manier, wat verbindingen betreft, is de controllers seriëel te laten communiceren. Indien er poortpinnen genoeg voorhanden zijn en indien de communicatie snel moet verlopen kan er ook een parallelle verbinding nodig zijn. Dit kan bij de 8051 familie zonder bijkomende hardware, zoals te zien is in de volgende figuur Bidirectionele datalijnen Poort x Poort x AT89S8252 P 3.2/ int0 A Bidirectionele handshakelijn AT89S8352 P 3.2/ int0 B Fig Parallelle verbinding tussen twee 8051 compatibelen. Door de open-drain structuur zullen de pindrivers niet worden beschadigd indien op dezelfde verbinding door de beide controllers een verschillend logisch signaal wordt gestuurd, de logische '0' is dominant. Naast de poorten waarlangs onderling bidirectioneel data wordt doorgegeven worden er ook nog twee pinnen doorverbonden die als alternatieve functie een interruptingang hebben. Deze vormen de handshakelijn waarmee een controller aangeeft aan de andere controller wanneer zijn data beschikbaar is. Als vertreksituatie zetten beide controllers hun datapoort als ingang en hun handshakelijn als interrupt ingang. Stel dat controller A data wil sturen naar controller B, en daarop een antwoord verwacht van controller B. Controller A zal dan zijn data op zijn datapoort zetten (output) zodat controller B deze kan lezen. Om aan te geven dat de data geldig is zal controller A zijn handshakepin omschakelen als output en op deze lijn een actief lage puls geven. De handshake-ingang (interruptingang) van controller B zorgt hiermee voor een interrupt bij controller B, die de data op zijn poort nu kan lezen en verwerken. Controller A kan nu zijn handshakepin omschakelen als interruptingang. Pauwels D. Embedded systems 63
65 Controller B schakelt na het lezen en verwerken van de data zijn handshake pin om als uitgang en zet zijn antwoord data op de datapoort. Dit terwijl ook nog de data van controller A aanwezig is. Dit kan conflicten geven bij andere controllerfamilies met actieve push-pull uitgangen, maar niet bij de 8051 familie. Controller B kan nu een actief lage puls op de handshakelijn zetten. Dit wekt een interrupt op in controller A die nu de antwoord-data kan lezen op zijn poort die hij eerst als input schakelt door er '1' niveau's naar te schrijven. Dit proces kan zich nu verder herhalen. Uit deze voorbeelden blijkt dat de 8051 familie een zeer interessante poortstructuur heeft die heel wat mogelijkheden geeft. Het is echer ook nog mogelijk de poortpinnen te gebruiken als I/O pin én als pin met een alternatieve functie tegelijkertijd. Op deze manier kunnen heel wat effecten worden bekomen die anders softwarematig moeten opgelost worden. Hierover volgt later nog meer. Tenslotte verwijzen we naar de Technical Manual van de gebruikte controller voor een uitvoerige beschrijving van de elektrische karakteristieken van elke poort. Dit is enkel van belang voor diegenen die een controller gaan toepassen in een eigen ontwerp. De beschreven poortstructuur is immers niet bij alle 8051 derivaten exact gelijk. Soms is het mogelijk om bv. meer stroom te sinken en er bv. direct LEDs mee aan te sturen. Soms is de structuur zelfs compleet verschillend zoals bij de C868 Infineon controller. Pauwels D. Embedded systems 64
66 5.2 Timers / Counters. Timers / counters zijn bouwstenen die principiëel kunnen gebruikt worden om 'events' te tellen of om tijdperiodes te meten. Deze bouwstenen zijn meestal geconfigureerd als 8-bit of 16-bit rimpeltellers, met één of meerdere ingangsbronnen voor het clocksignaal. Een carrybit die een rollover van 0FFFFh naar 0000h van de teller aangeeft is voorzien en kan meestal softwarematig worden bekeken, of een interrupt genereren. Indien we de teller clocken met een vaste en gekende systeemclock, of een ervan afgeleide frequentie, dan gebruiken we de tellerhardware als timer. De teller telt dan met vaste en gekende periode. Wanneer we een extern signaal als clocksignaal voor de tellerhardware gebruiken, al dan niet met een vaste frequentie, dan gebruiken we de tellerhardware als counter. Timers / counters kunnen bv. gebruikt worden om de pulsbreedte te meten van een pulssignaal aan de ingang van een timer/counter, om een pulstrein met een bepaalde frequentie en eventueel een complexe golfvorm te genereren op een uitgangspin, om een preciese vertragingstijd op te wekken in een programma enz. We zullen hier verder de basistimers van de 8051 familie bekijken en ook enkele timers die terug te vinden zijn in een aantal verschillende varianten uit deze familie. Deze zijn uitgebreid met extra's zoals capture- en compare mogelijkheden. Tegelijkertijd belichten we enkele van hun mogelijke toepassingen Timer 0 en 1 van de 8051 familie. De 8051 familie heeft standaard twee timers, TIMER0 en 1, die beiden individueel gecontroleerd, gelezen, geladen en geconfigureerd kunnen worden. De 8051 timers hebben zoals reeds vermeld een aantal algemene functies: de tijd bijhouden en/of tijd meten tussen events het tellen van de events zelf het genereren van baudrates voor de seriële poort. De hardware van de twee timers wordt gecontroleerd en geconfigureerd door de special function registers TCON en TMOD, die ze samen delen. Elke timer heeft zelf ook nog twee SFR's die de eigenlijke teller vormen (TH0/TL0 en TH1/TL1). De hardwareblokken van de timers kunnen softwarematig op vier verschillende manieren (modes 0 tot 3) worden geconfigureerd TIMER modes. MODE0 Door de TIMER/COUNTER in deze mode te schakelen configureren we hem als een 8bit TIMER/COUNTER met een 5 bit prescaler ( 32 ), dit is een 8048 compatibele mode. De 8048 is een oudere en nu niet meer gebruikte controllerfamilie. In deze mode is het telregister bestaande uit TH0 en TL0 als 13bit register geconfigureerd. Als het telregister overloopt van B naar B wordt de overflowflag TF0 geset. Deze kan gebruikt worden als interruptbron voor het genereren van een IRQ. In de figuur zijn de bits GATE, TR0, C/T software bestuurbare bits die bij de timer-initialisatie kunnen ingesteld worden. Ook TL0 en TH0 zijn softwarematig aanpasbaar. Pauwels D. Embedded systems 65
67 TR0, Gate, C/T zijn softwarematig instelbare bits terwijl TL0, TH0 als byte aanspreekbaar en aanpasbaar zijn a.d.h.v. een MOV instructie Fig Timer/Counter 0/1 in mode0 als 13bit Timer/Counter De te tellen pulsen worden naar het telregister doorgelaten indien de TR0 bit (Timer Run-bit) op 1 staat, en wanneer GATE 0 werd gemaakt of wanneer GATE 1 is maar de INT0-pin 1 is gemaakt. De GATE-bit 1 maken laat toe om de INT0-pin te gebruiken als externe gating-pin wat nuttig kan zijn om pulsbreedte metingen te doen. Mode 0 is hetzelfde voor TIMER0 en TIMER1. MODE1 Fig Timer/Counter 0/1 in mode1 als 16bit Timer/Counter. Deze mode functioneert op dezelfde manier als mode0, het enige verschil is dat het telregister nu bestaat uit 16bits t.o.v. 13bits in mode0. Deze mode1 heeft dus een groter telbereik nl. van 0 tot i.p.v Voor een systeem met een clockfrequentie van 12MHz resulteert dit in timermode in een telfrequentie van 1MHz, of een periodetijd van 1µs. Het resultaat hiervan is dus dat, als timer in mode0, een maximale tijd kan gemeten worden van 8192µs. of ms, terwijl dat in mode1 oploopt tot µs of ms. Pauwels D. Embedded systems 66
68 MODE2 In mode2 wordt de timer geconfigureerd als 8bit timer, het telregister is dus maar 8bit groot, met reload eigenschappen. In deze mode zal het telregister TL0 herladen worden vanuit het reload-register TH0 bij een telregister-overflow. De reload laat de waarde in het register TH0 onveranderd. Fig Timer/Counter 0/1 in mode2 als 8bit timer/counter met Auto-Reload Deze mode kan gebruikt worden om periodisch bepaalde events lees interrupt-routines op te starten zonder tussenkomst ( polling ) van de CPU. Stel dat we een routine om de 250µs. wensen uit te voeren met een clockfrequentie van 12 MHz, dan volstaat het om de registers TH0 en TL0 te laden met de waarde 6, en de timer in mode2 te schakelen om hiermee om de 250 µs. een interrupt te laten opwekken. Immers het maximale bereik in deze mode2 is 256, wat in timermode (@12MHz) overeenstemt met een maximale tijd van 256µs. Door nu reeds het telregister met 6 te preloaden zal 250 pulsen ( dus 250µs) later er een overflow met reload optreden. Deze overflow kan aanleiding geven tot het genereren van een interrupt indien de interruptlogica hiervoor werd geconfigureerd ( zie interrupts). Pauwels D. Embedded systems 67
69 MODE3 Fig Timer/Counter 0 in mode3 als twee 8bit timer/counters. Deze mode heeft een verschillend effect op TIMER0 en TIMER1. TIMER1 behoud gewoon zijn waarde in deze mode, het effect is hetzelfde als TR1 op nul te zetten. Bij TIMER0 in mode 3 zal worden opgesplitst in twee 8bit timers gevormd door telregisters TH0 en TL0. TL0 gebruikt de TIMER0 controlebits C/T, GATE, TR0 en de INT0 en T0 pinnen, terwijl TH0 gebruik maakt van de TR1 bit en overflows aangeeft in de TF1 flag! Dus, TH0 controleert nu de timer1 interrupt. Mode3 is voorzien voor toepassingen waar een extra 8bit timer nodig is. Terwijl TIMER0 in mode3 staat kan TIMER1 aan- en uitgeschakeld worden door hem in en uit mode3 te schakelen, TIMER1 kan hier gebruikt worden voor elke toepassing waar er geen interrupt-generatie nodig is. Pauwels D. Embedded systems 68
70 Besturingsregisters voor TIMER0/1 Special Function Register TMOD. Dit register bestaat uit twee identieke vier-bits velden die instaan voor de configuratie van TIMER0 en TIMER1. Elke bit in dit register heeft een besturingsfunctie voor de timers. GATE: Gating controle. Wanneer deze op 0 staat zal timer0/1 geënabled zijn als de TR0 /TR1 bit geset is. Wanneer deze op 1 staat zal timer/counter 0/1 geënabled zijn alleen als de betreffende interrupt pin INT0/INT1 hoog is en als de TR0/TR1 bit geset is. C/T: Counter of Timer selectiebit. Voor timer-werking moet deze op nul staan, voor counter-werking moet deze op 1 staan. Deze bit bepaalt van waar de te tellen pulsen zullen komen, intern vanuit de systeem-clock 12, of extern van de T0 of T1 pin. MODEBITS M1,M0. Met de combinatie van deze twee bits kiezen we de werkmode van de timer/counter De bits in dit register zijn niet individueel aanspreekbaar met SETB of CLR instructies, we moeten dus een hele byte ineens aanspreken. Dit doen we met een MOV instructie, zo zal vb. de instructie MOV TMOD,# B timer0 in mode2 schakelen en timer1 in mode0. Pauwels D. Embedded systems 69
71 Special Function Register TCON Twee bits uit dit register worden gebruikt om de timer/counter 0/1 aan of uit te zetten, dit zijn de bits TR0/TR1. De twee overige bits die in gebruik zijn voor timertoepassingen zijn TF0/TF1 dit zijn de timer-overflow flags die aangeven dat een timer/counter is overgelopen. Deze bits kunnen worden gebruikt om softwarematig de status van de timer te pollen, of om een interrupt te genereren. De bits in dit register zijn wel individueel aanspreekbaar en kunnen dus met SETB en CLR instructies aangepast worden. Zo zal bv. de instructie SETB TR0 timer0 starten. Pauwels D. Embedded systems 70
72 5.2.2 Toepassingen van TIMER 0 en 1. Bij wijze van voorbeeld worden een aantal verschillende toepassingsmogelijkheden van TIMER0 en 1 geschetst, met hun specifieke eigenschappen Tijdsmetingen van events (eenmalige intervalmeting). Bij tijdsmetingen van events worden timers meestal 'gated' gebruikt. De signaalpuls waarvan we de tijdsduur willen kennen wordt m.a.w. gebruikt als schakelsignaal om een clocksignaal met gekende periode door te schakelen naar het tellerregister, zolang de puls duurt. De teller zal worden geïncrementeerd zolang de puls aanwezig is. Indien we het tellerregister voorafgaandelijk clearen, kan nadat de puls verstreken is de tellertoestand gelezen worden. De tellerwaarde is dan een maat voor de verstreken tijd uitgedrukt in clockperiodes. Voor een gekende clockperiode kan hieruit dan de verstreken tijd worden berekend. Als clocksignaal wordt meestal het interne oscillatorsignaal gedeeld door 12 gebruikt, wat er op neer komt dat de teller iedere machinecyclus geïncrementeerd wordt. Indien gewenst kan ook een extern clocksignaal op de T0 of T1 ingang als tellerclock gebruikt worden. Men moet het te meten pulssignaal aanleggen aan de INT0/P3.2 ingang, die naast de 'gate'- functie ook tegelijk als interruptingang kan aangeschakeld worden. Dit heeft het bijkomende voordeel dat bij het beëindigen van de puls (event) ook direct een interrupt kan worden gegenereerd, die de routine voor de tijdsmeting opstart. OSC Div 12 Set&Cleared door hardware 5V Gnd Extern event T0 pin 1 Gate INT0 pin t INT0 kan gelijktijdig gebruikt worden als een interruptingang en als gate. > 1 TR0 C/T =0 C/T =1 & Control TL0 (8 Bits) TH0 (8 Bits) Resetten voor intervalmeting TF0 Interrupt Fig Tijdsmeting van events via basistimers. Wat is de meetonzekerheid, nauwkeurigheid en het bereik van de timer? 1µs onzekerheid 1µs onzekerheid t Timerincrements elke µs. Fig Meetonzekerheid bij tijdsmeting van het 'gating'signaal. Afhankelijk van de oscillatorfrequentie zal de teller met een bepaalde snelheid worden geïncrementeerd. Voor een clockfrequentie van 12 MHz is dit 1µs. Door het feit dat het Pauwels D. Embedded systems 71
73 'event' (de te meten puls) asynchroon met het clocksignaal van de teller verloopt zal er een meetonzekerheid bestaan van maximum 1µs aan de beide flanken van de te meten puls. Dit resulteert in een onzekerheid van 1µs op de tijdsmeting van de puls. Dit is vooral nadelig bij een kleine pulsbreedte. De nauwkeurigheid van de oscillatorfrequentie bepaald ook deze van de pulsbreedte, dit is meestal geen probleem daar de oscillatorfrequentie meestal wordt afgeleid van een quartskristal met een nauwkeurigheid van enkele ppm. Het bereik van de timer wordt bepaald door de mode waarin de timer wordt geschakeld, het grootste bereik (65536 counts of wordt bekomen als 16 bit teller in mode1. Softwarematig kan echter het bereik van de timer worden uitgebreid bij eenzelfde resolutie (clockfrequentie). Dit kan door de timeroverflows interrupts te laten genereren (IRQ Timer) die dan softwarematig worden geteld. Op deze manier kunnen we toch een timer implementeren met een praktisch onbeperkt bereik en een hoge resolutie. Het werkingsprincipe wordt in de volgende figuur geïllustreerd. Teller register 16 bit FFFFh C/T=0 TR0=1 GATE=1 RESET TH0,TL0 Timer overflow 5555h 0000h Start meting IRQ Timer IRQ Timer IRQ Timer IRQ Timer t Stop: Gate dicht Gatesignaal t Gate tijd= 4x65536µs µs IRQ Timer : INC COUNTER IRQ gate : lees TH0, TL0 en COUNTER en bereken de tijd IRQ gate Overflows tellen COUNTER TH0 TL0 Fig Softwarematig uitbreiden van het bereik van de tijdsmeting. Pauwels D. Embedded systems 72
74 Genereren van periodische timeroverflows of 'timeticks'. In de meeste systemen moeten er, naast een background taak, op periodische basis een aantal andere taken uitgevoerd worden. De meest gebruikelijke manier om dit te implementeren is deze taken als interruptroutine uit te voeren die periodisch wordt opgestart aan de hand van een timer interrupt. Er zijn een aantal mogelijkheden om dit te verwezenlijken met een timer. 16 bit TIMER (mode1) met software reload. Wanneer we een timer in mode1 schakelen en starten, zal hij bij elke machinecyclus geïncrementeerd worden en na counts via een overflow weer vanaf 0000h verder tellen. Door interrupts te laten genereren bij timeroverflow kunnen we zo periodisch om de ms een taak laten uitvoeren. Het nadeel van deze methode is dat we een vaste periode verkrijgen als tijdsbasis. FFFFh Timer overflow 16 bit timer (mode1) zonder reload 0000h t TimerIRQ TimerIRQ TimerIRQ Fig Time tick van ms. Een oplossing voor dit probleem is het preloaden van de tellerregisters (THx,TLx) met een bepaalde waarde (bv. XXYY) en dan pas de teller te starten. Op deze manier zal de teller veel vlugger zijn eindwaarde bereiken en een interrupt genereren bij het overlopen naar 0000h. De tijd 'Tp' hiervoor nodig is (10000h-XXYYh) 12/f waar f de clockfrequentie voorstelt. Wanneer we nu in de interruptroutine die als gevolg van de overflow opgestart wordt de timer even stoppen om hem weer te herladen met de waarde XXYY en hem daarna weer starten, dan zal zich na de ingestelde periode weer een overflow voordoen. De periode wordt zo op een softwarematige manier aanpasbaar. De tijd tussen de overflows wordt gelijk aan Tp, plus de tijd nodig om de timer softwarematig te herladen, plus de interruptlatency tijd van de microcontroller. De interruptlatency tijd is de tijd die de controller nodig heeft na het genereren van de interruptrequest (IRQ) tot het uitvoeren van de eerste instructie in de interruptroutine. Deze tijd is afhankelijk van het type instructie die de controller uitvoert bij het opwekken van de IRQ. Niet alle instructies duren immers even lang. Dit heeft timingjitter als gevolg tussen de opeenvolgende timeroverflows. Voor een aantal toepassingen heeft dit geen gevolgen, maar indien we deze 'timeticks' (periodische interrupts) gebruiken voor het genereren van Pauwels D. Embedded systems 73
75 timingsignalen op poortpinnen van de controller, of voor het updaten van een RTC dan zal dit ook hier aanleiding geven tot timingjitter, wat hier zeker niet toelaatbaar is. Er moet dus een betere manier gevonden worden! FFFFh Timer overflows XXYY preload 0000h Timing jitter! t Tp=(10000h-XXYYh).12/f TimerIRQ TimerIRQ TimerIRQ TimerIRQ TimerIRQ Interruptroutine bij timeroverflow: stop timer: TR0=0 reload timer: TH0=XX TL0=YY start timer: TR0=1 toepassing bv. Sturen van poortpinnen RETI 8 bit TIMER met autoreload. Accumulatie van timingfouten!! Fig Timingjitter bij software reload van de timer. Interrupt latency time = constant!!! timingjitter = geschikt als timetick Het probleem dat zich stelt bij de vorige situatie kan alleen worden opgelost indien de timer kan herladen worden zonder de softwarematige tussenkomst van de controller. Dit kan bv. door de timer in 8-bit autoreload mode te schakelen. FFh timeroverflows THx reload waarde (100h-reload).12/f 00h t TLx en THx laden Start timer timer IRQ timer IRQ timer IRQ timer IRQ timer IRQ Fig Hardware reload van de timer. Pauwels D. Embedded systems 74
76 De timingjitter is hier verdwenen en de periode tussen de interrupt requests wordt enkel nog bepaald door de clockfrequentie en de reloadwaarde van de timer. Deze mode heeft het voordeel dat ze wel kan gebruikt worden voor bv. het incrementeren van een RTC. Het nadeel van deze timermode is dat er bij de standaard 8051 timers (TIMER0 &1) slechts met een 8-bit teller kan gewerkt worden. De maximale periode tussen de interrupts wordt daardoor beperkt tot 256 keer de clockperiode wat voor sommige systemen veel te klein is. Sommige 8051 varianten hebben een bijkomende 16-bit timer (TIMER2) met autoreload mogelijkheden wat het probleem oplost. Dit euvel kan echter bij de basistimers TIMER0&1 ook softwarematig worden weggewerkt door in de interruptroutine het aantal gegenereerde IRQ's te tellen en pas na een bepaald aantal telkens de toepassing uit te voeren. Het volgende illustreert dit principe. 'COUNTER' is de variabele die na elke IRQ wordt gedecrementeerd en die wanneer hij nul wordt softwarematig weer wordt herladen met de waarde 'SKIP_IRQ', die ook bij de initialisatiefase van het systeem in deze variabele moet worden geladen. timerirq Initialisatie: MOV COUNTER, #SKIP_IRQ DJNZ COUNTER,BACK MOV COUNTER,#SKIP_IRQ Toepassing BACK: RETI Fig Software verlenging van de tijd tussen software-events. Op deze manier kunnen we praktisch een oplossing bieden voor de meeste toepassingen TIMER2 van de 8052 familie. (AT 89S8252) De meeste 8052 varianten (8051 plus enkele extra's) beschikken over een extra timer2, die voor elke controller er anders kan uitzien. De Atmel 89S8252 die 8051 compatibel is heeft o.a. deze extra Timer2. Timer2 is hier een 16 bit timer/counter die kan werken als timer of event counter. Timer2 heeft hier een capture en een auto-reload (up-down) mode. Aan de hand van deze timer is het bv. mogelijk grotere tijden tussen 'timeticks' te genereren zonder tussenkomst van de CPU 'Missing or late pulse' detector. Een andere mogelijke toepassing is een missing of late pulse detector die aangeeft dat een puls wegvalt uit een pulstrein, of dat de pulstrein helemaal wegvalt. Voor deze toepassing maken we gebruik van de T2EX pin van timer2. Langs deze pin kunnen we timer2 herladen via de dalende flank van een aangelegd signaal, in ons geval de te bewaken pulstrein. De EXEN2 schakelaar wordt hiervoor softwarematig gesloten. De timer wordt in autoreload mode geschakeld en geladen met een waarde XXYY. Pauwels D. Embedded systems 75
77 Deze waarde is zodanig gekozen dat wanneer een pulstrein met bepaalde eigenschappen op de T2EX pin wordt gezet, de timer nooit een overflow genereert. Indien er een puls wegvalt of te laat is, zal de timer overlopen en een IRQ genereren en kan het programma gepast reageren. Indien we de pulstrein afleiden van een nuldoorgangsdetectie van de netspanning, de pulsen komen dan om de 10 ms, dan kunnen we op deze manier bv. detecteren dat de netspanning wegvalt. Grotere tijd tussen timeticks zonder tussenkomst van de CPU Toepassing bv. missing of late puls detector Sync. van de reload met de dalende flank Fig bit reload van timer 2 van een AT89S8252 via de T2EX pin. FFFFh Timer overflow TL2,TH2 laden Reload XXYY 0000h TR2= on EXEN2= on Geen overflow IRQ Overflow IRQ t T2EX pin ok Niet ok ok t Vanaf hier detectie Puls ontbreekt Fig Missing pulse detectie via Timer2 van een AT89S8252. Pauwels D. Embedded systems 76
78 Absolute positiemeting a.d.h.v. lijnsensoren of hoekencoders. Timer2 kan bij de AT89S8252 ook als up-down counter worden geschakeld, waarbij de 'direction' pin (P1.1) aangeeft in welke richting geteld wordt. Op de T2 pin (P1.0) kan dan een extern signaal worden aangelegd waarvan we de pulsen kunnen tellen. Op deze manier kunnen we een absolute positiemeting doen a.d.h.v. een incrementele lineaire- of hoek-encoder. Deze encoders leveren twee 90º verschoven blokgolfvormige signalen, waarbij elke alternantie overeenkomt met een bepaalde lineaire- of hoekverplaatsing. De fase van het 'B' signaal t.o.v. het 'A' signaal (voorijlend of naijlend) is afhankelijk van de bewegingsrichting van de encoder. Zo zijn er bv. hoekencoders op de markt met 100 tot enkele duizenden pulsen per omwenteling! Bij een lijnsensor (lineaire encoder) is een resolutie van 20 pulsen per mm verplaatsing (1 puls per 50 micrometer) courant, denk hierbij maar aan de sensoren die worden gebruikt in de low cost inktjet printers. B ccw B cw A Fig Hoekencoder met een quadratuur gecodeerd uitgangssignaal. B D Q Direction T2EX pin Clk A Count T2 pin Fig Omzetting van quadratuursignalen in count en direction signalen. Door de signalen A en B aan te leggen aan een D-FF halen we uit deze signalen de 'direction' en 'count' informatie die we respectievelijk kunnen aanleggen aan de ingangen T2EX en T2 van timer2. Op deze manier kunnen we de absolute positie bijhouden met de timer, indien we deze preloaden met de waarde 7FFFh. Dit is onze 'home' positie (nulpositie), de positie waarvan we vertrekken met de meting. We kunnen nu evenveel pulsen (de helft van het 16- bit bereik of 32768pulsen) naar boven als naar beneden tellen. Op deze manier kunnen we de absolute positie van onze encoder bijhouden zonder verdere tussenkomst van de CPU, dit voor een bereik van 1,6384 m in beide richtingen bij een resolutie van 50 µm! Pauwels D. Embedded systems 77
79 Indien dit bereik moet worden uitgebreid, kan dit op eenvoudige manier door softwarematig a.d.h.v. de underflows en overflows een bijkomende variabele (die de MSB vormt van het uiteindelijke bereik) te decrementeren of te incrementeren. FFFFh + 7FFFh TR2= on 0 positie home Preload h t Direction Up Down Up t Count Start beweging t Fig Automatische positiebepaling via een timer met under/overflow reload. underflow P1.0 overflow 0000h Direction (ook softwarematig te controleren =pin P1.1) Fig Timer2 van de AT89S8252 met under/overflow reload mogelijkheden. Pauwels D. Embedded systems 78
80 Periodemeting a.d.h.v. de capture mode. Een 'capture' mode van een timer is een mode waarbij de tellerwaarde van een timer bij een bepaalde gebeurtenis (typisch een flank aan een controlepin van de timer) wordt gecopiëerd naar een capture-register. Dit capture-register kan dan door de CPU worden gelezen en bewaard in het geheugen. Bij een tweede 'capture' kan de CPU het capture-register opnieuw lezen en het verschil maken tussen de twee capture waarden. Het verschil tussen beide waarden is een maat voor het tijdsverschil (periode) tussen de captures (flanken op de controlepin). De CPU wordt op interruptbasis verwittigd van het capturemoment zodat deze op het gepaste moment het captureregister kan lezen. Tevens worden de telleroverflows op interruptbasis doorgegeven aan de CPU, zodat deze kunnen worden geteld voor een software-extentie van het tellerbereik (periode). Timer2 in CAPTURE mode toepassing: periode meting Interrupts tellen voor software teller extentie Fig Timer2 met capture mogelijkheden van de AT89S8252. FFFFh Tellerwaarde Capture2 E01fh overflow Capture1 0000h 1713h Timeroverflow IRQ t T2EX Capture IRQ Capture IRQ t time= (capture2 - capture1)x 12/f Fig Principe van periodemeting via de capture mode van een timer. Pauwels D. Embedded systems 79
81 5.2.4 Compare unit. Sommige varianten uit de 8051 familie zoals de Infineon C537 en C517 bezitten een compare-unit, die samen met een timer kan gebruikt worden. Een compare-unit vergelijkt een 16-bit getal dat is opgeslagen in het compareregister met de inhoud van een tellerregister. Wanneer de tellerwaarde de opgeslagen waarde bereikt, wordt een uitgangssignaal gegenereerd op een bijhorende poortpin. De inhoud van het compareregister kan eigenlijk worden gezien als een soort van 'time stamp' waarbij een bepaalde uitgang moet reageren op een welbepaalde manier (pin gaat naar '0' of '1'). Een variatie van deze comparewaarde verandert de golfvorm van een blokgolfsignaal op de poortpin. Op deze manier kan een PWM signaal worden opgewekt waarvan de duty-cycle softwarematig aanpasbaar is, of er kan een reeks gedefiniëerde blokgolfsignalen op een gecontroleerde manier worden gegenereerd. Deze twee verschillende modes worden nu verder besproken Opwekken van PWM signalen a.d.h.v. de compare unit. Waneer in deze mode het tellerregister de comparewaarde bereikt zal het uigangssignaal veranderen van '0' naar '1'. Het wordt weer '0' gemaakt bij een timeroverflow. Deze mode is ideaal voor het genereren van pulsbreedte gemoduleerde signalen (PWM). PWM signalen kunnen op hun beurt gebruikt worden voor digitaal naar analoog conversie via een low pass filternetwerk, of via het gecontroleerde element zelf, denk maar aan de inductantie van een DC of AC motor. 16 bit compareregister 16 bit digitale comparator match S Q Port x.y 16 bit timer (autoreload) Timer overflow R Fig Principe van het opwekken van een PWM signaal via een timer. Pauwels D. Embedded systems 80
82 Opwekken van meerdere complexe timingsignalen. De compare-unit kan ook gebruikt worden samen met software die adaptief de transities aan de uitgangspinnen bepaalt. Deze manier van werken wordt veel gebruikt voor het opwekken van signalen die geen vaste periode hebben zoals een PWM signaal, maar die wel heel precies en met een hoge resolutie moeten gecontroleerd worden zonder jitter. In deze mode kunnen de beide transities van het uitgangssignaal worden gecontroleerd. Fig Opwekken van complexe signalen via een timer met compare unit zoals de Infineon C517. Een softwarematige schrijfoperatie naar een uitgangspoort zal in deze mode geen direct gevolg hebben op de uitgangspinnen, de nieuwe waarde die naar de poort werd geschreven zal pas effectief op de uitgangspinnen worden gezet bij de volgende gelijkheid van de tellerwaarde en het compareregister. Bij deze gelijkheid (match) wordt een interrupt request doorgegeven aan de CPU. Men kan op deze manier dus kiezen of een pin een transitie moet maken van '0' naar '1' of van '1' naar '0' of dat het niveau ongewijzigd moet blijven bij de volgende 'comparematch'. In het blokschema fig wordt aangegeven dat het poortregister eigenlijk uit twee verschillende registers bestaat. Het register bovenaan (shadow latch) kan onder softwarecontrole worden geschreven, maar de geschreven waarde zal pas worden doorgegeven naar het uitgangsregister (output buffer) in responce op een comparator gelijkheid. De gebruiker maakt voor deze toepassing twee tabellen aan in het geheugen. Een tabel die de achtereenvolgende uitgangswaarden (pattern) weergeeft die op de poort moeten worden gegenereerd. En een tweede tabel met16 bit waarden (schedule) die aangeeft bij welke tellerwaarden de opeenvolgende patroonwaarden naar buiten moeten gestuurd worden. De CPU zal uit de patroontabel de eerste data ophalen en naar het shadowregister sturen en vervolgens de timinginfo ophalen uit de scheduletabel en deze naar het compareregister schrijven. De bijhorende timer wordt dan geïnitialiseerd en gestart. De uitgangspinnen zullen dan bij het bereiken van de comparewaarde automatisch worden aangepast. De CPU krijgt ook een IRQ binnen en kan nu in de bijhorende interruptroutine de waarden van het shadowregister en de comparewaarde aanpassen met nieuwe waarden uit de Pauwels D. Embedded systems 81
83 tabellen. De teller loop ondertussen verder en bij een volgende gelijkheid worden de poortpinnen opnieuw aangepast. Belangrijk hier is te begrijpen dat de opgewekte signalen worden opgewekt met een timing die door de timer wordt bepaald en dat alle signalen tegelijk van toestand kunnen veranderen zonder timingjitter. Volgende figuur illustreert een en ander. Fig Gebruik van twee tabellen voor het genereren van timingsignalen op poort5 van een C517. Pauwels D. Embedded systems 82
84 5.2.5 Watchdog timer (AT 89s8252). De meeste embedded systemen moeten zeer betrouwbaar zijn, het is niet mogelijk om te wachten tot er iemand het systeem reboot als de software hangt. Sommige systemen zijn zelfs niet toegankelijk voor personen. Als hun software ooit hangt, blijven ze voor altijd buiten werking. Voor andere systemen zou de snelheid waarmee het systeem door een persoon gereset wordt te traag zijn om de werking van het product in zijn geheel te garanderen. Een watchdog timer is een hardware timer die een detectie kan maken van softwareproblemen en de CPU kan resetten als ze optreden. Algemeen gezien is een watchdog timer gebaseeerd op een teller die vanaf een initiële waarde naar beneden telt tot nul. De embedded software stelt de initiële waarde in en herstart de teller op periodische basis. Als de teller ooit de waarde nul bereikt voordat de software hem herstart, wordt er verondersteld dat de software een probleem heeft en wordt de CPU gereset. Op dat ogenblik wordt de CPU en de embedded software die erop draait herstart op dezelfde manier als bij een hardware reset. De watchdogtimer is soms een chip extern van de controller, maar meestal zit hij intern in de controller. In ieder geval is de uitgang van de watchdogtimer verbonden met de reset ingang van de CPU. Onafhankelijke oscillator Osc. Watchdogtimer Prog. prescaler Reset CPU Power on PS0,PS1,PS2 POF bit= 1' RST heeft geen invloed WDTRST WD reset Write '1' (Power Failure) WDTEN Fig Functioneel blokschema van de AT89S8252 watchdogtimer. Als vb. nemen we de watchdogtimer uit de AT89S8252 chip van Atmel. De watchdog timerperiode kunnen we softwarematig instellen a.d.h.v. de PS0..PS2 bits uit het WMCON register zoals aangegeven in de volgende tabel Pauwels D. Embedded systems 83
85 Tabel Mogelijke timerperiodes. Stel dat de normale programmaloop ongeveer 26ms in beslag neemt, dan stellen we de watchdogtimer in op de eerst volgende grotere waarde, in ons geval 32ms. Dan zal in normale omstandigheden de watchdogtimer om de 26ms worden herstart en zal een watchdogtimer nooit de CPU resetten. Bij het aanschakelen van de voedingsspanning zal ook een POF-bit worden geset, die aangeeft dat er een powerfailure was. Deze bit wordt na de initialisatie van het systeem softwarematig gecontroleerd, en indien geset, geeft dit aan dat het systeem gereset werd door een power-up conditie. In de (oneindige) hoofdlus resetten we dan softwarematig deze bit en starten de normale procedures van de toepassing. Op het einde van de hoofdlus resetten we de watchdogtimer door de WDRST bit te setten, en blijven de lus uitvoeren. Power-on 'POF'='1' Systeem initialisatie POF='1'? ok J N nok Watchdog reset Error handler (error counter??) Main loop POF='0" Bv: programma-loop= 26ms watchdog=32 ms normale hoofdprogramma (oneindige lus met bepaalde maximum-timing) Interrupt handler Shut down watchdog herstarten Fig programmastructuur bij het gebruik van een watchdogtimer. Pauwels D. Embedded systems 84
86 Indien door een softwarefout de watchdog niet wordt herstart (oneindige lus door een slechte test in een subroutine, overvloed aan interrupts, deadlock bij multitasking ) dan wordt het systeem gereset en starten we weer bovenaan in de flowchart. In dit geval zal de 'POF' bit echter niet op '1' staan en kunnen we detecteren dat er een watchdog-reset is opgetreden. We kunnen dit afhandelen door een error handler uit te voeren die de situatie afhandelt of die in de meeste gevallen niet meer is dan een errorcounter die na een aantal watchdog resets het systeem naar een shutdown toestand brengt. Wanneer de watchdog timer intern de controller zit, zal hij niet automatisch opstarten maar moet dit bij de initialisatie van het programma gebeuren. Om te voorkomen dat hij per ongeluk door een 'bug' in het programma wordt uitgeschakeld kan de watchdogtimer meestal niet meer softwarematig uitgeschakeld wortden. Voor sommige producten wordt door de Duitse TUV veiligheidsreglementering (Technischer ÜberwachungsVerein) geëist dat een hardwarematige watchdogtimer extern van de controller zit, daar hij dan ook bij een fout in de initialisatie- software reeds kan optreden. Een watchdog timer is een zeer nuttige tool om een systeem te helpen herstellen van sommige eenmalige fouten. Daar het tegenwoordig een standaard is watchdogs aan te treffen in controllers is deze methode ook 'gratis' te implementeren. Wanneer men werkt aan een 'mission-critical' systeem zal gezond verstand en een veiligheidsreglementering vereisen dat er een watchdog gebruikt wordt. En zelf in andere gevallen is het een goed idee om een systeem op deze manier bedrijfszekerder te maken! Pauwels D. Embedded systems 85
8051 Microcontroller Embedded Systemen Een gids voor XC888 toepassingen.
8051 Microcontroller Embedded Systemen Een gids voor XC888 toepassingen. Versie: 1.0 01/10/2010 2.0 11/07/2011 3.0 05/07/2014 Auteurs: Pauwels D. Roggemans M. Inhoudsopgave: Inhoudsopgave:... 2 Inleiding...
De Arduino-microcontroller in de motorvoertuigentechniek (2)
De Arduino-microcontroller in de motorvoertuigentechniek (2) E. Gernaat (ISBN 978-90-79302-11-6) 1 Procescomputer 1.1 Microprocessoren algemeen De informatie-verwerking zoals is behandeld, is vrijwel geheel
De Arduino-microcontroller in de motorvoertuigentechniek (4)
De Arduino-microcontroller in de motorvoertuigentechniek () E. Gernaat (ISBN 978-90-7930--6) De Atmel ATmega38/P microcontroller. Uitvoering De ATmega38 is een microprocessor van de Amerikaanse firma ATMEL
De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (2)
De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (2) Timloto o.s. / E. Gernaat / ISBN 978-90-79302-06-2 Op dit werk is de Creative Commens Licentie van toepassing. Uitgave: september 2012
De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (4)
De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (4) Timloto o.s. / E. Gernaat / ISBN 978-90-79302-06-2 Op dit werk is de Creative Commens Licentie van toepassing. Uitgave: september 2012
2 Algemene opbouw van een computersysteem
Procescomputer E. Gernaat 1 Microprocessoren algemeen Informatie-verwerking zoals behandeld is momenteel vrijwel geheel overgenomen door microprocessoren. Wanneer we voortborduren op het idee van combinatorische
Hoofdstuk 7. Computerarchitectuur
Hoofdstuk 7 Computerarchitectuur 1 controlebus CPU MEMORY I/O databus adresbus Figuur 71 Schematische opbouw van een computersysteem 8 Figuur 72 Een busverbinding Buslijn Out E A In Out E B In Out E C
informatica. hardware. overzicht. moederbord CPU RAM GPU architectuur (vwo)
informatica hardware overzicht moederbord CPU RAM GPU architectuur (vwo) 1 moederbord basis van de computer componenten & aansluitingen chipset Northbridge (snel) Southbridge ("traag") bussen FSB/HTB moederbord
BASIS MICROCONTROLLERS. INLEIDING EN ADDENDUM BIJ HET AduC800 DATABOEK.
BASIS MICROCONTROLLERS INLEIDING EN ADDENDUM BIJ HET AduC800 DATABOEK. ROGGEMANS M. 07/2014 2 Inhoud INLEIDING:... 4 HOOFDSTUK 1: DE UNIVERSELE VERWERKINGSEENHEID... 8 1.1 INLEIDING:... 8 1.2 HET GEHEUGEN:...
Microcontrollers Week 1 Introductie microcontroller Jesse op den Brouw INLMIC/2014-2015
Microcontrollers Week 1 Introductie microcontroller Jesse op den Brouw INLMIC/2014-2015 Computersysteem Een systeem dat rekenkundige operaties, data manipulaties en beslissingen kan uitvoeren, aan de hand
Tinyserir-RC5. Datasheet. Tinyserir-RC5 Page: 1 of 8
9600 bps RS-232 interface voor uitlezing van Ontvangen RC5 codes Led aanduiding bij ontvangst van Infrarood pulsen Led aanduiding goede werking Interne firmware Inwendige oscillator Weinig externe componenten
Geheugenbeheer. ICT Infrastructuren 2 december 2013
Geheugenbeheer ICT Infrastructuren 2 december 2013 Doelen van geheugenbeheer Reloca>e (flexibel gebruik van geheugen) Bescherming Gedeeld/gemeenschappelijk geheugen Logische indeling van procesonderdelen
De computer als processor
De computer als processor DE FYSIEKE COMPUTER Componenten van de computerconfiguratie Toetsenbord Muis Scanner Microfoon (Extern geheugen) Invoerapparaten Uitvoerapparaten Monitor Printer Plotter Luidspreker
ES1 Project 1: Microcontrollers
ES1 Project 1: Microcontrollers Les 3: Eenvoudige externe hardware & hardware programmeren in C Hardware programmeren in C Inmiddels ben je al aardig op gang gekomen met het programmeren van microcontrollers.
Wat is Arduino? Arduino = microprocessor (Atmel)
Intro tot Arduino Wat is Arduino? Volgens de website: Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers,
Klas : 5 Industriële ICT Herhalingsvragen reeks 1 PC-techniek
Klas : 5 Industriële ICT Herhalingsvragen reeks 1 PC-techniek VTI St.- Laurentius Neem eerst de tekst in het boek door, doe dit enkele keren en probeer uiteraard te onthouden wat je leest. Los nadien de
VRIJ TECHNISCH INSTITUUT Burg.Geyskensstraat 11 3580 BERINGEN. De PLC geïntegreerd in de PC. Vak: Toegepaste informatica Auteur: Ludwig Theunis
Burg.Geyskensstraat 11 3580 BERINGEN De PLC geïntegreerd in de PC. Vak: Toegepaste informatica Auteur: Ludwig Theunis Versie: vrijdag 2 november 2007 2 Toegepaste informatica 1 De Microprocessor Zowel
Inhoud vandaag. Interrupts. Algemeen ARM7 AIC
Inhoud vandaag Interrupts Algemeen ARM7 AIC Interrupts Wat is een interrupt? Een interrupt is een onderbreking van de huidige bezigheden ten gevolge van een externe gebeurtenis, zodanig dat de bezigheden
Labo digitale technieken
.. Het gebied "elektronica" is reeds geruime tijd onderverdeeld in twee specialiteiten, namelijk de analoge en de digitale technieken. Binnen analoge schakelingen gebeurt de signaalverwerking met lineaire
RAM geheugens. Jan Genoe KHLim. Situering RAM-geheugens. Geheugens. Halfgeleider Geheugens. Willekeurig toegankelijk geheugen
Jan Genoe KHLim Situering RAM-geheugens Geheugens Halfgeleider Geheugens Serieel toegankelijk geheugen Willekeurig toegankelijk geheugen Read Only Memory ROM Random Access Memory RAM Statische RAM SRAM
De CB channel controller TMS1022NL/NLL en TMS1023NL/NLL. ( Dit is een maskrom-programmed version van de Texas Instruments TMS1000 family)
De CB channel controller TMS1022NL/NLL en TMS1023NL/NLL ( Dit is een maskrom-programmed version van de Texas Instruments TMS1000 family) Ik begin even met een korte inleiding over de TMS1000. ( Wil je
Van Poort tot Pipeline. Ben Bruidegom & Wouter Koolen-Wijkstra AMSTEL Instituut Universiteit van Amsterdam
Van Poort tot Pipeline Ben Bruidegom & Wouter Koolen-Wijkstra AMSTEL Instituut Universiteit van Amsterdam Van Poort tot Pipeline Pipeline processor One cycle machine Calculator File of registers Assembly
Microcontrollers Introductie INLMIC Jesse op den Brouw INLMIC/2014-2015
Microcontrollers Introductie INLMIC Jesse op den Brouw INLMIC/2014-2015 Microcontroller Uit Wikipedia A microcontroller (sometimes abbreviated µc or uc) is a small computer on a single integrated circuit
Microcontrollers Labo
Microcontrollers Labo 8051 based microcontroller ADuC832 from Analog Devices 06/2016 Roggemans M. (MGM) LES 0 Testen en verdelen van de hardware FTP site overlopen Installeren van software om thuis te
Wat is een busverbinding?
Wat is een busverbinding? gemeenschappelijke verbinding tussen CPU, geheugen en I/O-schakelingen onderscheid tussen: databus/adresbus/controlbus intern/extern serieel/parallel unidirectioneel/bidirectioneel
De seriële poort Jan Genoe KHLIM
De seriële poort Jan Genoe KHLIM De seriële poort 1 De seriële poort Een PC bezit een aantal seriële poorten: COM1, COM2,... Er zijn 1 of 2 seriële poorten voorzien op het moederbord Plug-in kaarten laten
Praktijkinstructie Industriële automatisering 3 (ICT09.3/CREBO:53270)
instructie Industriële automatisering 3 (ICT09.3/CREBO:53270) pi.ict09.3.v1 ECABO, 1 april 2002 Alle rechten voorbehouden. Niets uit deze uitgave mag worden vermenigvuldigd, overgenomen, opgeslagen of
AP80 Display Controller
Datasheet AP80 AP80 Display Controller Toepasbaar als: Display voor positie en snelheid Nokkencontroller Signaalomvormer Toerentalbewaking Linearisatie functie 72 mm ca. 160 mm 144 mm Voor sensoren met:
Inleiding microcontrollers. Week 1 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/
Inleiding microcontrollers Week 1 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/2018-2019 Microcontroller Uit Wikipedia: A microcontroller (sometimes abbreviated µc or
Peripheral Interface Controllers. BRAC clubavond 5-105 PE2WDO
Peripheral Interface Controllers -10 PE2WDO Programma Introductie Wat is een PIC Wat heb je nodig om te beginnen Praktijkopdrachten: Voorbeeld met uitleg Opdrachten pag. 2 Wat is een PIC Programmable Intelligent
Hardware-software Co-design
Jan Genoe KHLim Versie: maandag 10 juli 2000 Pagina 1 Wat is HW/SW Co-design Traditioneel design: De verdeling tussen de HW en de SW gebeurt bij het begin en beiden worden onafhankelijk ontwikkeld Verweven
Sequentiële Logica. Processoren 24 november 2014
Sequentiële Logica Processoren 24 november 2014 Inhoud Eindige automaten Schakelingen met geheugen Realisatie van eindige automaten Registers, schuifregisters, tellers, etc. Geheugen Herinnering van week
Deel 2 S7 Graph Ont4 - GA3
Deel 2 S7 Graph Ont4 - GA3 Deel 2 : Graph 09/05 1 Wanneer er in een installatie een sequentiële beweging geprogrammeerd moet worden is het interessant om gebruik te maken van S7 Graph. De progammastructuur
De CPU in detail Hoe worden instruc4es uitgevoerd? Processoren 28 februari 2012
De CPU in detail Hoe worden instruc4es uitgevoerd? Processoren 28 februari 2012 Tanenbaum hoofdstuk 2 von Neumann - architectuur. Tanenbaum, Structured Computer Organiza4on, FiMh Edi4on, 2006 Pearson Educa4on,
LocoServo Handleiding
LocoServo Handleiding HDM12 Disclaimer van Aansprakelijkheid: Het gebruik van alle items die kunnen worden gekocht en alle installatie-instructies die kunnen worden gevonden op deze site is op eigen risico.
AVR-DOPER MINI ASSEMBLAGE HANDLEIDING + LAYOUT. Geschreven door: Tom Vocke
AVR-DOPER MINI ASSEMBLAGE HANDLEIDING + LAYOUT Geschreven door: Tom Vocke Datum: 28-09-2010 Inleiding: Dit document bevat alle hardware informatie betreffende de AVR-Doper mini. Het eerste deel zal zich
Hoofdstuk 6: Digitale signalen
Hoofdstuk 6: Digitale signalen 6. Algemeenheden Het decimale talstelsel is het meest gebruikte talstelsel om getallen voor te stellen. Hierin worden symbolen gebruikt ( t.e.m. 9 ) die ondubbelzinning de
Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files
Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files 1 Introductie In deze oefening zal je je LCD display leren aansturen. Je controleert deze display door er instructies naar te
ES1 Project 1: Microcontrollers
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
18 Embedded systemen 1
18 Embedded systemen 1 r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15(pc) NZCV CPSR Figuur 18.1 ARM-programmeermodel Byte 0 Byte 1 Byte 2 Byte 3 Byte 3 Byte 2 Byte 1 Byte 0 Figuur 18.2 Endian conversie
von-neumann-architectuur Opbouw van een CPU Processoren 1 december 2014
von-neumann-architectuur Opbouw van een CPU Processoren 1 december 2014 Herhaling: Booleaanse algebra (B = {0,1},., +, ) Elke Booleaanse functie f: B n B m kan met., +, geschreven worden Met Gates (electronische
Gebruiksaanwijzing AVR910 USB Programmer
TECHNISCH INSTITUUT SINT-PAULUS Kruisven 25 2400 Mol Gebruiksaanwijzing Schooljaar 2007-2008 Studierichting EE Gebruiksaanwijzing AVR910 USB Programmer Geïntegreerd in AVR-DevL Board Jan Cools Projecten
Digitale technieken Microprocessoren
Digitale technieken Microprocessoren ir. Patrick Colleman Inhoudstafel Inhoudstafel. Afkortingen. Inleiding - voorwoord 1 Hoofdstuk 1 : Voorstelling van getallen en karakters. 2 1.1 Voorstelling van binaire
LocoServo Handleiding
LocoServo Handleiding HDM12 Disclaimer van Aansprakelijkheid: Het gebruik van alle items die kunnen worden gekocht en alle installatie-instructies die kunnen worden gevonden op deze site is op eigen risico.
Microcontrollers Theorie
Microcontrollers Theorie 8051 based microcontroller ADuC832 from Analog Devices 07/2016 Roggemans M. (MGM) LES 1 Doelstellingen: situering vak, afspraken labo en evaluatie toelichten concept embedded oplossing
Jen Kegels, Eveline De Wilde, Inge Platteaux, Tamara Van Marcke. Hardware. De computer in een oogopslag. 1 / 11 Cursusontwikkeling
Hardware De computer in een oogopslag 1 / 11 Cursusontwikkeling Opslag Er worden verschillende apparaten gebruikt om gegevens op te slaan. Dit zijn de meest voorkomende apparaten. Harde schijf; CD / DVD;
computerarchitectuur antwoorden
2017 computerarchitectuur antwoorden F. Vonk versie 1 2-8-2017 inhoudsopgave hardware... - 3 - CPU... - 3 - bussen... - 4 - bridges... - 4 - RAM... - 4 - hardware architectuur... - 5 - Dit werk is gelicenseerd
4) De IPC@CHIP hardware.
4) De IPC@CHIP hardware. Hier geven we een beschrijving van de verschillende hardware-onderdelen van het RIOT bord en hun onderlinge samenhang. De belangrijkste componenten zijn: de IPC@CHIP SC12, een
Hoofdstuk 19. Embedded systemen
Hoofdstuk 19 Embedded systemen 1 r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15(pc) NZCV CPSR Figuur 19.1: ARM-programmeermodel. Byte 0 Byte 1 Byte 2 Byte 3 Byte 3 Byte 2 Byte 1 Byte 0 Figuur 19.2:
Departement industriële wetenschappen en technologie
Departement industriële wetenschappen en technologie Universitaire Campus, gebouw B B-3590 DIEPENBEEK Tel.: 011-23 07 90 Fax: 011-23 07 99 Aansturen en testen van een hybride infrarood beeldopnemer Abstract
Opgave Tussentijdse Oefeningen Jaarproject I Reeks 3: Tijd, licht en warmte
Opgave Tussentijdse Oefeningen Jaarproject I Reeks 3: Tijd, licht en warmte Voor deze oefeningenles heb je de handleiding van de uitgedeelde ARM processor nodig. Je kan deze vinden op de website van het
Digitale en analoge technieken
Digitale en analoge technieken Peter Slaets February 14, 2006 Peter Slaets () Digitale en analoge technieken February 14, 2006 1 / 33 Computerarchitectuur 1 Processors 2 Primair geheugen 3 Secundair geheugen
1 graduaat Elektriciteit/elektronica KHLim - dep. IWT HALFGELEIDER-GEHEUGENS HALFGELEIDER GEHEUGENS STATISCH DYNAMISCH ROM PROM EPROM EEROM
HALFGELEIDER-GEHEUGENS HALFGELEIDER GEHEUGENS WILLEKEURIG TOEGANKELIJK SERIEEL TOEGANKELIJK RAM ROM SRG CCD MBM STATISCH DYNAMISCH ROM PROM EPROM EEROM (ALLEEN-)LEES GEHEUGEN = ROM ROM = Read Only Memory:
TECHNISCHE UNIVERSITEIT EINDHOVEN FACULTEIT DER TECHNISCHE NATUURKUNDE
TECHNISCHE UNIVERSITEIT EINDHOVEN FACULTEIT DER TECHNISCHE NATUURKUNDE Tentamen Computers bij fysische experimenten (3BB20) op dinsdag 25 oktober 2005 Het tentamen duurt 90 minuten en wordt gemaakt zonder
Hoofdstuk 2. De Von Neumann-architectuur
Input Interface Output Interface Informatica Deel III Hoofdstuk 2 De Von Neumann-architectuur 2.1. Organisatie. De overgrote meerderheid der digitale computers zijn georganiseerd zoals weergegeven in fig.
Hoe werkt een rekenmachine?
Hoe werkt een rekenmachine? Uit welke hardware-componenten bestaat een rekenmachine? Welke instructies kan de machine uitvoeren? Practicum met de rekenmachine I Constante getallen Instructies van het type
Oefeningen Interpretatie I Reeks 6 : Registermachines
Oefeningen Interpretatie I Reeks 6 : Registermachines Deze oefeningenreeks behandelt het beschrijven van computationele processen aan de hand van registermachineprogrammaʼs. Registermachines manipuleren
Flex_Rooster WERKBOEK. INTRODUCTIE iseries. Dit werkboek is eigendom van ICS opleidingen en mag niet worden meegenomen.
Flex_Rooster WERKBOEK INTRODUCTIE iseries Dit werkboek is eigendom van ICS opleidingen en mag niet worden meegenomen. ICS Opleidingen Niets uit deze uitgave mag worden verveelvoudigd en/of openbaar gemaakt
Een intelligent DMX netwerk
WORKSHOP STEPP Een intelligent DMX netwerk WORKSHOP STEPP Wat is DMX? Een intelligent DMX netwerk Demo opstelling Probleem oplossing Wat is DMX? Hoe is het DMX signaal ontstaan DMX in de praktijk Hoe
-Een stukje geschiedenis van de PC (personal computer)
-Een stukje geschiedenis van de PC (personal computer) De pc is bedacht in 1833 Door gebrek aan onderdelen kwam de eerst werkende PC 100 jaar later Gewicht: 35 ton (35.000 kilo!) en kamervullend. Zie de
Microcontrollers. 8051 based microcontroller ADuC832 from Analog Devices. 12/2011 Roggemans M. (MGM)
Microcontrollers 8051 based microcontroller ADuC832 from Analog Devices 12/2011 Roggemans M. (MGM) LES 1 Doelstellingen: situering vak, afspraken labo en evaluatie toelichten concept embedded oplossing
Hoofdstuk 3: Processen: Beschrijving en Besturing. Wat is een proces? Waarom processen? Wat moet het OS ervoor doen? Is het OS zelf een proces?
Hoofdstuk 3: Processen: Beschrijving en Besturing Wat is een proces? Waarom processen? Wat moet het OS ervoor doen? Is het OS zelf een proces? 1 Wat is een proces? Een proces is een programma in uitvoering
Computertechniek vorige examens
Computertechniek vorige examens Examen 2009 Groep 1 1. Geef de 2 manieren waarop de adressen van de I/O-module in de adresruimte geïntegreerd kunnen zijn. (memory-mapped en isolated dus) 2. Wat is post-indexering?
Arduino CURSUS. door Willy - 09-juni-2017
Arduino CURSUS door Willy - [email protected], 09-juni-2017 OVERZICHT (1) OVERZICHT (2) Historiek Microcontroller (1) Microcontroller (2) Specificaties - Arduino UNO bord Specificaties - ATmega328P chip LET
In- en uitgangssignalen van microprocessoren
In- en uitgangssignalen van microprocessoren E. Gernaat 1 Overzicht signalen Informatie van en naar een microprocessor kan parallel of seriëel gebeuren. Bij parallel-overdracht zal elke lijn (draad) een
KEYSTONE. OM8 - EPI 2 AS-Interface module Handleiding voor installatie en onderhoud. www.pentair.com/valves
KEYSTONE Inhoud 1 Optionele module 8: AS-Interface module 1 2 Installatie 1 3 Communicatiekenmerken 1 4 Beschrijving van de OM8 AS-Interface module 2 5 AS-Interface protocol 3 6 Communicatie-interface
Sensor Test Unit TSK40A
Product Info Sensor Test Unit TSK40A Eenvoudig testen van diverse typen sensoren Instellingen manueel of snel via de PC te wijzigen Standaard kabels voor het snel aansluiten van sensoren Algemeen De sensor
Getalformaten, timers en tellers
Getalformaten, timers en tellers S_CU CU S PV R CV DEZ CV_BCD S_ODT S TV BI R BCD 1 pagina 1 Getalformaten (16 bits) PG CPU BCD W#16#296 Voorteken (+) 2 9 6 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 Positieve getallen
AP40 Display Controller
Datasheet AP40 Versie 03-2010 / NL AP40 Display Controller Toepasbaar als: Display voor positie en snelheid Nokkencontroller Signaalomvormer Toerentalbewaking Procestijdmeting (1/f) 48 mm ca. 150 mm 96
Programmering Tiny45 voor de DCC locdecoder
Programmering Tiny45 voor de DCC locdecoder Dit is een beschrijving voor het programmeren van de Tiny45 van de locdecoder. Voor de eerste programmering is een programmer voor Atmel AVR mikrocontrollers
FORTH op de 80C535 processor met het ATS535 board.
FORTH op de 80C535 processor met het ATS535 board. ATS535 Het ATS535 board met 8052- ANS-Forth, is een product van de HCC Forth GG en Atelec Hoorn. Het board met de ingebouwde software is een uitstekend
Microcontrollers Week 2 Opbouw ATmega32 controller, instructies Jesse op den Brouw INLMIC/2014-2015
Microcontrollers Week 2 Opbouw ATmega32 controller, instructies Jesse op den Brouw INLMIC/2014-2015 Blokdiagram ATmega32 2 ATmega32 Features 131 instructies 32 KB Flash ROM programmageheugen 2 KB Intern
Accelerometer project 2010 Microcontroller printje op basis van de NXP-LPC2368
Accelerometer project 2010 Microcontroller printje op basis van de NXP-LPC2368 Handleiding bij het gebruik van een microcontroller in het Accelerometerproject (Project II) Er zijn speciaal voor het Accelerometerproject
Locobuffer Handleiding
Locobuffer Handleiding HDM09 Disclaimer van Aansprakelijkheid: Het gebruik van alle items die kunnen worden gekocht en alle installatie-instructies die kunnen worden gevonden op deze site is op eigen risico.
Verslag: Computer. Naam: Tyrone Ste Luce. Klas: M4B
Verslag: Computer Naam: Tyrone Ste Luce Klas: M4B Inhoud 1. Inleiding 2. Binaire taal 3. Besturingssysteem 4. Hardware 5. Cmos en Bios 6. De processor 7. Internet 1. Inleiding Wanneer is de computer uitgevonden?
De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (3)
De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (3) Timloto o.s. / E. Gernaat / ISBN 978-90-79302-06-2 Op dit werk is de Creative Commens Licentie van toepassing. Uitgave: september 2012
Technisch ontwerp positiebepaling Smart Blocks
Technisch ontwerp positiebepaling Smart Blocks Inhoudsopgave 1 Inleiding......3 2 Hardware......4 2.1 Blok....4 Contactpunten......4 Voeding......4 Datapinnen......5 2.2 Basisplaat......5 3 Positiebepaling......6
Combinatorische schakelingen
Practicum 1: Combinatorische schakelingen Groep A.6: Lennert Acke Pieter Schuddinck Kristof Vandoorne Steven Werbrouck Inhoudstabel 1. Doelstellingen... 2 2. Voorbereiding... 3 3. Hardware-practicum...
scc = b) CD AB
Computerarchitectuur en -organisatie (213030) Dinsdag 21 januari 2040, 13.30 17.00 uur 7 bladzijden met 8 opgaven 4 bladzijden met documentatie Let op: Vul het tentamenbriefje volledig in (d.w.z. naam,
7,3. Samenvatting door een scholier 1961 woorden 16 januari keer beoordeeld. Informatica Informatica actief
Samenvatting door een scholier 1961 woorden 16 januari 2009 7,3 126 keer beoordeeld Vak Methode Informatica Informatica actief Hoofdstuk 3 Gespecialiseerde computers: kun je alleen voor een bepaalde functie
De Arduino-microcontroller in de motorvoertuigentechniek (3)
De Arduino-microcontroller in de motorvoertuigentechniek (3) E. Gernaat (ISBN 978-90-79302-11-6) 1 In- en uitgangssignalen van microprocessoren 1.1 Overzicht signalen Informatie van en naar een microprocessor
Het koppelen van een FC51, via Modbus RTU, aan een AC500-eco.
Het koppelen van een FC51, via Modbus RTU, aan een AC500-eco. Snelle start handleiding. Solar Technical Support Inhoudsopgave: Benodigdheden.... 2 De Modbus RTU kabel.... 3 De gewijzigde parameters in
De Arduino-microcontroller in de motorvoertuigentechniek (6)
De Arduino-microcontroller in de motorvoertuigentechniek (6) E. Gernaat (ISBN 978-90-79302-11-6) 1 De Arduino Programmeeromgeving (IDE) 1.1 Inleiding Als we naar de Arduino site gaan kunnen we daar de
Handleiding Teknatool houtdraaibank Nova DVRxp Nederlands bij gebruik van de originele Engelse handleiding
Teknatool houtdraaibank Nova DVRxp Artikelnummer: 24207 Besturingssysteem software versie: 4.54x Interface software versie: s03 Teknatool International, 13 juli 2006 1.0 Introductie 1.1 Algemeen Deze handleiding
ES1 Project 1: Microcontrollers
ES1 Project 1: Microcontrollers Les 2: Architectuur ATmega32 en STK500 Door Hugo Arends, september 2012 Architectuur ATmega32 Een uitgebreide en gedetailleerde beschrijving van de ATmega32 microcontroller
KIT OVO. De automatisering moet worden onderworpen aan onderhoud op een regelmatige basis om een goede werking te garanderen.
Onderhoud De automatisering moet worden onderworpen aan onderhoud op een regelmatige basis om een goede werking te garanderen. 01. OVO vergt gepland onderhoud om de 6 maanden of 3000 manoeuvres na eerdere
ICT Infrastructuren: Processen en Threads. 18 november 2013 David N. Jansen
ICT Infrastructuren: Processen en Threads 18 november 2013 David N. Jansen Datum en Ajd van werkcollege na overleg met de aanwezigen: donderdag 8:45 10:30 Leerdoel voor vandaag. Stallings hoofdst 2 4 Hoofddoelen
Harmonischen: een virus op het net? FOCUS
Amplitude Harmonischen: een virus op het net? FOCUS In het kader van rationale energieverbruik (REG) wordt steeds gezocht om verbruikers energie efficiënter te maken. Hierdoor gaan verbruikers steeds meer
DDS chips. DDS = Direct Digital (frequency) Synthesis. Output = sinusvormig signaal. Maximum frequentie = ½ klokfrequentie
www.arduino.cc Arduino en DDS DDS chips DDS = Direct Digital (frequency) Synthesis Output = sinusvormig signaal Maximum frequentie = ½ klokfrequentie Frequentie bepaald door tuning word Grootste fabrikant:
AP21 SSI Display. Display voor positie en snelheid Nokkencontroller Signaalomvormer Display voor niet lineaire bewegingen. 96 mm
Datasheet AP21 AP21 SSI Display Toepasbaar als: Display voor positie en snelheid Nokkencontroller Signaalomvormer Display voor niet lineaire bewegingen 48 mm ca. 90 mm 96 mm Voor sensoren met Synchroon
CIM. Les 6. Het FFS controlesysteem
CIM Les 6 Het FFS controlesysteem Ontwerpfasen (gewoon weten dat er goed over nagedacht is) Referentiemodel algemene structuur taken relaties tussen taken bvb: ISO OSI / NBS (Amerikaans, slechts 6 lagen
Desktop, Laptop, Netbook, Ultrabook or Tablet? Which is best for what? Keuzes maken
Desktop, Laptop, Netbook, Ultrabook or Tablet? Which is best for what?. Keuzes maken Wanneer je een computer wilt aanschaffen denk je tegenwoordig niet meteen meer aan de desktop. De desktop is een "grote"
IO-Link: de industriële communicatiestandaard. De basis van IO-Link
IO-Link: de industriële communicatiestandaard De basis van IO-Link IO-Link IO-Link = eenvoudig en geldbesparend IO-Link = bekabelings- en communicatieconcept IO-Link IO-Link: enkele technische
