Bestnr. 19 11 11
Handboek C-Control II Unit
Alle rechten, ook vertalingen, voorbehouden. Niets uit deze uitgave mag worden verveelvoudigd, opgeslagen in een automatische gegevensbestand, of openbaar gemaakt, in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door fotokopieën, of op enige andere manier, zonder voorafgaande schriftelijke toestemming van CONRAD ELECTRONIC BENELUX B.V. Nadruk, ook als uittreksel is niet toegestaan. Druk- en vertaalfouten voorbehouden. Deze gebruiksaanwijzing voldoet aan de technische eisen bij het in druk gaan. Wijzigingen in de techniek en uitvoering voorbehouden. © Copyright 2005 by CONRAD ELECTRONIC BENELUX B.V. Windmolenweg 42, 7548 BM Boekelo Internet: www.conrad.nl of www.conrad.be
Geachte klant, Hartelijk dank voor uw interesse en uw vertrouwen in onze C-Control II Unit. Voor talloze gebruikers is C-Control al jaren een begrip voor compacte, betrouwbare en niet dure besturingsoplossingen. Naast klassieke toepassingen, zoals verwarmingsbesturingen en dataregistratie – systemen, zijn ons ook succesvolle toepassingen in de industriële automatisering, laboratoriumonderzoek of de midi-techniek in geluidsstudio’s bekend. Misschien heeft u al met één van onze beproefde systemen C-Control/BASIC, C-Control/PLUS of met het C-Control-station gewerkt. Eventueel bent u na een tijdje gestoten op de grenzen ervan met betrekking tot prestatievermogen en geheugencapaciteit. Of u heeft de genoemde systemen tot nu toe niet gebruikt, omdat ze niet voor uw doel geschikt leken. C-Control II kan deze problemen nu zeker oplossen! Voor meer informatie kunt u kijken op www.conrad.nl of www.conrad.be.
Inhoudsopgave
Pagina
1. 2.
Inleiding Belangrijke aanwijzingen
6 7
3.
Hardware
9
2.1 2.2 2.3 2.4 2.5 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.3 3.2.2 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.3.10 3.3.11 3.3.12
Lezen van deze handleiding Gebruik Gebruik waarvoor het apparaat bedoeld is Garantie en aansprakelijkheid Service (vervalt) Schakeltechniek – intern Microcontroller Geheugen Genereren van referentiespanning Genereren van puls (vervalt) Schakeltechniek - extern Aansluitbezetting – overzicht Spanningsvoorziening (vervalt) Reset (RSTN, RSTOUT) Non Maskable Interrupt (NMI) Seriële interface Digitale ports (PlL.0 …PlL.7), PlH.0 … PlH.7) Speciale functies van de digitale ports A/D-ports DCF/FRQ-ports PLM-ports CAN-interface
4. Hoofdbesturingssysteem 4.1 4.2 4.3 4.3.1 4.3.2 4.4
Overzicht Bootstrap – Installeren van het hoofdbesturingssysteem Host mode Systeem – initialisering en automatisch starten van toepassingsprogramma’s Downloaden van toepassingsprogramma’s en andere host - commando’s Virtuele machine
7 7 7 8 8
9 9 9 9 10 10 10
11 11 12 12 13 13 13 15 15 17 17 17 18
19 19 19 20 20 20 20
2
4.4.1 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7
Basisprincipes Binaire code - vertaler Multithreading Geheugen voor programma’s en constanten Datageheugen Stapelprocessor Systeeminterface
5. De programmeertaal C2 5.1 5.2 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.4 5.4.1 5.4.2 5.4.3 5.5 5.5.1 5.5.2 5.5.3 5.5.4 5.5.5 5.6 5.6.1 5.6.2 5.6.3 5.6.4 5.6.5 5.6.6 5.7 5.7.1 5.7.2 5.7.3 5.7.4 5.7.5 5.7.6 5.8 5.8.1 5.8.2 5.8.3 5.8.4 5.8.5 5.8.6 5.8.7 5.9 5.9.1 5.9.2 5.9.3 5.9.4 5.9.5
Introductie Projecten en modules Syntax – basiselementen Commentaren Spaties (blanks) Kenmerken Opdrachten en opdrachtblokken Termen Codewoorden Datatypes Numerieke datatypes Tekenketens ( strings) Samengestelde datatypes Variabelen Definitie van variabelen Definitie en toepassing van variabelen van samengestelde datatypes Definitie en indicering van variabele arrays Initialisering Globale en locale variabelen Constanten Benoemde en onbenoemde constanten Onbenoemde cijferconstanten Onbenoemde tekenconstanten Onbenoemde stringconstanten Definitie van bekende constanten Benoemde constante arrays Operators Volgorde Rekenkundige operators Bitschuifoperators Vergelijkingsoperators Logische operators en bitmanipulaties Stringkoppeling met de operator + Functies Functiekop Parameters en locale variabelen Einde van een functie en Antwoord van resultaat Oproepen Typetest Recursie Inline – functies en –opdrachten Threads Definitie Main-threads Prioriteitssturing Wachten op gebeurtenissen Pauzes
20 21 21 22 22 22 23
23 23 23 24 24 24 24 25 25 26 26 26 26 26 27 27 27 28 28 29 30 30 30 31 31 31 32 33 33 34 34 34 34 35 36 36 37 37 38 39 39 39 39 39 40 40 41 42
3
5.9.6 5.10 5.10.1 5.10.2 5.10.3 5.10.4 5.10.5 5.10.6 5.10.7 5.10.8
Synchronisatie Opdrachten voor besturingsverloop If …els e … Beperkte uitvoering Loop – Eindeloze lus While – lus Do – lus For – lus Voortijdig afbreken Voortijdige voortzetting Einde programma
42 45 45 45 45 46 46 46 47 47
6.
Software ontwikkeling
47
7.
Standaardmodule
6.1 6.2 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.3.8 6.4 6.5 6.5.1 6.5.2 6.5.3 6.6 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.1.6 7.1.7 7.1.8 7.1.9 7.1.10 7.2 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 7.2.6 7.2.7 7.2.8 7.2.9 7.2.10 7.3 7.3.1 7.3.2
Installatie en start van de geïntegreerde ontwikkelingsomgeving Brontekst bewerken Richtlijnen voor het formatteren va de brontekst Voordelen van uniforme formattering Commentaren Kenmerken Termen Functiedefinities Threads Opdrachtblokken Combinaties met sleutelwoorden voor de besturingsverloop Automatische compiler Simulatie en debugging Test en zoeken van fouten Simulatie – omvang Bediening Programma – overdracht naar de unit
can.c2 Initialisering Opvragen status voor een CAN- kanaal Test op overdrachtsfouten Bericht verzenden Bericht openbaren Tellen van de “Remote - Request” – aanvragen Instellen van de ontvangst – ID Versturen van een “Remote – Request” – verzoek Test op ontvangst Ontvangen data lezen hwcom.c2 en swcom.c2 Initialisering Instellen van de overdrachtsnelheid Instellen van de uitgebreide ontvangstbuffer Verwerpen van data Test op ontvangst lezen van een ontvangen byte Ontvangst van dataframes Test op zendparaatheid Verzenden van een byte Verzenden van dataframes i2c.c2 Initialisering Start van de overdracht
47 48 48 48 48 48 49 49 49 49 49 50 50 50 51 51 51
52 52 52 53 53 53 53 54 54 54 54 54 55 55 55 55 55 56 56 56 56 56 56 56 57 57
4
7.3.3 7.3.4 7.3.5 7.3.6 7.3.7 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.4.9 7.4.10 7.5 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.8.5 7.9 7.9.1 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.10 7.10.1 7.10.2 7.10.3 7.10.4 7.10.5 7.10.6 7.11 7.11.1 7.11.2
Zenden van de stop –voorwaarde Schrijven van een byte lezen van een byte met Acknowledge (bevestiging) Lezen van een byte zonder Acknowledge Test op zendparaatheid (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) (Vervalt) Ipt.c2 Initialisering Uitvoerbuffer leegmaken Test op uitvoerparaatheid Een teken printen Tekst printen math.c2 Wiskundige standaardfuncties Macht verheffen Absolute waarde – functies Minimum – en maximum – functies mem.c2 Vullen met een waarde Kopiëren Opslaan van numerieke waarden in een bytebuffer Lezen van numerieke waarden uit een bytebuffer plm.c2 Instellen van de tijdbasis Instellen van de portmode Instellen van de periodelengte PLM –uitvoer Uitvoer van audio -frequenties ports.c2 Opvragen van digitale ports Instellen van digitale ports Omschakelen en impulsen Deactiveren van ports Impulstelling Frequentiemeting Analoog – digitaal – omvorming str.c2 String leegmaken Stringlengte bepalen String vullen met cijfers Uitvoer in een string Geformatteerde uitvoer in een string Uitvoer van een bitmasker system.c2 Systeemtimer Tijd
57 57 57 57 57 57 57 57 57 58 58 58 58 58 58 58 58 58 58 58 58 58 59 59 59 59 59 59 60 60 60 60 61 61 61 61 61 61 62 62 63 63 63 64 64 64 64 64 64 64 64 64 65 65 65 66
5
7.11.3 7.11.4 7.11.5 7.11.6 7.11.7 7.12 7.12.1 7.12.2 7.12.3 7.13
Status van de DCF77 – synchronisatie Datum Zomertijdflag Oproepen van systeemfuncties Gebruiker – gedefinieerde interrupt- routines twb.c2 Initialisering Opvragen bij ontvangst van het antwoordframe Data – overdracht constant.c2 en vmcodes.c2
8.
Systeemprogrammering
8.1.1 TASKING C/C++ tools 8.1.2 Uitbreidingen van de virtuele machine en veranderingen aan het besturingssysteem 8.1.3 Implementering van een eigen besturingssysteem
9.
9.1 9.1.1 9.1.2 9.1.3 9.2
Aanhangsel
Technische specificaties Mechaniek Omgevingsvoorwaardes Voedingsspanning Literatuurregister
66 66 67 67 67 68 68 68 68 68
69 69 69 69
70 70 70 70 70 70
1. Introductie C-Control II is een compacte besturingscomputer.
Het systeem is gebaseerd op een microcontroller van de Duitse firma HiTech Infineon Technologies. Deze microcontroller wordt b.v. in grote aantallen toegepast in een aantal actuele autotypes van de Duitse auto-industrie. Daar neemt de controller belangrijke besturingsopgaven van de boordelektronica over. C-Control II biedt u deze ultramoderne technologie om uw besturingsproblemen op te lossen. U kunt analoge meetwaarden en schakelaarposities registreren en afhankelijk van de ingangsvoorwaardes daarvan dienovereenkomstige schakelsignalen afgeven, b.v. voor relais of servomotoren. In combinatie met een DCF77- zendergestuurde antenne weet C-Control, hoe laat het is en kan precieze schakelklokfuncties overnemen. Verschillende hardware – interfaces en bussystemen maken een koppeling mogelijk tussen C-Control II en sensoren, actoren en andere besturingssystemen. Wij willen onze technologie ter beschikking stellen aan een breed scala van gebruikers. Door ons werk tot nu toe bij de C-Control service –afdeling weten wij, dat ook klanten die graag iets willen leren maar geen enkele ervaring hebben met elektronica en programmeren, in C-Control geïnteresseerd zijn. Als u tot deze gebruikersgroep hoort, sta ons dan toe op deze plek een aanwijzing te geven:
C-Control II is slechts in beperkte mate geschikt om te beginnen met de programmering van microcomputers en van de elektronische schakeltechniek.
Wij stellen als voorwaarde, dat u op zijn minst beschikt over basiskennis van een hogere programmeertaal, zoals b.v. BASIC, PASCAL, C,C++ of Java. Bovendien nemen wij aan, dat u vertrouwd bent met de bediening van een PC onder één van de Windows besturingssystemen (95/98/NT/2000). U dient ook enige ervaring te hebben in de omgang met de soldeerbout, multimeters en elektronische componenten. We hebben ons best gedaan om alle beschrijvingen zo eenvoudig mogelijk te formuleren. Helaas kunnen we in een gebruiksaanwijzing bij het hier aanwezige thema niet altijd afzien van
6
het gebruik van vaktermen en anglicismen. Sla er indien nodig de desbetreffende vakboeken op na. Delen van deze gebruiksaanwijzing kunnen zonder aankondiging vooraf ongeldig worden. Dat wordt bepaald door eventueel noodzakelijke technische veranderingen ter verbetering van het product of voor de aanpassing aan de actuele beschikbaarheid van componenten. Wij zullen de dan noodzakelijke informatie ter beschikking stellen via Internet onder www.c-control.de. In deze nieuwe versie van de gebruiksaanwijzing van de C-Control II zijn enkele alinea’s ingekort, omdat de constructie en de omvang van de levering van de C-Control veranderd is. Deze zijn in de gebruiksaanwijzing aangegeven met * (vervalt) *. Wij wensen u veel plezier met de C-Control II. Uw Conrad Technologiecentrum Conrad Electronic GmbH Klaus-Conrad-Strasse 1 92240 Hirschau Bundesrepublik Deutschland
2.
Belangrijke aanwijzingen
2.1 Lezen van deze gebruiksaanwijzing Lees deze gebruiksaanwijzing svp helemaal door voor u de C-Control II unit in gebruik neemt. Terwijl sommige hoofdstukken alleen van belang zijn om diepere samenhangen te begrijpen, bevatten andere hoofdstukken belangrijke informatie, die, als u zich daar niet aan houdt, kan leiden tot het niet functioneren of tot beschadigingen. Hoofdstukken en alinea’s, die thema’s met een hogere moeilijkheidsgraad bevatten, zijn gekenmerkt door het symbool . U kunt deze thema’s op een later tijdstip oppakken, nadat u uw eerste ervaringen met de toepassing van de C-Control II unit en van de programmeertaal C2 opgedaan heeft.
2.2
Voor schades, die het gevolg zijn van het zich niet houden aan de aanwijzingen in deze gebruiksaanwijzing, bestaat geen enkel recht op garantie en wij zijn daarvoor evenmin aansprakelijk. Gebruik De C-Control II unit bevat gevoelige componenten. Deze kunnen door elektrostatische ontladingen vernield worden!
Houd u aan de algemene regels voor het gebruik van elektronische componenten. Richt uw werkplek vakkundig in. Aard uw lichaam voor het werk, b.v. door het aanraken van een geaard, geleidend voorwerp. Vermijd het aanraken van de aansluitpins van de C-Control II unit. Verwijder, voor u de C-Control II unit in gebruik neemt, eerst de eventueel achtergebleven delen van de antistatische schuimstof van de pins. 2.3 Gebruik waarvoor het apparaat bedoeld is De C-Control II unit is een elektronische component in de zin van een geïntegreerd schakelcircuit. De C-Control II unit is bedoeld voor de programmeerbare aansturing van elektrische en elektronische apparaten. De opbouw en de werking van deze apparaten moet conform de geldende Europese toelatingsrichtlijnen (C• ) plaatsvinden.
7
De C-Control II unit mag niet in galvanische verbinding staan met spanningen groter dan geaarde lage spanning. De aansluiting op systemen met hogere spanning mag uitsluitend gebeuren via componenten met VDE – toelating. Daarbij moeten de voorgeschreven lucht- en kruipwegen aangehouden worden, en moeten er tevens voldoende maatregelen ter bescherming tegen het aanraken van gevaarlijke spanningen genomen worden. Op de printplaat van de C-Control II unit werken elektronische onderdelen met hoogfrequente impulssignalen en steile impulsflanken. Bij onvakkundig gebruik van de unit kan dat leiden tot het uitzenden van elektromagnetische stoorsignalen. Het nemen van passende maatregelen (b.v. gebruik van smoorspoelen, begrenzingsweerstanden, blokcondensatoren en afschermingen) om de wettelijk voorgeschreven maximumwaarden aan te houden, valt onder de verantwoordelijkheid van de gebruiker. De maximaal toelaatbare lengte van aangesloten kabels zonder extra maatregelen bedraagt 0,25 meter (uitzondering zie CAN- interface en seriële interface). Onder invloed van sterke elektromagnetische wisselvelden of stoorimimpulsen kan de functie van de C-Control II unit beïnvloed worden. Eventueel zijn dan een reset en het opnieuw starten van het systeem noodzakelijk. Let bij het aansluiten van externe modules op de toegelaten maximale stroom- en spanningswaarden van de aparte pins. Het aanleggen van een verkeerd gepoolde of een te hoge spanning of de belasting met een te hoge stroom kan tot een onmiddellijke vernieling van de unit leiden. 2.4 Garantie en aansprakelijkheid Conrad Electronic biedt voor de C-Control II unit een garantietermijn van 24 maanden vanaf de factuurdatum. Binnen deze periode worden defecte units gratis omgewisseld, als het defect aantoonbaar terug te voeren is op een productiefout of transportschade. De software in het besturingssysteem van de microcontroller alsmede de PC- software op CDROM worden in de huidige vorm aangeleverd. Conrad Electronic garandeert niet dat de kenmerken van deze software voldoen aan alle individuele eisen en dat de software in elk geval zonder onderbrekingen en foutloos werkt. Conrad Electronic is niet aansprakelijk voor schades, die onmiddellijk door of als gevolg van het gebruik van de C-Control II Unit ontstaan. Het gebruik van de C-Control II unit in systemen, die direct of indirect dienen voor medische, gezondheids- of levensbeschermende doelen, is niet toegestaan. Als de C-Control II unit inclusief software niet aan uw eisen voldoet of als u het niet eens bent met de garantie- of aansprakelijkheidsvoorwaardes, maak dan gebruik van onze 14-daagse geld-terug-garantie. Stuur ons dan svp de unit binnen deze termijn zonder sporen van gebruik, in de onbeschadigde originele verpakking en met alle accessoires terug voor terugbetaling of verrekening van de waarde van de goederen! 2.5 Service Conrad Electronic stelt u een team van ervaren servicemedewerkers ter beschikking. Als u vragen heeft over de C-Control II unit, kunt u onze Technische Helpdesk bereiken per telefoon, per brief, fax of e-mail. Als de problemen hier niet opgelost kunnen worden, kunt u contact opnemen met het team in Duitsland: Telefoon: (++49) (0) 180 / 53 12 116 Fax: (++49) (0) 180 / 53 12 119
8
Adres:
E-mail:
Conrad Electronic GmbH TKB Computer - und Messtechnik Klaus-Conrad-Strasse 1 92240 Hirschau Bundesrepublik Deutschland
[email protected]
Onze voorkeur gaar uit naar communicatie per e-mail. Als u een probleem heeft, geef ons dan indien mogelijk een schets van uw aansluitschakeling als beeldbestand -bijlage (in JPG-format) alsmede het tot het probleem gereduceerde gedeelte van de programma –brontekst (max. ca. 20 regels). Wij vragen om uw begrip dat wij geen bronteksten analyseren die niet volgens de in deze gebruiksaanwijzing aanbevolen stijlregels geformatteerd zijn (zie 6.3). Als u geïnteresseerd bent in een klant -specifieke software – oplossing, dan maken wij graag een desbetreffende offerte voor u. Verdere informatie en actuele software om te downloaden vindt u op de C-Control Homepage op Internet onder www.c-control.de.
3.
Hardware
3.1
(vervalt)*
3.2
Schakeltechniek - intern
In dit hoofdstuk vindt u de belangrijkste principes voor de hardware van de C-Control II unit. Op de achterste omslagpagina’s vindt ui het complete schakelschema van de C-Control II unit. Dit documenteert de interne opbouw en de functiewijze van de unit. De schakeling werd ontwikkeld volgens applicatie –voorstellen uit de databladen van de toegepaste ICs. Bij vragen over details kunt u het beste deze databladen raadplegen. U vindt ze op Internet als PDF – bestanden, sommige daarvan staan ook op de Utility –CD.
3.2.1 Microcontroller De microcontroller C164CI stamt uit de C166 – familie van Infineon Technmologies (vroeger SIEMENS halfgeleiders) en is de “kleine broer” van de C167. In de 80-polige QFP -behuizing biedt de C164CI talrijke interessante hardware resources, zoals b.v. • acht 10bit-analoog – digitaal - omvormer ports • een CAN –bus - interface • een asynchrone seriële interface • comfortabele timer De microcontroller verwerkt data met een breedte van 16 bit. Zijn adresruimte bevat 16MB – Geheugenadressen bestaan uit een segment-byte en een offset – woord. De controle van de omvangrijke hardware resources van de controller vindt plaats via invoeren in de Special Function Registers (SFR). Deze bevinden zich in een bereik van het eerste geheugensegment in de interne RAM van de controller. Het systeem van de C-Control II unit kapselt de voor een deel zeer complexe toegangsmechanismen op de hardware resources in relatief simpele functieoproepen (zie hfst. 7). 3.2.2 Geheugen In de C-Control II unit zijn 512kB FLASH-EEEEPROM (8 segmenten) en 64kB SRAM (1 segment) aangesloten op de microcontroller. In het schakelschema herkent u de decodering van de adresbus - signalen en de verbinding van de geheugen – ICs met de controller. Intern beschikt de controller over 64kB OTP-ROM (one time programmable – eenmalig programmeerbaar) alsmede 1 kB RAM, inclusief Universal Register en Special Function Register. De interne RAM wordt door het besturingssysteem van de C-Control II unit over een deel van het eerste FLASH – segment gelegd. Het interne OTP – bereik is gedeactiveerd en kan niet gebruikt worden.
9
Het totale geheugen is door het systeem als volgt opgedeeld: Segment Adressen Fysieke geheugentype 0 0x00000…0x0FFFF Ext. FLASH-EEEEPROM Interne RAM, register 1 0x10000…0x1FFFF Ext. FLASH- EEPROM 2 0x20000…0x2FFFF Ext. FLASH- EEPROM 3 0x30000…0x3FFFF Ext. FLASH- EEPROM 4 0x40000…0x4FFFF Ext. FLASH- EEPROM 5 0x50000…0x5FFFF Ext. FLASH- EEPROM 6 0x60000…0x6FFFF Ext. FLASH- EEPROM 7 0x70000…0x7FFFF Ext. FLASH- EEPROM 8 0x80000…0x8FFFF Ext. RAM
Toepassing Besturingssysteem Hardware toegang Besturingssysteem reserve Besturingssysteem reserve Gebruikers - systeemroutines C2-programma VM-codes C2-programma VM-codes C2-programma constanten C2-programma constanten C2-programma data
3.2.3 Genereren van referentiespanning De microprocessor beschikt over een analoog – digitaal – omvormer met een resolutie van 10 bit. Dat betekent, dat gemeten spanningen als hele getallen van 0 tot 1023 weergegeven kunnen worden. De referentiespanning voor de ondergrens is het GND- level, dus 0V. De referentiespanning voor de bovengrens bedraagt 4,096V en wordt door een preciezereferentiespanning –IC gegenereerd. De tolerantie van de referentiespanning ligt onder één procent. De maximale temperatuurdrift boven het totale toelaatbare werktemperatuurbereik bedraagt 50ppm (parts per million, 1 ppm = 0,0001 procent). Een verschil van één bit van de gedigitaliseerde meetwaarde komt overeen met een spanningsverschil van 4 mV. Als x een digitale meetwaarde is, dan kan de desbetreffende spanningswaarde u als volgt berekend worden: u = x * 4,096V / 1024 Of simpelweg: u = x * 0,004V
3.2.4 Pulsgeneratie De generatie van een puls vindt plaats door een 5MHz – kwartsoscillator. In de controller produceert een PLL – schakeling daaruit de 20MHz – systeempuls. 3.2.5
*(vervalt) *
10
3.3
Schakelingtechniek – extern
3.3.1
Aansluitbelegging – overzicht
Onderkant Algemeen: X1:
X2:
GND … ground (massa, referentiepotentiaal) n.c. … not connected (niet bezet, vrij)
TxD RxD RTS CTS 5 Volt LCD ADJ P1L.0…7 NMI RSTOUT RSTIN BOOT HOST
… seriële interface (hwcom) – zendleiding, NRZ-signaal … seriële interface (hwcom) – ontvangstleiding, NRZ-signaal … seriële interface (hwcom) – Request To Send, NRZ- signaal … seriële interface (hwcom) – Clear To Send, NRZ-signaal … gestabiliseerde uitgangsspanning van de schakelregelaar … ingang voor LCD –contrastinstelling … 8 digitale ports … non-maskable interrupt … RESET out … RESET in … activeren va n de bootstrap – mode na een reset … activeren van de HOST – mode na een reset
11
X3: X4:
POWER … Ingang voedingsspanning 8…24V P1L.0…7 … 8 digitale ports BEEP … audiofrequentie – uitvoer (of PLM 2) PLM 0/1 … uitgangen voor impulslengte – modulatie DCF /FRQ 0 … ontvangst zendergestuurde tijd of frequentiemeting FRQ 1 … frequentiemeting ADC 0…7 … 8 ingangen voor analoog – digitaal – omvormers 2 I C SCL … I 2C – bus impulsleiding I2C SDA … I 2C – bus dataleiding CAN_Tx … CAN – bus, digitale niveau van de zender CAN_Rx … CAN – bus, digitale niveau ontvanger, alleen voor diagnosedoeleinden! CANL/H … CAN – bus digital TxD … hwcom – digitale zendleiding digital RxD … hwcom – digitale ontvangstleiding, alleen voor diagnose – doeleinden! digital RTS … hwcom – digitale RTS - leiding digital CTS … hwcom – digitale CTS – leiding µC RTS … hwcom - RTS – port op microcontroller µC CTS … hwcom - CTS – port op microcontroller Opmerking bij “CAN…Rx” en “digital RxD”: op deze pins mag geen signaal gevoed worden! Ze dienen alleen voor de signaalanalyse, b.v. met behulp van een geheugenoscilloscoop. 3.3.2 Spanningsvoorziening (POWER, 5Volt, GND) In de unit bevindt zich een compacte IC- schakelvoedingseenheid, die uit de op de pin POWER ingevoerde voedingsspanning de gestabiliseerde 5V – werkspanning voor de microcontroller en alle andere schakelcircuits genereert. Door de capaciteitsreserves van de voedingseenheid staan deze 5V ook ter beschikking van de spanningsvoorziening van externe ICs en kunnen op de unit afgetakt worden. Let hierbij op de maximaal afneembare stroom (zie hoofdstuk 9.1 Technische Specificaties). Een overschrijding kan tot vernieling van de C-Control II unit leiden! De gelijkspanning voor de voorziening van de unit moet binnen het bereik van 8V tot 24V liggen. Deze spanning kan ongestabiliseerd zijn, maar mag echter slechts een geringe restrimpel hebben. Indien nodig dient de voedingsspanning met extra condensatoren (Elko 470µF) ondersteund te worden. In de toevoerleiding van de spanning dient in serieschakeling, vlak bij de unit, een smoorspoel ingevoegd te worden, om de capaciteitsgebonden stoorstraling te onderdrukken. Vanwege het relatief hoge stroomverbruik van de C-Control II unit in het bereik van 50…100mA is deze niet aan te bevelen voor gebruik in permanent op batterijen werkende apparaten. Let op de aanwijzing betreffende kortdurende uitval van de voedingsspanning in hoofdstuk 3.3.4. 3.3.3 LCD – contrast (LCD ADJ) De beste zichtbaarheid van de LCD – tekens krijgt u als u het scherm frontaal bekijkt. Eventueel moet het contrast een beetje bijgeregeld worden. Dat kan gedaan worden via een weerstandsschakeling op de pin LCD ADJ.
12
3.3.4 Reset (RSTIN, RSTOUT) Een reset heeft als effect dat het microcontroller – systeem terugkeert naar een gedefinieerde begintoestand. De C-Control II unit kent in principe 3 reset – bronnen: • •
•
Power-On-Reset: wordt uitgevoerd na het inschakelen van de werkspanning. Hardware – Reset: wordt uitgevoerd als de RSTIN-pin van de unit op “low” getrokken en weer losgelaten wordt, b.v. door kort op een aangesloten reset – toets te drukken. Als op de RSTIN – pin de uitgangen van externe ICs of schakelingen aangesloten worden, dan moeten deze een Open - Collector resp. Open - Drain karakter hebben! Software – Reset: via een Assembler – commando (“SRST”) kan er softwarematig een reset in werking gesteld worden.
Let op: kortdurende uitval van de voedingsspanning leidt tot het volgende effect: de 5V – werkspanning van de controller valt, gesteund door elektrolytcondensatoren, langzaam af. De spanning stijgt echter weer naar 5V, voor de condensatoren helemaal ontladen zijn (“Brown Out” effect). Daardoor onderbreekt de controller zijn werk en krijgt geen correcte Power-OnReset voor een nieuwe start. Als er in een applicatie het gevaar bestaat dat de voedingsspanning korte tijd kan uitvallen, dan moet er een spanningsbewaking – schakeling aangesloten worden op de C-Control II unit, b.v. met behulp van de IC TL 7757:
RSTOUT is een uitgangssignaal van de microcontroller. Deze verandert zijn niveau naar “low”, als zich een restvoorwaarde voordoet. Hij wordt pas na het afsluiten van een aantal systeem -initialiseringen weer door het besturingssysteem op “high” gezet. Daardoor kunnen ook externe schakelingen teruggezet worden, die pas mogen werken als de C-Control II unit na de reset de basisinstellingen ervan uitgevoerd heeft. De RSTOUT – pin moet zonder interne kennis van het besturingssysteem niet gebruikt worden.
3.2.6
Non maskable Interrupt (NMI)
3.2.7
Seriële interface
Deze aansluiting wordt door de actuele systeemversie niet gebruikt. Sluit zonder kennis van het besturingssysteem geen externe componenten hier op aan. De microcontroller C164CI bezit aan de hardwarekant een asynchrone seriële interface volgens de RS232 – standaard (= eerste seriële interface, = “hwcom”). Een tweede asynchrone seriële interface kan door het besturingssysteem via de software op de digitale ports P1H.1 (ontvangen) en P1H.2 (ontvangen) geëmuleerd worden (= tweede seriële interface, = “swcom”). Het besturingssysteem zet voor beide interfaces het format 8-N-1 vast, dus elke byte wordt met 8 databits, zonder pariteitsbit en met een stopbit verzonden. Andere formats worden door C-Control II niet ondersteund. Bij voldoende detailkennis van de programmering van de C164CI – microcontroller kunnen per systeemprogrammering ook andere formats gerealiseerd worden (zie hfst. 8). Op de printplaat van de C-Control II bevindt zich een hoogwaardige niveau -omvormer IC voor het omzetten van de digitale bitstromen in Non-Return-Zero- signalen volgens de RS232- standaard (positieve spanning voor lowbits, negatieve spanning voor highbits). De IC heeft steeds twee kanalen in
13
elke omvormrichting. De niveau -omvormer IC beschikt over een verhoogde bescherming tegen spanningspieken. Spanningspieken kunnen in een elektromagnetisch belaste omgeving, b.v. in industriële toepassingen, in de interfacekabels geïnduceerd worden en aangesloten schakelcircuits vernielen. Eén kanaal is vast met de digitale seriële in -/uitgang van de microcontroller verbonden. Deze digitale signalen kunnen op de pins “digital TxD” en “digital RxD” van de unit bekeken worden. De NRZ-kant van het eerste kanaal van de niveau -omvormer vindt u op de pins TxD en RxD. In rusttoestand (geen actieve overdracht) kunt u op de pin TxD een negatieve spanning van een paar Volt tegen GND meten. RxD is hoogohmig. De met de C-Control II unit meegeleverde nulmodemkabel kruist de leidingen RxD en TxD en verbindt ze met de pins 3 (PC TxD) resp. 2 (PC RxD) van de 9-polige SUB-D bus van de PC. Bovendien wordt er een massaverbinding tussen GND van de unit en pin 5 van de 9-polige SUB-D bus van de PC tot stand gebracht. Het tweede kanaal van de niveau –omvormer kan of voor RTS/CTS-Handshake signalen voor de eerste seriële interface (hwcom) of voor de dataleidingen van de tweede seriële interface (swcom) ingezet worden. De NRZ- kant van het tweede kanaal vindt u op de pins RTS en CTS. Als u de pin “digital RTS” verbindt met ”µC RTS” en pin “digital CTS” met “µC RTS”, dan werkt de eerste seriële interface (hwcom) met “Handshake”- signalen. Als alternatief kunt u de pins “digital RTS” met P1H.2 en “digital CTS” met P1H.1 verbinden. Dan is de tweede seriële interface (swcom) aangesloten op de niveau –omvormer.
Een kabelverbinding met aansluiting op de NRZ- pins TxD, RxD, RTS, CTS mag max. 10 m lang zijn. Gebruik indien mogelijk afgeschermde normkabels. Bij langere leidingen of niet afgeschermde kabels kunnen stoorinvloeden de data – overdracht beïnvloeden. Gebruik alleen verbindingskabels waarvan u de aansluitbezetting kent.
Verbind nooit de seriële zenduitgangen van twee apparaten met elkaar! U herkent de zenduitgangen in de regel aan de negatieve uitgangsspanning in rusttoestand. Als de tweede seriële interface gebruikt wordt zonder niveau – omvormer, geldt net als voor alle digitale ports een maximaal toelaatbare kabellengte van 0,25 meter. Als de tweede seriële interface gebruikt wordt met niveau – omvormer, mag de C-Control II unit niet meer direct vanaf de 10-polige stekkerstrip X1 (zie 3.3.1 aansluitbezetting), via de interface – adapter en de meegeleverde nulmodemkabel met een PC verbonden worden.
14
3.2.8
Digital ports (P1L.0 … P1L.7, P1H.0 … P1H.7)
De C-Control II unit leidt 16 digitale ports van de microcontroller naar buiten: P1L.0 … P1L.7 en ook P1H.0 …P1H.7. Op de digitale ports kunnen b.v. toetsen met pull-up weerstanden, digitale ICs, optische koppelingen of driverschakelingen voor relais aangesloten worden. De ports kunnen apart, in groepjes van vier (“Nibble”) byte –gewijs of in zijn geheel als 16-bit Word aangesproken worden (zie hfst. 7.9). Een port is of ingang of uitgang.
•
Schakel nooit twee ports direct samen, die gelijktijdig als uitgang moeten werken!
Ingangsports zijn hoogohmig en zetten een aanliggend signaal om in een logische waarde. Voorwaarde daarvoor is, dat het spanningssignaal zich binnen de voor TTL- resp. CMOS- ICs gedefinieerde bereiken voor Low- of High level bevindt. In de verdere verwerking in het programma worden de logische waarden van de aparte ports weergegeven als 0 (“low”) of –1 (“high”). Nibbleports nemen waarden aan van 0 tot 15, byteports 0 tot 255. De wordport wordt in overeenstemming met het 16-bit – integere getalsbereik gelezen als een waarde van -32768 tot 32767. Uitgangsports kunnen via een interne driverschakeling digitale spanningssignalen afgeven. Aangesloten schakelingen kunnen een geringe stroom uit de ports trekken (bij high level) resp. een geringe stroom aan de port toevoeren (bij low level). Let op de maximaal toelaatbare laststroom voor een aparte port en voor alle ports samen (zie hfst. 9.1 Technische Specificaties). Een overschrijding van de maximale waarden kan leiden tot vernieling van de C-Control II unit. Na de reset is in eerste instantie elke digitale port als ingangsport geconfigureerd. Een port wordt automatisch uitgangsport, als het gebruikerssprogramma er een uitvoerwaarde naartoe schrijft. Door het oproepen van een speciale functie van de standaardmodule kan een uitgangsport echter weer gedeactiveerd worden, d.w.z. in de hoogohmige toestand gebracht worden (7.9.4). 3.3.8 Speciale functies van de digitale ports Een paar digitale ports staan alternatief tot uw beschikking voor speciale in -/uitvoeroperaties. Daartoe moeten eerst de desbetreffende initialiseringsfuncties van de systeemmodule opgeroepen worden (zie b.v. hfst. 7.2, 7.5, 7.12). Denk er aan, dat het oproepen van een initialisering alle concurrerende ports deactiveert. Pin P1L.0…7 P1H.0 P1H.1 P1H.2 P1H.3 P1H.4 P1H.5 P1H.6 P1H.7
Standaardfunctie Digital -byteport Digital-, counter- en interruptport Digital-, counter- en interruptport Digital-, counter- en interruptport Digital-, counter- en interruptport Digital port Digital port Digital port Digital port
Speciale functie Databits van de printerinterface swcom RxD swcom TxD Klok voor aansluiting van een 2W- busmodem Data voor aansluiting van een 2W-busmodem BUSY (Handshake) van de printerinterface ACKNOWLEDGE (Handshake) van de printerinterface STROBE (Handshake) van de printerinterface
3.3.8.1 Tellers en interrupt – ports De vier ports P1H.0 … P1H.3 van de C-Control II unit zijn interrupt – gevoelig. Na de reset zijn ze door het besturingssysteem als volgt geconfigureerd: bij elke High-Low – flank op één van de pins wordt er vertakt naar één van vier systeeminterruptroutines. In deze routine wordt één van vier tellerwaarden met 1 verhoogd. Bovendien controleert het systeem, of er een bijzondere behandelingsroutine van de gebruiker geïnstalleerd is en voert deze in dat geval uit (zie hfst. 7.11.7 en 8.1.2). De telleringangen kunnen impulsen met afstanden tot minimaal ca. 1 milliseconde zonder verlies tellen. Mocht er een kortere reactietijd nodig zijn, dan kan dat gebeuren met behulp van de systeemprogrammering door het verhogen van de interrupt – prioriteiten. 3.3.8.2 Tweede seriële interface (swcom) Op de digitale ports P1H.1 en P1H.2 kan het besturingssysteem softwarematig een tweede asynchrone interface emuleren. Les daarvoor de hoofdstukken 3.3.6 en 7.2.
15
3.3.8.3 Tweedraads bus Conrad heeft een familie van sensor- en actuatormodules ontwikkeld, waarmee een besturingscomputer, zoals de C-Control II unit, met extra in- en uitvoerfuncties uitgebreid kan worden. Het bijzondere van deze modules is de eenvoudige koppeling via een tweedraads bussysteem (Engels: “two wire bus”, afgekort ook “2W-Bus”, “2WB” of TWB”). Bij dit bussysteem worden digitale data via een 12Vgelijkspanningsleiding overgebracht. Deze leiding zorgt tegelijkertijd voor de spanningsvoorziening van de module. De busstructuur is een boomstructuur.
Op dit moment staan de volgende 2W- busmodules ter beschikking: • digital port module (4 extra I/O- ports) • digital port module met vermogensuitgangen (4 ports tot max. 2A / 25V) • frequentiemeter - / tellermodule (1 ingang, tot 30kHz – impulsfrequentie, geïntegreerd Reed – contact voor het triggeren met een externe magneet, b.v. voor het bewaken van deuren en ramen) • combimodule: 1 x A/D – omvormer (10bit, 0 …25V) en 2 x digital I/O • Combimodule: 1 x temperatuursensor –23 °C … 100 °C (0.125K resolutie) en 2 x digital I/O • Infrarood zender / -ontvanger (voor afstandsbesturing van apparaten door C-Control of voor afstandsbesturingen van C-Control applicaties d.m.v. infrarood) • Minidisplay (voor extra aanduidingen in de stijl van het minidisplay van de C-Control II Unit) Voor het aankoppelen van de C-Control II unit aan de 2W-bus heeft u het 2W-bus modem nodig. Dit modem heeft een ingang voor de ongemoduleerde 12-V voedingsspanning uit een voedingseenheid alsmede een synchrone digitale interface met een data -, een impuls – en een massaleiding (DATA, CLOCK, GND). Aan de kant van de uitgang bevindt zich de 2W-bus- aansluiting. De lengte van de leiding van de 2W-bus modem naar een 2W-bus modem kan maximaal 20 m bedragen. De verbinding van de CControl II unit met het 2W-bus modem vindt plaats via de pins P1H.3 (CLOCK) en P1H.4 (DATA) alsmede GND. Tijdens het gebruik zendt de C-Control II unit 8 byte lange dataframes serieel - synchroon naar het 2Wbus modem. Deze frames bevatten het adres van de aangesproken 2W-bus- module, een commando en een paar databytes. Na een korte tijd (ca. 17ms … 30ms) antwoordt het modem steeds met een 8 byte lang dataframe, dat statusinformatie en data van de aangesproken module bevat. Het besturingssysteem van de C-Control II unit bevat routines voor de serieel – synchrone communicatie met het 2W-bus modem. Uw C2- programma hoeft alleen maar de dataframes voor te bereiden en te evalueren. Verdere aanwijzingen voor de programmering vindt u in hfst. 7.12. Elke 2W-bus module heeft een duidelijk 8-bit adres in het netwerk. Dit adres moet eenmaal naar de module overgebracht worden. Een voorbeeldprogramma voor het instellen van de 2W-bus moduleadressen vindt u op de CD voor de C-Control II unit. 3.3.8.4 Printer – interface Op de C-Control II unit kan een printer aangesloten worden, als die zich qua tekens laat aansturen door de klassieke ASCII – mode. Naaldprinters kunnen zonder probleem gebruikt worden. Inkjet- en laserprinters werken in de regel pagina –gewijs. De uitvoer van een pagina vindt dan vaak pas plaats na ontvangst van het paginatransport – teken. Sommige nieuwe printers zijn voorbereid op het samenwerken met grafische besturingssystemen (zog. “GUI- printers”) en hebben voor de aansturing speciale drivers nodig. Deze printers zijn slechts in beperkte mate geschikt voor gebruik met de C-Control II unit (u zou zelf de printerdriver voor de C-Control II unit moeten implementeren). Wij vragen u begrip voor het feit dat het voor Conrad vanwege het grote aantal bestaande printermodellen niet mogelijk is in
16
elk specifiek geval een uitspraak te doen welke printer er via de C-Control II unit kan worden gebruikt en welke niet. Voor het aansluiten van een printer op de C-Control II unit verbindt u de volgens pins met die van een 25polige SUB-D-bus:
Signaal C-Control II pin SUB-D 25 pin Databit 0 P1L.0 2 Databit 1 P1L.1 3 Databit 2 P1L.2 4 Databit 3 P1L.3 5 Databit 4 P1L.4 6 Databit 5 P1L.5 7 Databit 6 P1L.6 8 Databit 7 P1L.7 9 BUSY (Handshake) P1H.5 11 ACKNOWLEDGE (Handshake) P1H.6 10 STROBE (Handshake) P1H.7 1 Massa GND 18 … 25 Het besturingssysteem beschikt over ingebouwde routines voor de uitvoer van data naar de printer via de genoemde ports. Indien nodig kunt u de uitgebreide signalen van de printer evalueren resp. naar de printer zenden. Deze evaluatie is echter niet in het besturingssysteem van de C-Control II unit geïmplementeerd. Welke uitgebreide signalen de interface van een printer definieert, kunt u in de vakliteratuur vinden. Met welke vrije digitale ports van de C-Control II unit u deze extra signalen verbindt, staat u vrij. Aanwijzingen betreffende toegang tot de printer – interface in uw programma’s vindt u in hfst. 7.5.
3.3.9 A/D - ports
De C-Control II unit beschikt over 8 ports (A/D 0 … A/D 7), die verbonden zijn met de interne 10bit – A/D – omvormer van de microcontroller. Het besturingssysteem voert op de achtergrond continu A/D – omvormingen uit. Om storende invloeden te reduceren, worden de spanningssignalen gefilterd door een glijdende gemiddelde waarde – verbinding. Lees betreffende de A/D – omvorming ook de hoofdstukken 3.2.3 en 7.9.7.
3.3.10 DCF/FRQ – ports
Op de DCF/FRQ0 – pin kan de geïnverteerde signaaluitgang van een DCF77 – zendergestuurde tijd – antenne aangesloten worden.De daarvoor noodzakelijke pull -up weerstand is al in de unit geïntegreerd. Het besturingssysteem neemt bij het ontvangen van een signaal automatisch de decodering van het dataframe over en stelt de interne klok van het systeem in. De DCF- pin kan gelijktijdig gebruikt worden voor het meten van impulsfrequenties van 100Hz tot 30 kHz; dit geldt eveneens voor de tweede frequentiemeetpin FRQ1. De frequentiemeting vindt plaats volgens het principe van de impulstelling in een poorttijd van één seconde. Daardoor geven de telwaarden direct een frequentie in Hz. Verdere aanwijzingen betreffende de ontvangst van de zendergestuurde tijd en frequentiemeting vindt u in de hoofdstukken 7.11 en 7.9.6.
3.3.11 PLM – ports
De C-Control II unit beschikt over drie ports (“kanalen”) voor de uitvoer van impulslengte – gemoduleerde signalen: PLM0, PLM1 en BEEP/PLM2. Deze kunnen gebruikt worden voor de D/A – omvorming, voor het aansturen van servomotoren in de modelbouw of voor de uitvoer van audiofrequenties. Een impulslengte – gemoduleerd signaal heeft een periode van N zogenaamde “ticks”. De duur van een tick is de tijdbasis. Als men de uitvoerwaarde van een PLM- port op X zet, dan houdt deze voor X ticks van een periode high level en valt voor de rest van de periode op low.
17
Als tijdbasis kunnen 8 verschillende tijden van 400ns tot 51.2µs ingesteld worden. De periodelengte kan gevarieerd worden van 0 tot 65535.
De PLM – kanalen 1 en 2 hebben een gemeenschappelijke tijdbasis en periodelengte. Voor kanaal 2 kan een van de kanalen 0 en 1 onafhankelijke tijdbasis en periodelengte ingesteld worden. Lees daartoe ook hoofdstuk 7.8. In toepassingen voor de impulslengte – gemoduleerde digitale A/D – omvorming worden tijdbasis en periodelengte eenmalig ingesteld en daarna wordt alleen de uitvoerwaarde gemanipuleerd. Als men echter de periodelengte variabel houdt en er voor zorgt dat de uitvoerwaarde b.v. steeds de helft van de periodelengte bedraagt, dan kunnen de PLM – kanalen ook gebruikt worden voor de uitvoer van rechthoeksignalen van bepaalde frequenties. De uitvoerfrequentie van een PLM – kanaal volgt uit 1 / (tijdbasis * periodelengte). Aanwijzingen betreffende de uitvoer van audiofrequenties vindt u in hoofdstuk 7.8.5. De PLM – ports zijn vanwege hun elektrische eigenschappen digitale ports. Let daarom op de technische randvoorwaarden voor digitale ports (max. stroom).
3.3.12 CAN – interface
CAN – “Controller Area Network” is een digitaal communicatiesysteem voor de koppeling van op microcontroller gebaseerde modules. Oorspronkelijk werd het ontworpen voor toepassingen in de automobielindustrie en grijpt terug op de ontwikkelingen van de Robert Bosch GmbH. In moderne auto’s nemen microcontrollers met CAN besturingstaken over van ABS tot aan de centrale vergrendeling. Intussen heeft CAN ook vaste voet gekregen als veldbus in de industriële automatiseringstechniek en verbindt besturingen die via geheugens programmeerbaar zijn met sensoren en actoren of ook met elkaar. De CAN – bus zelf is een kabelstreng met twee elektrische aders (CAN-H, CAN-L). De maximale lengte van de CAN – bus bedraagt 1200m, afhankelijk van de gebruikte bit –snelheid. Bitsnelheid 50 kbit/ s 62,5 kbit/ s 125 kbit/ s 250 kbit/ s 500 kbit/ s
Maximale buslengte 1200 m 1000 m 500 m 250 m 100 m
Op de CAN – bus worden databits massavrij overgebracht als differentiaalspanningen (volgens de RS485 standaard). Deze manier van data – overdracht maakt het signaal veiliger tegen de instraling van storende signalen, vergeleken met de overdracht van spanningsniveaus met referentiemassa. Aan beide einden moet de CAN – bus afgesloten zijn met een 120 Ohm weerstand. De lengtes van de steekleidingen van de bus naar de aangesloten modules mogen niet groter zijn dan een paar centimeter. Als de steekleidingen te lang zijn of als de afsluitende weerstanden ontbreken, dan kan leidingsreflectie de data – overdracht sterk storen of onmogelijk maken. Als kabelstreng kunnen simpele, getwiste leidingen gebruikt worden (“twisted pair”). Bij het gebruik van afgeschermde leidingen kunnen problemen met storende uit- en instraling gereduceerd worden. Dit geldt in het bijzonder voor lange CAN – bussen en hoge overdrachtsnelheden. Om intermitterende storingen te onderdrukken dienen er speciale CAN – smoorspoelen gebruikt te worden.
18
De CAN- overdrachtsnelheid van 1 Mbit/ s wordt door C-Control II niet direct ondersteund. Deze bitsnelheid vraagt om bijzondere maatregelen voor de overdracht –zekerheid en vooral tegen de storingsuitstraling. Conrad Electronic gaat er niet van uit dat de C-Control II unit toegepast wordt in applicaties die dergelijke hoge overdrachtsnelheden nodig maken. De onderstaande tekening toont de koppeling van 3 C-Control II units via de CAN – bus:
De aansluiting van een C-Control II unit vindt plaats via de pins CANH en CANL. De digitale signalen op de pins CAN_Tx en CAN_Rx mogen alleen gebruikt worden voor diagnose – doeleinden! Een overzicht van de beschikbare functies voor het programmeren van één van de CAN – applicaties vindt u in hfst. 7.1.
4.
Besturingssysteem
4.1
Overzicht
Het besturingssysteem van de C-Control II unit neemt de totale interrupt – handling, de configuratie van de microcontroller na de reset, het laden van gebruikersprogramma’s in het FLASH – geheugen alsmede de start en de uitvoering van gebruikersprogramma’s over. Tijdens het verloop van het programma stuurt het systeem alle in – en uitvoeroperaties op de achtergrond van de toepassing. Een belangrijk onderdeel van het systeem is de virtuele machine (zie onder) voor het uitvoeren van C2 – programma’s. Het besturingssysteem is geschreven in “Assembler” en in de programmeertaal C en is in binaire vorm aanwezig op de CD voor de unit. Het besturingssysteem van de C-Control II unit is bij de uitlevering in de regel nog niet geïnstalleerd en moet eerst in het eerste segment van het FLASH – geheugen opgeslagen worden (eerste segment = “segment 0”). Alleen bij uitzondering vindt u daar een testversie, die tijdens de productie geladen is. Als u de C-Control II unit voor de eerste keer in gebruik neemt, dient u in elk geval eerst het besturingssysteem vanaf de CD te installeren. Op de C-Control homepage www.control.de op internet vindt u eventueel ook een actuelere versie of aparte bestanden die u kunt downloaden. U moet dan deze versie in plaats van de op de CD meegeleverde versie gebruiken.
4.2 Bootstrap – Installeren van het besturingssysteem In de bootstrap – mode van de microcontroller kan het C-Control II – besturingssysteem overgebracht worden naar het FLASH – geheugen van de unit. Installeer eerst de boot – tool van de C-Control – CD op uw PC. Lees daarbij de installatiehandleiding en eventueel de extra aanwijzingen. Om de bootstrap – mode te activeren, moet u bij een hardware – reset van de C-Control II unit gelijktijdig de BOOT – pin op low level leggen, d.w.z. door kortsluiten van de BOOT – pin met de daarnaast gelegen GND – pin door een steekbrug of een toets. Als kort daarop de BOOT – pin weer naar high level gaat, verwacht de microcontroller de overdracht van het besturingssysteem via de seriële interface.
19
Start nu de data – overdracht van het systeem met behulp van de boot – tool. Dit PC – programma neemt de gehele besturing van de boot – procedure over: de overdracht begint met een nulbyte (1 startbit, 8 databits = 0, 1 stopbit). De microcontroller van de C-Control II unit ontvangt de nulbyte en gebruikt deze voor het meten van de overdrachtssnelheid (b.v. 9600 Baud). Dan initialiseert hij zijn eigen interface dienovereenkomstig. Als antwoord zendt de controller een identificeringsbyte naar de PC. De PC – software herkent het concrete controller – type en zendt een Ur –loader (32 bytes) naar de C-Control II unit. Deze Ur – loader wordt door de controller in de interne RAM opgeslagen en automatisch gestart. De Ur – loader zelf is een minimaal programma, dat niets anders doet dan de tweede fase van de loader via de seriële interface te ontvangen, in de RAM op te slaan en aansluitend te starten. De tweede fase van de loader ontvangt tenslotte het besturingssysteem en slaat dat op in het eerste segment van het externe FLASH – geheugen. Dit eerste segment bevat vanaf adres 0x0000 de interrupt – vectoren, waaronder ook de reset – vector. Als het besturingssysteem correct geïnstalleerd is, start het na de volgende reset automatisch en gaat over in de host – mode. Bij alle volgende hoofdstukken gaan wij er van uit, dat u het besturingssysteem van de C-Control II unit correct heeft geïnstalleerd.
4.3 Host mode 4.3.1 Systeeminitialisering en automatisch starten van gebruikersprogramma’s
Na de reset worden de resources van de microcontroller geïnitialiseerd. Aansluitend wordt er gecontroleerd, of er een C2- gebruikersprogramma in het FLASH – geheugen opgeslagen is. Als er een programma gevonden wordt, dan start het systeem de virtuele machine en voert dit programma uit. Anders gaat het systeem over in de host – mode. Als u een in FLASH opgeslagen programma niet automatisch wilt starten, bijvoorbeeld omdat u een nieuw gebruikersprogramma in de unit wilt laden, moet bij de reset de HOST – pin van de unit op low level getrokken zijn.
4.3.2 Downloaden van gebruikersprogramma’s en andere host – commando’s In de host – mode verwacht het systeem de ontvangst van commandobytes via de seriële interface, die het dan uitvoert. Het belangrijkste commando is dat voor het starten van het downloaden van programma’s (CMD_LOAD_VMC). Bij het downloaden wordt een gecomP1Leerd gebruikersprogramma (VMC – bestand) van de PC naar de C-Control II unit overgebracht en door de unit opgeslagen in het FLASH – geheugen. De overdracht vindt plaats binnen de geïntegreerde ontwikkelingsomgeving, die u vanaf de utility – CD kunt installeren. Lees daartoe de aanwijzingen op de CD, resp. in de Online Help voor de geïntegreerde ontwikkelingsomgeving. Onder andere zijn de volgende commandobytes gedefinieerd: Commando CMD_SEND_ID (0) CMD_SEND_VERSION (2) CMD_START (3) CMD_LOAD_VMC (4) CMD_ERASE_VMC (6) CMD_RESET (255)
Reactie van de unit in host – mode Antwoordt met de tekst “C-Control II” Antwoordt met een versie – string Start een aanwezig C2 – gebruikersprogramma Begin van de overdracht van een C2 – gebruikersprogramma Wist een aanwezig C2 – gebruikersprogramma Voert een software – rest van de microcontroller uit
4.4 Virtuele machine 4.4.1 Basisprincipes De uitvoering van gebruikersprogramma’s op de C-Control II unit gebeurt door de virtuele machine (VM). Het begrip “virtueel” wordt tegenwoordig in veel verbanden gebruikt. “Virtueel” betekent zo ongeveer “gedacht”, nagebootst”, “net als of”……De “machines” van de computertechniek zijn de microprocessorkernen. Ze worden door hun desbetreffende opbouw uit registers, rekenmachines,
20
besturingsmachines en de interface naar het programma- en datageheugen gekarakteriseerd. Deze opbouw wordt aangeduid als de processor – architectuur. Een virtuele machine is een nagebootste microprocessorkern. De gewenste architectuur wordt per software op een bestaand computersysteem geconstrueerd. Tegenover het nadeel van een lagere snelheid bij de uitvoering van eenvoudige programma aanwijzingen staat een aantal voordelen: • het kunnen realiseren van architectuurelementen, die het als basis gebruikte computersysteem niet biedt • optimale aanpassing aan een programmeertaal • het eenvoudig overbrengen van de VM op andere computersystemen bij herbruikbaar- heid van bestaande programma’s, zelfs als binaire code In het besturingssysteem van de C-Control II werkt een door Conrad Electronic ontwikkelde virtuele machine. Deze is functioneel nauw aan de programmeertaal C2 gekoppeld en biedt de gebruikersprogramma’s eenvoudige toegang tot de systeemresources.
4.4.2 binaire code – vertaler
De C2-compiler produceert uit de programma – brontekst van het gebruikersprogramma een binaire code. Deze kan in de C-Control II unit geladen worden. Bij de uitvoering van het gebruikersprogramma wordt de binaire code stap voor stap gelezen en vertaald. D.w.z. voor elke gelezen code wordt een gedefinieerde operatie uitgevoerd. De virtuele machine van de C-Control II unit kent vier codevormen – twee 16bit-vormen en twee 32bitvormen: Form A B C D
Low-byte (low-word) Bevel (0 … 63) Bevel (64 … 127) Bevel (128 … 191) Bevel (192 … 255)
High-byte (low-word) Byte - parameter Byte - parameter
High-word Word - parameter Word – parameter
Aan het waardebereik waarin de bevelcode ligt, herkent de vertaler de bevelvorm. Afhankelijk van de bevelvorm worden optioneel een byte -parameter en een word -parameter geladen, voor de aan de codewaarde toegewezen operatie uitgevoerd wordt. Om een overzicht te geven van alle beschikbare operaties, voert op deze plek te ver en is voor het in principe begrijpen van de C-Control II unit niet noodzakelijk.
4.4.3 Mulithreading
Een hoofdkenmerk van de C-Control II Unit is de ondersteuning van Multithreading in gebruikersprogramma’s. Verschillende programma – onderdelen kunnen quasi gelijktijdig en van elkaar onafhankelijk afgewerkt worden. Daardoor kunnen complexe, in de applicatie parallel en asynchroon verlopende procedures op simpele wijze behandeld worden. Voorbeeld: Verschillende digitale ports moeten permanent gecontroleerd worden; bij het voorkomen van een bepaalde combinatie moet er een impulsvolgorde met vooraf ingevoerde timing afgegeven worden; gelijktijdig moeten er een paar A/D- kanalen bewaakt worden en bij overschrijding van limietwaarden moet er een alarm afgaan; van de seriële interface worden in een bepaald ritme dataframes verwacht, die geëvalueerd en beantwoord moeten worden; via de printer moeten meetwaarden afgedrukt worden… In programma – onderdelen die met andere apparaten communiceren, kunnen er situaties ontstaan, waarbij er gewacht moet worden tot de communicatiepartner klaar is voor de data – ontvangst. In een computersysteem met uitsluitend sequentiële verwerking van het programma is het praktisch onmogelijk, in deze wachttijden op verdere gebeurtenissen te reageren. Zo kan het gebeuren, dat een alarmtoestand op grond van een te hoge temperatuur niet of niet tijdig herkend wordt, omdat ondertussen het systeem wacht tot een aangesloten printer klaar is voor gebruik. Bij de Multithreading van de C-Control II Unit kan een programma opgedeeld worden in maximaal 255 “threads” (“draden”). Aan elke thread wordt door de kern van het besturingssysteem beurtelings een portie rekentijd toegekend. Hoeveel rekentijd een thread krijgt, kan gestuurd worden door de prioriteit ervan. Bij prioriteit 0 wordt er direct doorgeschakeld naar de volgende thread. De hoogst mogelijke prioriteitswaarde is 255. In één omloop voert de binaire code – vertaler voor elke thread maximaal zo vele operaties uit als er overeenkomen met de desbetreffende prioriteitswaarde. Bij wachtsituaties vindt de
21
doorschakeling voortijdig plaats. De prioriteit van elke thread kan tijdens de uitvoering van het programma aangepast worden aan de actuele prestatie – eisen. De moeilijkheid bij het maken van een programma met multithreading zit hem in de uitgebalanceerde uitgifte van de prioriteitswaarden. Bij 255 threads en 256 prioriteitsstappen zijn er praktisch ontelbare mogelijkheden om rekentijd te verdelen. Bij de toewijzing van zeer lage prioriteiten aan alle threads krijgt men zeer snelle omlooptijden en daardoor een relatief geringe vertraging, tot één enkele thread op een gebeurtenis kan reageren. Daarentegen wordt de performance van het totale systeem minder, omdat er per tijdeenheid meer rekenvermogen van de virtuele machine voor het omschakelen van threads verbruikt wordt. Daarom is het niet zinvol, aan alle threads de prioriteit 1 toe te wijzen. De performance wordt beter naarmate er meer hogere prioriteiten uitgegeven worden. Dat heeft echter langere reactietijden tot gevolg. In het niet aan te bevelen extreme geval hebben alle threads de prioriteit 255. Het heeft zijn waarde aangetoond om de meeste threads met een tamelijk lage standaardprioriteit (b.v. 32) te laten lopen. Slechts aan een paar onderdelen van het programma, die lange tijd op een gebeurtenis wachten, maar dan ook met hoge snelheid moeten reageren, zou een hogere waarde toegewezen moeten worden. Opmerking – multithreading vs multitasking: Men spreekt in het algemeen over tasks in samenhang met parallel onder een besturingssysteem lopende, onafhankelijke programma’s, b.v. een tekstverwerker, een e-mail -cliënt en een databank, die gelijktijdig op een PC gestart zijn. Threads zijn daarentegen zogenaamde “lichtgewicht processen” binnen een programma. Meerdere threads in een programma delen een gezamenlijke adresruimte en kunnen via globale variabelen relatief gemakkelijk data uitwisselen. De vraag of de C-Control II unit multithreading of multitasking gebruikt, als de unit een lichtdiode laat knipperen en parallel data van de seriële interface ontvangt, is eerder van academische dan van praktische betekenis. Voor de gebruiker is het voldoende dat het functioneert.
4.4.4 Programma - en constante - geheugens
De maximale lengte van de binaire code bedraagt 128kB. Hiervoor is plaats in twee segmenten van de FLASH-ROM. De adressering van een binaire code in het programmageheugen vindt woordsgewijs plaats via een 16bit-offset. Gescheiden van het programmageheugen gebruikt de virtuele machine nog twee andere FLASH – segmenten voor 128kB constante - geheugens. Aan het begin van het constante geheugen zijn de initialiseringswaarden voor elke thread van het gebruikersprogramma opgeslagen. Dan volgen constante getalswaarden, tabellen en strings, die in het programma gebruikt worden. De toegang tot het constante geheugen door het gebruikersprogramma vindt woordsgewijs plaats door speciale binaire codes en een 16bit-offset.
4.4.5 Datageheugen
Het derde geheugenblok is het datageheugen, dat zich bevindt in de externe SRAM van de C-Control II unit. Van de 64kB staan ca. 60kB ter beschikking voor data van het gebruikersprogramma, minus het benodigde geheugen voor de stapelprocessor. De adressering van de data vindt byte -gewijs plaats via een 16bit-offset.
4.4.6 Stapelprocessor
De virtuele machine van de C-Control II unit werkt als stapelprocessor. Deze implementeert niet, zoals vele microcontrollers en microprocessors, speciale rekenregisters of een telwerk. In plaats daarvan worden alle opdrachtelementen op een stapel (stack) geladen. De operaties van de virtuele processor manipuleren steeds de bovenste waarde op de stapel of koppelen de twee bovenste waarden tot een resultaat. Geheugenoperaties nemen een waarde van de stapel en leggen die af op een adres in het datageheugen. De stapelcontroller van de C-Control II unit ondersteunt rekenopdrachten met van voortekens voorziene 16bit- en 32bit- integere waarden alsmede met 64bit- getallen met zwevende komma. Bytes worden altijd verwerkt als 16bit- integer. De stapel dient ook als tussengeheugen voor locale variabelen van threads en subfuncties alsmede voor het doorgeven van parameters en antwoordwaarden bij het oproepen van subfuncties. Bovendien worden antwoordadres en geheugencontext (BP) voor het oproepen van een functie op de stapel beveiligd en bij het antwoord opnieuw hersteld. Elke thread van het gebruikersprogramma beschikt over een eigen stapel. De voor de stapel van een thread ter beschikking staande geheugenplaats bedraagt in theorie
22
64kB. Er is echter een limiet, omdat de stapel het 64kB grote SRAM -segment moet delen met een aantal data van het besturingssysteem, de globale variabelen van het gebruikersprogramma en andere stapels van andere threads. De adressering van data op de stapel vindt relatief plaats naar een 16bit-Basepointer (BP). Een 16bitStackpointer (SP) toont het bovenste einde van de stapel. Elke thread heeft zijn eigen paar base- en stackpointers.
4.4.7 Systeeminterface
De virtuele machine van de C-Control II unit beschikt over speciale commandocodes als interface tot de hardware – resources en functies van het besturingssysteem. Daarmee onderscheidt hij zich van de aan de basis ervan liggende microcontroller C164CI, die de hardware – resources als register in een bepaald geheugenadres- bereik legt (Special Function Register – “SFR”). De omvorming van systeemoperaties van de virtuele machine tot concrete hardware – toegang, b.v. tot registers in de SFR, vindt plaats in het besturingssysteem van de C-Control II unit. Daardoor kunnen de virtuele machine zelf alsmede de daarvoor gecompileerde gebruikersprogramma’s relatief eenvoudig naar andere computersystemen overgebracht worden. De commandocodes voor de toegang tot hardware – resources worden via inline -functies in de C2systeemmodules ter beschikking gesteld van de gebruikersprogramma’s.
5.
De Programmeertaal C2
5.1 Inleiding De programmering van de C-Control II unit wordt gedaan in de programmeertaal C2. C2 is syntactisch gelijk aan C, sommige details doen ook denken aan PASCAL of BASIC. Net als in C is er een overzichtelijk aantal codewoorden. Sommige codewoorden dienen speciaal voor de ondersteuning van multithreading. Alle systeem- en speciale functies worden via de bibliotheekmodules ter beschikking gesteld en kunnen in projecten ingepakt worden. Het projectwerk in C2, in combinatie met de geïntegreerde ontwikkelingsomgeving, is aanzienlijk eenvoudiger dan in C. C2 biedt alle mogelijkheden die nodig zijn voor een gestructureerde programmering. Zelden gebruikte, bijzonder “gevaarlijke” en moeilijk te begrijpen spraakconstructies van C zijn weggelaten. De inhoud van dit hoofdstuk bevat de systematische beschrijving van de programmeertaal C2 in de vorm van een referentie. Na een overzicht van de syntax -elementen volgt een uitgebreide weergave van alle operators, types, definitie – en toewijzingsvormen. Afsluitend vindt u een opstelling van alle datatypes en functies van de systeemmodules alsmede korte voorbeelden van de toepassing ervan. Uitvoerige programmavoorbeelden vindt u op de CD voor de geïntegreerde ontwikkelingsomgeving. Voor de volgende hoofdstukken komen wij de volgende opmaak en stijlen overeen, om tekstelementen met bijzondere betekenis gericht naar voren te doen komen. datei.txt [STRG]+[F1] sourcecode Name
bestandsnaam toetsen en toetscombinaties brontekst- voorbeelden in de brontekst te vervangen door het beschreven syntax –element
5.2 Projecten en modules
De C2- compiler produceert uit een C2 – project een binaire code, die aansluitend naar de C-Control II unit overgebracht wordt en door de virtuele machine kan worden uitgevoerd als programma. Een C2- project kan uit een willekeurig groot aantal modules bestaan. Een module is een eenvoudig ASCII – tekstbestand met de bestands –uitbreiding “c2”. De bestandsnaam – zonder pad en extensie – is de modulenaam. De naam van een module moet een geldig C2 – kenmerk zijn (zie onder). Elke naam mag slechts éénmaal in het project voorkomen. Over de module verdeeld staat de totale brontekst van een programma. Op module – niveau worden globale varianten, benoemde constanten, samengestelde datatypes, functies en threads gedefinieerd. De opdeling van een project in meerdere modules heeft de volgende voordelen: • verbeterde overzichtelijkheid over de bronteksten van grote programma’s • eenvoudig hergebruik van geteste modules in andere projecten • verbeterde leesbaarheid van bronteksten door de automatische vorming van een naamruimte voor elke module en de noodzakelijkheid van de module – specificatie bij het gebruik van kenmerken uit een module.
23
Een project beschrijft een lijst van modules. De volgorde van de modules in de lijst bepaalt de volgorde bij de vertaling door de C2 – compiler. De eerste module in de lijst wordt als eerste vertaald, dan de tweede enz. tot aan de laatste module. Samen met de geïntegreerde ontwikkelingsomgeving worden talrijke bibliotheek – modules geleverd, die b.v. functies voor de toegang tot systeem – resources van de C-Control II unit bevatten. In de praktijk bestaat een project in eerste instantie uit een paar van deze bibliotheekmodules. Dan volgen in de lijst de hergebruikbare gebruikersmodules, b.v. voor het implementeren van vaak benodigde algoritmes, zoals gestandaardiseerde berekeningen van controletotalen of dergelijke. Aansluitend staan er modules met een applicatie – specifieke code, b.v. voor het aansturen van een zeer concrete externe hardware. De laatste modules in de lijst zijn in de regel de hoofdmodules. Ze bevatten onafhankelijke hoofd -threads van het programma. De meeste toepassingen hebben slechts één hoofd –thread en daarom slechts één hoofdmodule aan het eind van de module – lijst.
5.3 Syntax – Basiselementen 5.3.1 Commentaren
Zinvolle commentaren in een programma kunnen de begrijpelijkheid en leesbaarheid ervan verhogen. C2- commentaren zijn compatible met die in C en C++. Er zijn commentaren aan het eind van een regel, die door twee onmiddellijk op elkaar volgende schuine strepen // ingeleid worden. Alle tekst tot aan het eind van de regel, inclusief de schuine strepen, wordt bij het compileren over het hoofd gezien. b.v.: a = 23; // dat is een commentaar Commentaren bestaande uit meerdere regels kunnen in /* / -sequenties ingebed worden. b.v.: /* dit alles is een commentaar */ Geneste, uit meerdere regels bestaande, commentaren zijn niet toegestaan.
5.3.2 Spaties
Alle tekens met de ASCII codes 0 … 32 worden als spaties (in het Engels “whitespace” of “blanks”) gelezen en bij het compileren overgeslagen, b.v. de spaties, tabstops en regelopschuiving in de brontekst van het programma. Dit geldt echter niet binnen string -constanten. Blanks in string -constanten blijven behouden en worden zo uitgevoerd zoals ze zich in de brontekst bevinden.
5.3.3 Kenmerken
Kenmerken zijn de namen van modules, variabelen, constanten, meervoudige types, de velden, functies en threads daarvan. • Een kenmerk bestaat uit minimaal één teken en kan willekeurig lang zijn • Geldige tekens van een kenmerk zijn letters (A … Z, a …z, geen umlauts of ß), cijfers (0 … 9) en onderliggende streep (_) • Het eerste teken mag geen cijfer zijn • C2 is case –sensitief, d.w.z. hoofd- en kleine letters worden onderscheiden – Abc, abc, aBc … zijn verschillende kenmerken • C2 – codewoorden zijn als kenmerk niet toegestaan. Elk kenmerk moet bij de compiler bekend zijn voor het de eerste keer gebruikt wordt. Dit laatste wil zeggen dat het verder naar boven in de module – brontekst of in een eerder vertaalde module gedefinieerd moet zijn. Bij kenmerken die in een andere module voor die tijd gedefinieerd zijn, moet zonder spatie de modulenaam en een punt ervoor gezet worden. Voorbeeld: Functie fx, gedefinieerd in modulebestand a.c2 function fx () { // ... }
24
Oproep van de functie verderop in a.c2: fx ( ); Oproepen van de functie in een andere module (in de modulelijst van het project na a.c2) a.fx ( ); Er kan op de hierboven beschreven manier toegang verkregen worden tot alle kenmerken van globale variabelen, benoemde constanten, samengestelde datatypes, functies en threads van een module in volgende modules.
5.3.4 Opdrachten en opdrachtblokken
Opdrachten zijn de basisbouwstenen van een computerprogramma. De volgende opdrachtvormen worden in C2 onderscheiden: • definitie van variabelen • definitie van constanten • toewijzing • functieoproep • programma -besturingsopdracht Een opdracht kan zich uitstrijken over één maar ook over meerdere regels. Iedere opdracht moet gevolgd worden door een puntkomma. Voorbeeld: Int a; a = 123; Opdrachtblokken zijn opeenvolgingen van opdrachten, die door accolades { } bij elkaar gevoegd zijn. Voorbeeld: { a = 123; b = a + 1; } Na een opdrachtblok is geen puntkomma nodig. Opdrachtblokken kunnen in plaats van een aparte opdracht staan, b.v. om meerdere acties binnen een opdracht voor de programmabesturing uit te voeren. Voorbeeld: if x > 0 { a = 123; b = a + 1; }
5.3.5 Termen
Een term (of “term”) is de koppeling van data (variabelen of constanten) door operators. In C2 zijn er uitsluitend numerieke termen. Elke numerieke term levert door mathematische berekening een waarde. Geldige numerieke termen zijn bijvoorbeeld: a + b + c 1 + x f (x) + c 1 + 2 + 1977 Een speciale vorm is de constante term. De waarde daarvan kan reeds voor de uitvoering van het programma bepaald worden. Zo is de waarde van de term 1 + 2 + 1977 blijkbaar altijd 1980. Dat staat op het moment van de programmering vast en zal ook bij de uitvoering van het programma niet veranderen. Om onnodige berekeningen van constante termen tijdens de uitvoering van het programma te vermijden, probeert de C2 – compiler, deze zo veel mogelijk vooraf te bepalen en samen te vatten. Zo wordt de opdracht a = 1 + 2 + 1977 + c door de compiler vooraf berekend en intern omgevormd in a = 1980 + c
25
Functies (zie 5.8) worden echter steeds opgeroepen en uitgevoerd, ook als de parameters en de uitkomst daarvan constant zijn. In constante termen kunnen ook vooraf gedefinieerde benoemde constanten (zie 5.6) toegepast worden.
5.3.6 Codewoorden
Hieronder vindt u een alfabetische lijst van alle C2 – codewoorden. Gedetailleerde definities en toepassingsvoorbeelden vindt u in het verdere verloop van deze gebruiksaanwijzing. and break byte capture const continue do else float for
function halt if inline int long loop nand nor not
or quit release resume return returns run shl shr sleep
step string thread type wait while xor yield
5.4 Datatypes 5.4.1 Numerieke datatypes
C2 biedt in totaal vier verschillende numerieke datatypes voor de definitie van variabelen, functieparameters en uitkomsten van functies: byte, int, long en float. Het datatype van een variabele, een functieparameter of van een uitkomst moet gekozen worden volgens het benodigde waardebereik en de noodzakelijke rekenprecisie. Operaties met long- en float- data leiden tot een aanzienlijk grotere behoefte aan geheugenplaats en rekentijd. De uitvoeringssnelheid van float – operaties is lager dan die van long – operaties. Deze duren op hun beurt weer iets langer dan int – berekeningen. Het rekenen met bytes in plaats van integer -data levert geen snelheidsvoordeel op, omdat bytes door de stapelprocessor van de virtuele machine steeds tot integralen uitgebreid worden. Het gebruik van het byte – type bij de definitie van globale en locale variabelen spaart echter een beetje geheugenruimte. Type –codewoord Byte Int Long Float
Waardebereik Benodigde geheugenruimte voor variabelen 0 … 255 1 byte -32768 … 32767 2 bytes -2147483648…2147483647 4 bytes * -308 * 308 8 bytes ±1.7 10 … ±1.7 10
5.4.2 Tekenketens ( strings)
De het vaakst voorkomende tekenketens – operatie in besturingssystemen is het koppelen van korte teksten en meetwaarden voor de weergave op een display of voor de uitvoer naar een printer. Basis voor een paar simpele stringkoppelingen en –functies is het type string. Een string- variabele biedt plaats voor maximaal 30 tekens en bezet steeds 32 bytes in een geheugen, ook als de daadwerkelijk opgeslagen tekenkoppeling uit minder dan 30 tekens bestaat. Uitvoeren die langer dan 30 tekens moeten zijn, kunnen in bytearray – variabelen uit aparte substrings samengesteld worden (zie bibliotheek – module mem.c2).
5.3.4 Samengestelde datatypes
Voor de kapseling van complexe datastructuren in een type kunnen uit standaardtypes (byte … string) en andere vooraf gedefinieerde types samengestelde datatypes gevormd worden. Daartoe staat na het codewoord type het kenmerk van het nieuwe datatype. In accolades volgen de definities van de aparte velden van het type. De definitie van een veld bestaat uit het codewoord of kenmerk van een vooraf bekend type alsmede het kenmerk van het veld. Meerdere velden worden steeds d.m.v. een puntkomma van elkaar gescheiden.
26
Voorbeelden: type Position { int x; int y; } type MyType {
}
Position pos; float value; string text;
Voordelen van eigen types zijn b.v. de betere leesbaarheid van een programma en de eenvoudigere overdracht van bij elkaar horende data aan functies, dus b.v. function fx
( MyType t ) …
in plaats van function fx ( int xpos, int ypos, float value, string text ) …
5.5 Variabelen 5.5.1 Definitie van variabelen
Variabelen dienen om data tussendoor op te slaan tijdens de afloop van het programma. Voor de eerste keer dat u ze gebruikt in een brontekst moet een variabele door aanduiding van het datatype en van het kenmerk gedefinieerd worden. Type name; Bijvoorbeeld: int i; string s; Meerdere variabelen van hetzelfde type kunnen in een gemeenschappelijke opdracht gedefinieerd worden. Daarbij worden meerdere kenmerken steeds door een komma van elkaar gescheiden. Type Name 1, Name 2, …; B.v. long x, y, z; Gedefinieerde variabelen kunnen daarna in termen en toewijzingen gebruikt worden. B.v.
int x, y; x = 18; y = 8 * x;
5.5.2 Definitie en toepassing van variabelen van samengestelde datatypes De definitiesyntax komt overeen met de reeds bekende syntax voor de definitie van variabelen met standaardtypes. Met het voorbeeld uit 5.4.3 kan een variabele van het samengestelde type mytype als volgt gedefinieerd worden: mytype t; Daarna heeft men toegang tot de aparte velden van de variabelen t door het aanhangen van een punt en van het desbetreffende veldkenmerk.
27
t.value = 82.5; Zo kunnen ook de velden van gekoppelde datatypes bereikt worden, b.v.: t.pos.x = 31; 5.5.3 Definitie en indicering van variabele arrays C2 ondersteunt de definitie van variabele ééndimensionale arrays. Bij de definitie volgt dan na het variabelenkenmerk in rechte haakjes [ ] een constante term. Het resultaat van de term legt het aantal array – elementen vast. b.v.:
Typ ArrayName [constante waarde]; float coeff [10];
De benodigde geheugenruimte kan berekend worden uit de grootte van de aparte elementen, vermenigvuldigd met het aantal elementen. Dus worden voor de float – array in het bovenstaande voorbeeld 80 bytes bezet (10*8 bytes). De toegang tot aparte array – elementen in termen en toewijzingsopdrachten vindt plaats via een indexterm in rechte haakjes. De indexterm kan een willekeurige, ook niet constante, numerieke term zijn. De waarde ervan wordt voor de programma – looptijd berekend. B.v. y [i] = coeff [i] * x[1] + coeff [i -1] * x [i-1] ; De index is op nul gebaseerd! Dat betekent dat de indexwaarde 0 betrekking heeft op het eerste element, de waarde 1 op het tweede, enz. Terwijl het programma loopt vindt er geen controle van de index plaats! Een vaak voorkomende fout in gebruiksprogramma’s is het overschrijden van het toelaatbare indexbereik. Dit kan leiden van eenvoudige plaatselijk foutgedrag in het programma tot een volledige crash van het systeem van de C-Control II unit. Meerdimensionale arrays worden in C2 niet ondersteund. Een vergelijkbare functionaliteit kan via het gebruik van ééndimensionale arrays van samengestelde datatypes gemaakt worden. B.v.:
Type Line { int row [10] ; };
Type Matrix { Line line [10] }; Matrix m; int x; int i, k; … x = m.line[i] .row[k]; Deze syntax vraagt weliswaar wat meer schrijfwerk dan een vergelijkbaar m [i] [k] in andere programmeertalen, maar daardoor is de leesbaarheid van C2 – programma’s op deze plaats aanzienlijk beter.
5.5.4 Initialisering
De waarde van een variabele volgens de definitie is in eerste instantie onbepaald. Voor een variabele voor het berekenen van een term er bij gehaald wordt, moet deze geïnitialiseerd worden. Anders is ook
28
het resultaat van de term onbepaald (afgezien van triviale termen, zoals 0*x). De initialisering vindt plaats via de toewijzing van een waarde. B.v. int i; i = 0; Bij array – variabelen moet elk element apart geïnitialiseerd worden, b.v. in een lus, die de index van 0 tot het aantal elementen – 1 laat lopen. int i; long table [13] for i = 0 … < 13 table [i] = 0 Variabelen van samengestelde datatypes zijn pas volledig geïnitialiseerd, als alle aparte velden, ook de velden van gekoppelde types geïnitialiseerd zijn. Mytype t; t.pos.x = 0; t.pos.y = 0; t.value = 0; t.text = “ “;
5.5.5 Globale en locale variabelen
C2 en de virtuele machine van de C-Control II unit maken onderscheid tussen globale en locale variabelen. Globale variabelen worden op module – niveau naast threads, functies, benoemde constanten en samengestelde datatypes gedefinieerd. B.v. int i; function fx () { // ... } Globale variabelen bestaan tijdens het gehele doorlopen van het programma statisch op een zeer bepaalde, door de compiler berekende geheugenplaats. Via de modulenaam zijn ze in de gehele brontekst volgens de definitie zichtbaar en toegankelijk. Globale variabelen moeten heel spaarzaam en goed doordacht gebruikt worden! Indien mogelijk moeten alle manipulaties van een variabele binnen dezelfde module ervan uitgevoerd worden waarin deze gedefinieerd is. Anders wordt het programma al snel onoverzichtelijk, als er niet meer duidelijk herkenbaar is op welke plaats de waarde van een globale variabele kan veranderen. Een typische toepassing voor globale variabelen zijn variabelen voor het opslaan van programmatoestanden en gebruikersinstellingen, variabelen voor de data – uitwisseling tussen threads of byte-array – variabelen als buffergeheugen bij een data -overdracht. Locale variabelen worden in het opdrachtblok van een thread of van een functie gedefinieerd. Bijvoorbeeld: Function fx () { int i; //... } Locale variabelen van een functie worden voor de looptijd van het programma op de stack van de actuele thread aangelegd en bestaan alleen binnen een geheugencontext, d.w.z. tijdens het verwerken van een functie. Ze zijn alleen binnen deze context zichtbaar en toegankelijk. Bij het verlaten van een functie eindigt de levenscyclus van een locale variabele. Bij het terugkeren naar deze functie of bij het parallel oproepen van de functie door een andere thread is de waarde van een locale variabele steeds onbepaald. Een speciale vorm wordt gevormd door locale variabelen van threads. Omdat de geheugencontext van threads tijdens de totale duur van het programma blijft bestaan, ook voor gestopte threads, bestaan de
29
locale variabelen van een thread quasi – statisch. Een byte – array zou daardoor ook als buffergeheugen voor data – overdracht gebruikt kunnen worden (zie bibliotheekmodule hwcom.2). Voorbeeld: Thread tx { byte buf [48] ; //... } Bij het uitgeven van namen voor locale variabelen dient u er op te letten, dat deze eventueel globale kenmerken van dezelfde module verbergen. Als u dan toegang wilt krijgen tot gelijknamige globale kenmerken, moet bovendien de modulenaam gespecificeerd worden, alsof het globale kenmerk zich in een andere module zou bevinden. Voorbeeld in module a.c2 int i; functie fx () { int i; i = 0; / / <- locale i a.i = 0; / / <- globale i }
5.6 Constanten 5.6.1 Benoemde en onbenoemde constanten
Onbenoemde constanten worden zeer vaak gebruikt. In de opdracht a = 1; is “1” een onbekende getalsconstante. Benoemde constanten vertegenwoordigen een waarde, die deze daaraan voorafgaand in de constanten – definitie (zie verderop) is toegewezen. De definitie en het gebruik van benoemde constanten heeft de volgende voordelen: • Reductie van het gedoe bij eventuele veranderingen in het programma – constanten hoeven alleen op de plek van hun definitie gewijzigd te worden, niet op de vele plaatsen waar ze in het programma gebruikt worden. • Verhoging van de leesbaarheid van het programma, als constanten met volledig zelfbeschrijvende kenmerken gedefinieerd worden (zie ook b.v. ERDUMFANG in plaats van EUMF). • Voor herhaald gebruik van dezelfde long-, float- en string- constanten is minder geheugenruimte in het constantengeheugen nodig. Onbekende constanten met dezelfde waarde of tekstinhoud zouden namelijk bij het vaker gebruiken in de programma – brontekst meerdere keren in het constantengeheugen aangelegd worden. Constanten met samengesteld datatype worden in C2 niet ondersteund. 5.6.2 Onbenoemde cijferconstanten Decimale getallen bestaan uit een volgorde van de cijfers 0 … 9 zonder spaties. Als optie kan er een minteken voorgezet worden. Bij decimale getallen met zwevende komma volgen zonder spatie een decimale punt (geen komma!) en de cijfers achter de komma. Het exponenten – format wordt niet ondersteund. Hexadecimale getallen zijn gevolgen van de hexadecimale cijfers 0 … 9, A … F resp. a … f met het voorvoegsel “0x” of “0X” (vergelijk C/C++).
30
Binaire getallen zijn gevolgen van de binaire cijfers 0 en 1 met het voorvoegsel “0b” of “0B”. Achttallige getallen worden niet ondersteund. Voorbeelden: Decimale getallen Getallen met zwevende komma Hexadecimale getallen Binaire getallen
0 0.0 0x0 0b0
17 1.5 0xFF 0b01
-12345 -123.456 0XABCD 0B11101
5.6.3 Onbekende tekenconstanten Tekenconstanten staan voor de ASCII – codes ervan (waardenbereik 0 … 255) en kunnen als gehele getallen in numerieke termen gebruikt worden. Onbenoemde tekenconstanten worden door twee aanhalingstekens ingesloten en bestaan zelf uit een enkel teken of een speciale code. Speciale codes maken de weergave mogelijk van tekens die in de brontekst niet zichtbaar zouden zijn (b.v. besturingstekens, spatietekens). Ook het aanhalingsteken zelf moet als speciale code geschreven worden. Speciale codes beginnen met een backslash \. Aansluitend volgt zonder spatie een codeteken (niet case – sensitief) of de aanduiding van de ASCII – code als decimaal of hexadecimaal getal; het hexadecimale voorteken is hier alleen een x zonder 0. Speciale codes met codeteken Codeteken a b f n r t \ ‘ “
Betekenis Beltoon (bel) Backspace (één teken terug) Besturingsteken “form feed” Pagina doorschuiven op een printer Besturingsteken “nieuwe regel” Regel doorschuiven op een printer Besturingsteken “carriage return” Wagen teruglopen op een printer Tabulator (spatieteken) Backslash Aanhalingsteken Dubbel aanhalingsteken
Volledige tekenconstante ‘\a’ ‘\b’ ‘\f’ ’\n’ ‘\r’ ‘\t’ ‘\\’ ‘\’’ ‘\”’
Speciale codes met ASCII – tekens (voorbeelden): Teken A a 0 $ Tabulator
Constante in decimale vorm ‘\65’ ‘\97’ ‘\48’ ‘\36’ ‘\9’
Constante in hexadecimale vorm ‘\x41’ ‘\x61’ ‘\x30’ ‘\x24’ ‘\9’
5.6.4 Onbenoemde stringconstanten Constante strings (of “tekenkettingen”) zijn constante teksten in twee dubbele aanhalingstekens “”. Tussen de aanhalingstekens kan elk teken dat weergegeven kan worden staan. Als de string zelf een aanhalingsteken moet bevatten, dan moet dit via een speciale code (zie boven) ingebed worden. Dat geldt ook voor besturingstekens die niet weergegeven kunnen worden. De constante string “\”abc\txyz\” ” bevat dus 9 tekens: een aanhalingsteken, de lettervolgorde “abc”, een tabulator, de lettervolgorde “xyz” en nog een aanhalingsteken.
Het afsluitende aanhalingsteken van een stringconstante moet voor het eind van de regel staan.
Langere strings kunnen gevormd worden doordat twee stringconstanten, steeds tussen aanhalingstekens, achter elkaar in de brontekst staan. Tussen de deelstrings mogen willekeurige spaties staan, ook regeldoorschuivingen.
31
“abc” “xyz” wordt door de C2- compiler gekoppeld tot “abcxyz” 5.6.5 Definitie van benoemde constanten Benoemde constanten worden steeds globaal op moduleniveau gedefinieerd. Ze staan na de definitie via de aanduiding van het modulekenmerk in het hele programma ter beschikking (vergelijk globale variabelen). Locale constanten van threads en functies zijn er niet. De definitie van een benoemde constante begint met het codewoord const. Aansluitend volgen het kenmerk, een toewijzingsoperator alsmede een constante term en afsluitend een puntkomma. const
Name = constante term;
Voorbeeld: const. A = 1000; const. B = A + 100000; const. C = 17.4; Het datatype van een constante wordt door de compiler automatisch bepaald. Het maximaal benodigde type wordt gebruikt. Voor A in het voorbeeld hierboven is maximaal een int – datatype nodig, voor B echter een long, en C kan alleen weergegeven door een float – type. B en C worden door de compiler in het constantengeheugen van de C-Control II unit aangelegd, waar ze een vast adres hebben. Speciale operatiecodes van de virtuele machine van de C-Control II unit laden benoemde en onbenoemde byteen integerconstanten, zoals hierboven A, altijd rechtstreeks, d.w.z. ingebed in de operatiecode. Voor A wordt daarom geen plaats in het constantengeheugen belegd. Naast numerieke constanten kunnen ook stringconstanten benoemd worden. In plaats van de constante numerieke term moet dan een tekenketen tussen aanhalingstekens na de toewijzingsoperator staan. const Name = “Text”; Voorbeeld: const GREETINGS = “Hallo C2” const TABLEHEAD = “Nummer\ttijd\twaarde”; Stringconstanten nemen in het constantengeheugen van de C-Control II unit slechts zoveel bytes in beslag als ze tekens bevatten, met daarnaast nog een byte voor het opslaan van de stringlengte. In tegenstelling tot de string – variabelen kunnen stringconstanten ook meer dan 30 tekens bevatten. Ze worden echter bij stringoperaties tot maximaal 30 tekens gereduceerd. 5.6.6 Benoemde constante arrays Zowel van numerieke constanten als van stringconstanten kunnen benoemde ééndimensionale arrays aangelegd worden. In beide gevallen staat na het kenmerk een paar rechte haakjes [ ]. Na de toewijzingsoperator worden, steeds gescheiden door een komma, de aparte elementen opgesomd. De grootte van de array volgt automatisch uit de telling van de opgesomde elementen. Een array kan ook uit slechts één element bestaan. const Name [ ] = element1, element2, …; Voorbeeld: const const const const
CHARACTERS [ ] = ‘A’, ‘B’, ‘C’; TABLE1 [ ] = 0, 100, 10000, 1000000; TABLE2 [ ] = 0, 1.5, 3, 17; ONE [ ] = 1;
Arrays van numerieke waarden worden automatisch in het maximaal benodigde getalsformaat afgelegd. Dit volgt uit het element met het meest veeleisende datatype. Zo wordt TABLE1 in het voorbeeld hierboven een array van long – waarden (vanwege het element 1000000), TABLE2 wordt een float – array (vanwege het element 1.5). CHARACTERS en ONE zijn integer – arrays.
32
Net als arrays van numerieke constanten kunnen arrays van stringconstanten gedefinieerd worden: Voorbeeld: const
5.7
menu [ ] = “rice” , “couscous”, “potatoes” ;
Operators
5.7.1 Volgorde Operators delen numerieke termen op in deeltermen. Daarbij worden de operators in een van hun rang afhankelijke volgorde geëvolueerd en worden de deeltermen voor de loopduur van het programma na elkaar berekend (vergelijk de overeenkomst in de wiskunde “Meneer Van Dalen Wacht Op Antwoord = Machtsverheffen voor Vermenigvuldigen, Delen voor Worteltrekken, Optellen voor Aftrekken”). Voorbeeld: a = 10 + 4 * 2;
/ / a wordt 18
Termen met operators van dezelfde rang worden van links naar rechts berekend. Voorbeeld: a = 10 / 4 / 2; / / a wordt 1,25 Zoals uit de wiskunde bekend is, kan de rekenvolgorde beïnvloed worden door het plaatsen van haakjes. Voorbeeld: a = 10 / (4 / 2);
/ / a wordt 5
Haakjesniveaus kunnen theoretisch willekeurig diep in elkaar genest worden. In de regel gaat echter al vanaf de derde of vierde nesting elk overzicht over de weergegeven term verloren. Bovendien kunnen extreem diepe nestingen tot stackproblemen leiden (zie 4.4.6). Het programma werkt dan niet correct. Verdeel daarom de berekening van complexe termen indien mogelijk in meerdere opdrachten, en sla de tussenresultaten op in locale variabelen. Voeg de tussenresultaten na elkaar samen tot het eindresultaat. Ook als de volgorde het niet zou vereisen, kan het extra plaatsen van haakjes om deeltermen de leesbaarheid van de brontekst verhogen. Voorbeeld: (x > 10) & (x < 20) in plaats van x > 10
& x < 20
Rangvolgorde van de operators in C2:
Bij een paar symbolen bestaat naast een symbool een alternatieve codewoord – vorm, zo staan bijvoorbeeld % en mod voor de moduledeling. Kies zelf, aan welke vorm u de voorkeur geeft, het resultaat blijft hetzelfde.
33
5.7.2
Rekenkundige operators
Operator + * /
Betekenis Optellen Aftrekken Vermenigvuldigen Delen
%
Modulodeling (deelrest)
mod -
Negatief voorteken
Voorbeeldterm 1+1 2-1 2*3 6 / 3 18 / 4 18.0 / 4 18 mod 4 18 % 4 1.8 % 0.4 - (1+1)
Resultaat 2 1 6 2 4 4,5 2 2 0,2 -2
5.7.3 Bitschuif -operators Operator << shl
Betekenis Naar links schuiven
>>
Logisch naar rechts schuiven
shr
Voorbeeldterm 1 << 1 3 shl 2 1 >> 1 5 shr 2 -1 shr 1 (long) -1 shr 1
Resultaat 2 12 0 1 32767 2147483647
5.7.4 Vergelijkingsoperators Vergelijkingsoperators leveren de waarde –1, (minus 1, geen 1!), als de term waar is. Als de term niet waar is, wordt het resultaat van de vergelijking 0. De waarde –1 komt hexadecimaal overeen met de integere waarde 0xFFFF resp. met de long integer 0xFFFFFFFF. Operator ==
Betekenis Is gelijk?
!=
Is niet gelijk?
>
Is groter dan?
<
Is kleiner dan?
>=
Is groter dan of gelijk?
<=
Is kleiner dan of gelijk?
Voorbeeldterm 1 == 1 1 == 2 1 != 1 1 != 2 2 > 1 1 > 2 2 < 1 1 < 2 2 >= 1 1 >= 1 1 >= 2 2 <= 1 1 <= 1 1 <= 2
Resultaat -1 0 0 -1 -1 0 0 -1 -1 -1 0 0 -1 -1
5.7.5 Logische operators en bitmanipulaties In C2 zijn logische koppelingen altijd bitoperaties. Er wordt niet zoals bijvoorbeeld in C/C++ een verschil gemaakt tussen Bit-AND en logisch AND. Operator ! not
Operator & and
Betekenis Niet (bit – invertering)
Betekenis en
Voorbeeldterm !1 not 0 not 2.5 not 2.0 ! (2 < 1) ! (1 < 2)
Resultaat -2 -1 -0 -3 -1 0
Voorbeeldterm 1&1 1 en 0
Resultaat 1 0
34
!&
nand
|
or
en met aansluitende bit invertering
Of
!|
nor
of met aansluitende bit invertering
^
xor
exclusief - of
14 & 3 (1<2) & (2<3) (1<2) & (3<2) 1 !& 1 1 nand 0 14 !& 3 (1<2) !& (2<3) (1<2) !& (3<2) 1 | 1 1 or 0 0 or 0 14 or 1 (1<2) | (2<3) (1<2) | (3<2) (2<1) | (3<2) 1 !| 1 1 nor 0 0 nor 0 14 nor 1 (1<2) !| (2<3) (1<2) !| (3<2) (2<1) !| (3<2) 1 ^ 1 1 xor 0 0 xor 0 14 ^ 3 (1<2) ^ (2<3) (1<2) | (3<2) (2<1) | (3<2)
2 -1 0 -2 -1 -3 0 -1 1 1 0 15 -1 -1 0 -2 -2 -1 -16 0 0 -1 0 1 0 3 0 -1 -1
Logische operaties met float – operandi vormen een bijzonderheid. Hier vindt voor de logische koppeling een automatische convertering in een integere waarde 0 of –1 plaats: de float – waarde 0.0 wordt integer 0, alle waarden niet gelijk aan 0.0 worden –1. Dit geldt echter niet voor constante float – termen, die geen echte “zwevende” kommawaarde hebben, b.v. 2.0, omdat die door de compiler als int – of long – constanten beschouwd worden. Voorbeeld: float x; int result; x = 2; result = not x; result = not 2.0;
/ / result wordt 0 / / result wordt –3
5.7.6 Stringkoppeling met de operator Bij toewijzingen aan stringvariabelen kan aan de rechterkant van de toewijzingsoperator een gekoppelde stringterm staan. In de koppeling worden deelstrings tot één resultaat samengevoegd. De deelstrings zijn steeds door een + - operator van elkaar gescheiden. Als een aparte deelstring kan staan:
•
• • • • •
een kenmerk van een string -variabele een geïndiceerd kenmerk van een variabele string -array een kenmerk van een string –constante een geïndiceerd kenmerk van een constante string – array een onbenoemde string – constante een numerieke term
Numerieke termen in de string – koppeling moeten tussen haakjes staan, als ze zelf operators bevatten. Een numerieke term wordt geïnterpreteerd als ASCII – code van een teken en als zodanig in de resultaat – string ingepakt. Eventueel vindt er een reducering van de waarde plaats tot het bereik van 0 … 255. Koppelingen worden automatisch gelimiteerd tot 30 tekens. Voorbeeld voor een string – koppeling met +:
35
const S = “AAA” const SA [ ] = “XXXX”, “YYYY”, “ZZZZ”; string s1; string sa [3]; string s; s1 = “bbb” sa[0] = “uuu” sa[1] = “vvv” sa[2] = “www” / / Stringtoewijzing met koppeling: s = s1 + sa[2] + s + SA[0] + “ccc” + (‘A’ + 3); Na deze opdracht bevat s de tekst “bbbwwwAAAXXXXcccD”. 5.8 Functies De virtuele machine van de C-Control II unit ondersteunt de programmering met subfuncties. Blokken van opdrachten, die in het programma meerdere keren gebruikt worden, kunnen in functies samengevat worden. Bij het oproepen van een functie kunnen parameters doorgegeven worden. De functie zelf kan een rekenresultaat teruggeven. In C2 is er geen scheiding tussen declaratie en definitie van een functie. Als een functie eenmaal in een module geschreven is, kan deze verderop in deze module en alle volgende modules van het project gebruikt, dus opgeroepen worden. De brontekst van een functie bestaat uit de functiekop en een opdrachtblok. function fx ( ) { / / . . . opdrachten } 5.8.1 Functiekop De functiekop begint met het codewoord function. Aansluitend volgen de functienaam (kenmerk) en tussen ronde haakjes de lijst van de formele parameters. Als optie kan dan nog na het codewoord returns een resultaat – type gespecificeerd worden. Function name (type1 name1, . . .) returns type Functies in C2 kunnen alleen numerieke resultaten teruggeven, dus de data – types byte, int, long en float. Het teruggeven van strings, arrays of samengestelde types is niet mogelijk. function fx ( ) returns byte / / OK function fx ( ) returns int
/ / OK
function fx ( ) returns long / / OK function fx ( ) returns float / / OK function fx ( ) returns string / / Fault! function fx ( ) returns Mytype
/ / Fault!
In de lijst van de formele parameters worden types en namen van de bij het oproepen door te geven data gespecificeerd. Meerdere parameters worden steeds door een komma van elkaar gescheiden. Als een functie geen parameters bevat, dan staan er na de functienaam alleen de openende en sluitende ronde haakjes. Als parameters kunnen numerieke data, strings of data met samengesteld type doorgegeven worden. Ook arrays zijn mogelijk. Bij de overdracht van arrays vindt er geen aanduiding van de grootte plaats in de rechthoekige haakjes na de parameternamen.
36
Voorbeelden: * Functie met een integer - parameter en een integer - resultaat: function fx ( int x ) returns int * Functie met een string -parameter function fx ( string s ) * Functie met een long – array en een integere parameter function fx ( long a[ ], int i ) * Functie met een gebruiker – gedefinieerde MyType – parameter function fx ( Mytype t ) 5.8.2 Parameters en locale variabelen In het opdrachtblok van een functie kunnen locale variabelen gedefinieerd worden (zie 5.5.5). De in de functiekop gedefinieerde parameters kunnen net als parameters gebruikt worden. Numerieke parameters (byte … float) zijn echte locale variabelen van de functie. Ze worden bij het oproepen van de functie op de stack van de actuele thread opgeslagen en met de overgedragen waarde gedefinieerd. Variabele strings, arrays en parameters met gebruiker – gedefinieerd datatype daarentegen worden automatisch als referentie doorgegeven. Manipulaties aan referentieparameters hebben effect op het data – object waaraan gerefereerd wordt. Voorbeeld: function fx ( string s ) { s = “abc”; } thread main { string local_s;
}
local_s = “123”; fx(local_s);
/ / local_s wordt “abc”
In tegenstelling tot numerieke parameters: function fx ( int ) { i = 0; } thread main { int local_i; local_i = 1; fx(local_i);
/ / local_i blijft 1
5.8.3 Einde van een functie en antwoord van het resultaat Een functie eindigt automatisch, als de programma – uitvoering bij de sluitende accolades van het opdrachtblok komt. Een functie met antwoord -waarde levert dan het resultaat 0.
37
Voorbeeld: functie fx ( ) returns int { } thread main { int i; i = 1; i = fx ( ); / / 1 wordt 0. } Met de return – opdracht kan een opdracht voortijdig beëindigd worden en de waarde van een numerieke term kan als resultaat teruggegeven worden. return; return numerieke term; De eerste vorm mag alleen voor functies zonder gedefinieerd antwoord – type gebruikt worden. De tweede vorm met numerieke term is gereserveerd voor functies met gedefinieerd Antwoord- type. Voorbeeld: functie fx ( int param ) returns int { return param * param + 100; 5.8.4 Oproepen Het oproepen van een functie gebeurt door aanduiding van het kenmerk ervan, gevolgd door een openend en sluitend rond haakje. Als er in de kop van de functie formele parameters gedefinieerd zijn, dan moeten er bij het oproepen van de functie binnen de ronde haakjes exact evenveel parameters opgesomd worden, steeds gescheiden door een komma. Voorbeeld: functie (fx) ( int a, int b ) / / twee parameters { // ... } fx (); / / Fault! fx (17); / / Fault! fx (19, 4); / / OK Oproepen van functies, die een antwoordwaarde leveren, kunnen toegepast worden in numerieke termen, maar ook als aparte opdracht. Oproepen van functies zonder antwoord – waarde mogen uitsluitend als aparte opdracht staan. Voorbeeld: function get_something () returns int { //... } function do_something () { //... } get_something(); do_something (); int a; a = get_something(); a = do_something();
/ / OK, antwoord – waarde genegeerd / / OK / / OK / / Fault!
38
5.8.5 Typetest De C2 – compiler voert bij elke oproep van een functie een test uit, of naast het aantal parameters ook het desbetreffende type overeenkomt met de functiedefinitie. Een kenmerk van een string – variabele kan bijvoorbeeld niet doorgegeven worden, als er volgens de definitie op deze plaats een numerieke term verwacht wordt. De volgende type –comptabiliteitsregels gelden: Type van de formele parameter in de functiekop byte, int, long, float byte [ ] int [ ] long [ ] float [ ] String
string [ ] samengesteld type, b.v. MyType MyType [ ]
Toelaatbare actuele parameters bij het oproepen van een functie Willekeurige numerieke term Kenmerk van een byte – array - variabele *) Kenmerk van een string – variabele Geïndiceerd kenmerk van een string – array - variabele Kenmerk van een int – array - variabele *) Kenmerk van een long - array - variabele *) Kenmerk van een float - array - variabele *) Onbenoemde string – constante Kenmerk van een string – variabele Geïndiceerd kenmerk van een string – array - variabele Kenmerk van een string – constante Geïndiceerd kenmerk van een string – arrayconstante Kenmerk van een string – array - variabele *) Kenmerk van een MyType – variabele Geïndiceerd kenmerk van een MyType – array - variabele Kenmerk van een MyType – array - variabele *)
*) Verwijzingen naar constante arrays mogen niet aan functies doorgegeven worden. 5.8.6 Recursie Een functie kan zich theoretisch ook zelf oproepen. Dat wordt aangeduid als recursie. Sommige wiskundige benaderingen berusten op recursieve algoritmen met afbreekbeperkingen. C2 verbiedt recursieve functie –oproepen niet uitdrukkelijk, maar ze dienen echter vermeden te worden. Recursies leiden vanaf een bepaalde diepte steeds tot overschrijding van het stackbereik dat voor een thread gereserveerd is. Dan worden data van andere threads ongewild overschreven. Dit kan leiden tot locale fouten tot zelfs het totaal crashen van het gehele systeem van de C-Control II unit! 5.8.7 Inline – functies en –opdrachten De bibliotheekmodules voor de toegang tot de bronnen van de C-Control II unit (b.v. hwcom.c2) gebruiken inline – functies en –opdrachten voor het rechtstreeks invoegen van virtuele machinecodes in de programma – brontekst. Er geldt dat inline –functies alleen inline –opdrachten mogen bevatten. In een inline –opdracht moet na het codewoord een constante term staan, die voor een operatiecode staat (zie 4.4.2). Alleen de C2 – systeemontwikkelaars hebben inline –functies en opdrachten nodig. Een uitvoerige documentatie van de aparte operatie – codes van de virtuele machine vormt geen onderdeel van de leveringsomvang van de C-Control II unit.
5.9 Threads 5.9.1 Definitie Threads worden op moduleniveau gedefinieerd en zijn na de definitie globaal zichtbaar. Er zijn geen geneste threads binnen threads en geen locale threads binnen subfuncties. De definitie van een thread begint met het codewoord thread. Dan volgen het kenmerk en een opdrachtblok tussen accolades. thread Name { / / opdrachten }
39
Binnen het opdrachtblok kunnen locale variabelen gedefinieerd worden, die quasi – statisch zijn (zie 5.5.5). De totale code van het opdrachtblok wordt automatisch in een eindeloze lus uitgevoerd. Voorbeeld: Thread blink2 { ports.set (2, -1); sleep 200; ports.set (2,0); sleep 800; } 5.9.2 Main threads Een thread, waarvan het kenmerk niet “main” is, heeft bij de start van het programma de prioriteit 0, d.w.z. hij bevindt zich in stilstand, zijn opdrachten worden niet uitgevoerd. Elke module kan een main - thread bevatten, dus een thread met het kenmerk “main”. Deze heeft bij de start van het programma de standaardprioriteit 32. De opdrachten ervan worden van begin af aan uitgevoerd. Het is de opgave van de main – thread initialiserigen uit te voeren en wanneer nodig andere threads te starten. Een programma dient minimaal een module met een main – thread te hebben. Anders staat het hele programma stil en wacht eindeloos op het run – commando (zie 5.9.3). 5.9.3 Prioriteitssturing De virtuele machine van de C-Control II unit stelt elke thread zoveel rekencapaciteit ter beschikking als overeenkomt met zijn prioriteitswaarde. Een thread met prioriteit 32 kan exact 32 virtuele machine – operaties achter elkaar uitvoeren, tot hij onderbroken wordt door het systeem en de volgende thread aan de beurt is. Ter oriëntering: de opdracht a = b + c; wordt in vier virtuele machine – operaties uitgevoerd, als a, b en c van hetzelfde datatype zijn: 1. b op de stack laden 2. c op de stack laden 3. optellen 4. resultaat in a opslaan Complexere opdrachten zijn dienovereenkomstig omvangrijker. Het systeem kan een thread in ieder geval ook binnen een opdracht onderbreken, b.v. voor de optelling in het bovenstaande voorbeeld. Omdat elke thread met zijn eigen stack werkt, ontstaan daarbij geen problemen. Voor het veranderen van de prioriteit van een thread bestaan er in C2 verschillende codewoorden.
•
run
Het codewoord run wordt in twee vormen toegepast. Vorm 1 stelt de prioriteit van de aangegeven thread op de standaardwaarde 32. Deze vorm is er in de regel voor bedoeld om van main threads uit andere threads te starten. Vorm 2 stelt de prioriteit van de op dat moment uitgevoerde thread op het resultaat van de aangegeven numerieke term. Vorm 1:
run ThreadName;
Bijvoorbeeld: run blink2; Vorm 2:
run numerieke opdracht;
Voorbeeld: run 100; Let er op dat een stilstaande thread met prioriteit 0 zich nooit met run zelf kan starten!
40
•
halt
De halt – opdracht zet de prioriteit van een thread op 0. Er zijn twee vormen. Met vorm 1 kan een willekeurige thread een andere thread of ook zichzelf laten stoppen. Vorm 2 heeft altijd betrekking op de op dat moment uitgevoerde thread. Vorm 1:
halt ThreadName;
Voorbeeld: halt blink2; Vorm 2: halt; Stopgezette threads kunnen alleen door andere threads weer gestart worden.
•
resume
De resume – opdracht zet de prioriteit van een thread op de waarde voor de laatste run- of halt- opdracht met betrekking tot deze thread. Er zijn eveneens twee vormen. De eerste vorm heeft betrekking op de aangegeven thread, vorm 2 op de actueel lopende thread. Vorm 1:
resume ThreadName; Voorbeeld: halt blink2; / / blink2 staat resume blink2; / / blink2 loopt weer zoals voor hij gestopt werd Vorm 2: resume; Voorbeeld: run 100; resume;
•
/ / actuele thread loopt met prioriteit 100 / / actuele thread loopt weer als voor run 100
yield
Met de uitvoering van de yield – opdracht geeft de actuele thread de uitvoering van het programma, onafhankelijk van zijn prioriteit, direct af aan de volgende thread. yield; Het yield – commando is zelden nodig. 5.9.4 Wachten op gebeurtenissen In bepaalde situaties moet een thread wachten op het plaatsvinden van een gebeurtenis en in de wachtfase zo min mogelijk rekencapaciteit bezetten. Daarvoor dient in C 2 de wait – opdracht. De wait – opdracht controleert de waarde van een aangegeven numerieke term. Als de waarde gelijk aan 0 is, dan geeft de actuele thread de uitvoering van het programma, onafhankelijk van zijn prioriteit, direct over aan de volgende thread (vergelijk yield). Daardoor wordt vermeden, dat threads met hoge prioriteit wachtend het systeem blokkeren. Een thread herhaalt de wait – opdracht net zo lang, tot de numerieke waarde ongelijk 0 wordt. wait numerieke term; Voorbeeld: wait ports.get (3) ; / / wacht op high level op port3
41
5.9.5 Pauzes Bij vele toepassingen is het nodig dat een thread zijn uitvoering gedurende een bepaalde tijd onderbreekt en daarna automatisch doorloopt. Daartoe vindt u in C2 de sleep – opdracht. Na het codewoord sleep volgt een numerieke term. sleep numerieke term; Voorbeeld: sleep 1000; De berekende waarde van de numerieke term bepaalt de rustpauze van de actuele thread in milliseconden. De waarde van de term blijft beperkt tot het int – bereik. Eventueel voert de virtuele machine een conversie uit. Negatieve pauzewaarden van –1 tot –32768 worden als waarden van 65535 tot 32768 geïnterpreteerd (twee-complement). De controle, of een pauze beëindigd is, vindt plaats bij elke cyclus waarin de thread rekentijd krijgt. Bij een toepassing met zeer vele threads, die met hoge prioriteit lange omlooptijden tot gevolg hebben, kan de daadwerkelijke pauze daarom iets langer dan oorspronkelijk gespecificeerd worden. Als de pauze nog niet voorbij is, geeft de actuele thread de uitvoering van het programma direct door aan de volgende thread (vergelijk yield). 5.9.6 Synchronisatie In computersystemen met parallelle processen kunnen zich de volgende problemen voordoen: • Aliasing van geheugentoegang • Concurrentie van meerdere processen om een resource Concurrentie om een resource ontstaat bijvoorbeeld, als twee threads gelijktijdig data via dezelfde seriële interface willen versturen. De seriële interface kan echter slechts één uitgangsbuffer op hetzelfde tijdstip bedienen. Als gevolg kan slechts één thread gelijktijdig zenden. De tweede thread moet wachten, tot de resource vrij is. Als uitleg van het aliasing – probleem het volgende voorbeeld: een thread vraagt cyclisch twee meetkanalen op en slaat deze op in twee globale variabelen. Een parallelle thread leest deze globale variabelen en moet telkens beide waarden uit een meetcyclus naar een controlefunctie doorvoeren. Float a, b;
/ / Meetwaarden
thread measure {
}
a = get_channel_a(); b = get_channel_b(); //...
thread watch {
}
check(a, b); //...
Zoals u al in 5.9.3 gezien heeft, wordt een C2 – opdracht uitgevoerd in meerdere aparte operaties van de virtuele machine. De opdracht check (a, b) leidt ongeveer tot de volgende commando – keten: 1. a) op de stack laden 2. b) op de stack laden 3. functie check oproepen Zoals in 5.9.3 eveneens uitgelegd is, kan deze commando – keten op elk moment door een wisseling van thread onderbroken worden, dus ook tussen het eerste en tweede commando in het bovenstaande
42
voorbeeld. Dan kan de measure – thread al nieuwe waarden geregistreerd hebben, voor de watch – thread weer aan de beurt komt. De watch – thread gaat door met zijn uitvoering met het laden van a en b en het oproepen van check. Aan de functie check wordt nu dus een a uit een oude en b uit de nieuwe meetcyclus doorgegeven. Afhankelijk van wat check concreet van a en b verwacht, dan dit tot een ernstige fout in het functioneren van het programma leiden! In het ongunstigste geval loopt een programma met een potentieel aliasing – probleem in de testfase volledig zonder problemen, als de aliasing – voorwaarde meer zeer zelden optreedt. Om aliasing- en concurrentiesituaties te vermijden, moeten threads op bepaalde plaatsen gesynchroniseerd worden, d.w.z. alle threads moeten gedwongen worden voor de verdere bewerking van het programma te wachten op een soort “vrij” teken. Bij beschikbaarheid van het “vrij” teken moet de wachtende thread onmiddellijk een “bezet” signaleren, om concurrerende threads tot wachten te dwingen. Als een thread het kritische programmabereik doorlopen heeft, moet hij het “bezet” terugnemen en het “vrij” teken signaleren. Anders zouden de op het “vrij” teken wachtende threads voor altijd geblokkeerd zijn. Als de problematiek precies bekeken wordt, dan wordt het duidelijk dat de actie “testen op “vrij” teken, zo ja, bezetten” atomair moet zijn, d.w.z. niet door een thread – wissel mag worden onderbroken. Een wait – opdracht met daarop volgend wissen van een “vrij” – variabele voldoet niet aan deze voorwaarde! Voorbeeld: wait free; free = 0;
/ / 2 virtuele machine – operaties / / 2 virtuele machine – operaties
bestaat uit 4 virtuele machine – operaties. Aangenomen dat een thread hier het “vrij” teken krijgt, dan vindt hier een thread -wissel plaats, voordat hij free op 0 kan zetten. Een tweede thread, die eveneens op dit vrijteken wacht, krijgt nu rekentijd. Het signaal staat nog op “vrij”, hoewel een andere thread al het kritische bereik betreden heeft! Om het synchronisatieprobleem op te lossen, stelt de virtuele machine de C-Control II unit een atomaire machine – operatie ter beschikking, waar in de C2 via het codewoord capture toegang mee gekregen kan worden. De capture – opdracht bestaat in een expliciete en een impliciete vorm. De expliciete vorm verwacht de aanduiding van een kenmerk van een globale (!) byte – variabele. Voorbeeld: byte flag; thread tx { capture flag; // ... }
/ / explicit: capture the flag
Bij het uitvoeren van de capture – opdracht test de actuele thread, of de waarde van de variabele 0 is (= “vrij” teken). Indien dat het geval is, schrijft de thread zijn eigen nummer (waarde 1 … 255) in de variabele en onthoudt het adres van de byte – variabele. Zoals al eerder genoemd, deze procedure verloopt atomair, in één enkele operatie van de virtuele machine. De impliciete vorm luidt: capture; zonder verdere aanduidingen. De impliciete vorm kan alleen gebruikt worden binnen de opdrachtblokken van functies, niet in die van threads. De impliciete vorm gebruikt globale byte – variabelen, die door de C2-compliter automatisch aangelegd worden. Bij elke functie bestaat een dergelijke variabele. Het zetten van het “vrij” signaal vindt plaats door het codewoord release. Omdat een thread onthoudt welke byte - variabele hij bezet heeft, staat de release opdracht zonder verdere aanduidingen. release; Een thread moet release onmiddellijk oproepen, als hij het gesynchroniseerde bereik verlaat. Andere, voor capture wachtende threads worden anders onnodig geblokkeerd.
43
Een thread mag nooit twee capture – opdrachten uitvoeren zonder tussentijdse release. De C2 – compiler kan dat niet controleren. Bij veronachtzaming leidt dat tot blokkades in het programma. Voorbeeld:
byte flag1; byte flag2; thread tx { e capture flag1; / / blokkade in de 2 doorloop capture flag2; / / flag1 wordt “vergeten”
//... release; }
/ / alleen flag2 wordt vrijgegeven
De thread tx in het bovenstaande voorbeeld loopt net als elke thread automatisch in een eindeloze lus. Bij de tweede doorloop van de lus blokkeert hij, omdat flag1 nog op “bezet” staat. Afsluitend: een voorbeeld van zowel het gebruik van de expliciete als van de impliciete capture vorm: 1) Vermijden van aliasing bij toegang tot geheugens door expliciete capture float a, b; byte flag;
/ / meetwaarden / / synchronisatie – variabele
thread measure { capture flag; a = get_channel_a (); b = get_channel_b (); release; //... } thread watch { capture flag ; check (a, b) ; release ; //... } 2. Synchronisatie van toegang tot resources door impliciete capture in een functie function send ( bytre buf [ ] , int length ) { capture ; wait resource.ready () ; resource.send (buf, length) ; release ; } In het voorbeeld wordt hier een module resource aangenomen, waarvan de functies zelf nog niet gesynchroniseerd zijn. Alle bibliotheekmodules voor de toegang tot systeemresources van de C-Control II unit bevatten reeds de benodigde synchronisatie (zie b.v. module hwcom.c2).
44
5.10 Opdrachten voor de sturing van het verloop Een onontbeerlijk deel van een gestructureerde programmeertaal zijn opdrachten voor de sturing van de programmastroom. Pas daardoor kunnen er algoritmes gerealiseerd worden, die boven de simpele rekenkundige koppeling van waarden uitstijgen. 5.10.1 if … else … - bepaalde uitvoering Met de if – opdracht wordt de afwerking van programmahoofdstukken gekoppeld aan een voorwaarde. Na het codewoord if volgt een numerieke term en daarna een opdracht of een opdrachtblok. if term opdracht; if term { //... } De opdracht resp. het opdrachtblok worden alleen uitgevoerd, als het resultaat van de numerieke term voor de duur van het programma niet gelijk is aan nul. Voorbeeld: x = 123; if x fx () ; if x – 123 fx () ;
/ / fx wordt opgeroepen / / fx wordt niet opgeroepen
Via het codewoord else kan een alternatieve opdracht (of een blok) aangegeven worden, die uitgevoerd wordt als de waarde van de term gelijk is aan 0. if term opdracht; else alternatieve opdracht; Voorbeeld: x = 123; if x – 123
/ / is 0
fx1 ( ) ; else fx2( ) ;
/ / fx2 wordt opgeroepen
5.10.2 Loop – eindeloze lus Programmalussen maken het herhaald oproepen van opdrachten mogelijk. De simpelste vorm is de onvoorwaardelijke eindeloze lus. Daarvoor kan in C2 het codewoord loop gebruikt worden. Na dit codewoord staat een enkele opdracht of een opdrachtblok. loop opdracht; loop { //... } 5.10.3 While – lus De while – lus herhaalt een opdracht op een opdrachtblok, zo lang de berekende waarde van een numerieke voorwaarde -term niet gelijk is aan 0. Het controleren van de voorwaarde vindt plaats voor elke doorloop van de lus. Na het codewoord while volgt een numerieke term en daarna de opdracht resp. het opdrachtblok.
45
while term opdracht; while term { //... } 5.10.4 Do – lus De do – lus herhaalt een opdracht of een opdrachtblok, zolang de berekende waarde van een numerieke voorwaarde – term niet gelijk is aan 0. Het controleren van de voorwaarde vindt na elke doorloop van de lus plaats. De opdracht van de lus wordt dus minimaal één keer uitgevoerd. Na het codewoord do volgt de opdracht resp. het opdrachtblok, daarna het codewoord while en afsluitend de numerieke voorwaarde – term. do opdracht while term; do { //... while term; 5.10.5 for – lus De for – lus voert een opdracht of een opdrachtblok net zo lang uit, tot een lusvariabele niet meer aan een vergelijkingsvoorwaarde voldoet. for variabele = waarde . . . Operator eindwaarde step waarde opdracht; for variabele = waarde . . . Operator eindwaarde step waarde { //... } Na het codewoord for wordt de luswaarde met een startwaarde geïnitialiseerd (variabele = waarde). Dan volgt het “…”- symbool. Als variabele staat er dan een vergelijkingsoperator (operator: <, >, <= of >=). Als de operator niet aangegeven wordt, gaat de C2 – compiler uit van een “kleiner dan of gelijk” – voorwaarde (<=). Voor elke doorloop wordt de lusvariabele vergeleken met een eindwaarde. Als optie kan met het codewoord step een stapbreedte aangegeven worden. Zonder deze aanduiding bedraagt de stapbreedte constant 1. Na elke aparte doorloop wordt de stapbreedte – waarde opgeteld bij de lusvariabele. Voorbeelden: for i = 0 . . . 10 { //... }
/ / 11 doorlopen
for i = 0 . . . < 10 { //... }
/ / 10 doorlopen
for i = 9 . . . >=0 step -1 { //... }
/ / 10 doorlopen terug (van achteren naar voren)
5.10.6 Voortijdig afbreken Als een loop-, while-, do- of for – lus met een opdrachtblok gebruikt wordt, kan het gewenst zijn de lus onder bepaalde speciale voorwaarden voortijdig af te breken – dus zonder eventuele verdere opdrachten van het blok uit te voeren en zonder de lus – afbreekvoorwaarde nogmaals te controleren. Daarvoor kan de break – opdracht gebruikt worden.
46
break; Voorbeeld: for i = 0 . . . 9999 { if bad ( ) break; //... } 5.10.7 Voortijdige voortzetting Als een loop-, while-, do- of for – lus met een opdrachtblok gebruikt wordt, kan het gewenst zijn de lus onder bepaalde speciale voorwaarden voortijdig met de volgende doorloop voort te zetten, zonder eventuele verdere opdrachten van het blok uit te voeren. continue; Voorbeeld: for i = 0 . . . 9999 { if not (i mod 13) continue; }
//...
In het bovenstaande voorbeeld voeren alle i, die zonder restgetal deelbaar zijn door 13, tot het weglaten van de opdrachten die vanaf / / zouden volgen. 5.10.8 Einde programma De totale programmabewerking van de virtuele machine kan beëindigd worden door de quit – opdracht. Daartoe moet na het quit – codewoord een numerieke term staan, waarvan de berekende waarde niet gelijk aan 0 is. Met deze waarde keert het systeem terug naar de host – mode (zie 4.3). In de host – mode zou bijvoorbeeld een nieuw programma van een aangesloten computer overgebracht en dan gestart kunnen worden. Als quit met de parameter –1 of 255 opgeroepen wordt, voert het systeem een software – reset van de microcontroller uit. quit term; Voorbeeld: quit 63; quit -1;
/ / terug naar de host – mode / / software – reset
6 Software - ontwikkeling 6.1 Installatie en start van de geïntegreerde ontwikkelingsomgeving Met de C-Control II unit heeft u een utility – CD ontvangen. Op deze CD bevindt zich o.a. de geïntegreerde ontwikkelingsomgeving, die u nodig heeft voor de programmering van de unit. De geïntegreerde ontwikkelingsomgeving draait onder de 32bit – bedrijfssystemen Microsoft Windows95/ 98/NT/2000. Voor de installatie legt u de CD in de CD – drive van uw PC. Als voor de CD – drive de autostart – mode geactiveerd is (dat is de standaardinstelling), dan wordt er na het inleggen van de CD een openingsbeeldscherm geopend. Volg svp de aanwijzingen van dit begroetingsbeeldscherm. Als u voor uw CD – drive de autostart – mode gedeactiveerd heeft, laad dan svp het bestand start.htm uit het rootsbestand van de CD in uw actuele internet -browser. Als u nog geen internet – browser geïnstalleerd heeft, lees dan svp het bestand browser.txt in het rootsregister van de CD.
47
Na de succesvolle installatie van de geïntegreerde ontwikkelingsomgeving kunt u deze starten vanuit uw Windows – startmenu. Het gebruikersoppervlak van de geïntegreerde ontwikkelingsomgeving komt overeen met de actuele standaards en kan intuïtief bediend worden. U kunt details vinden in de Online – Help, die u door op de [F1]- toets kunt oproepen. 6.2 Brontekst bewerken In de editor van de geïntegreerde ontwikkelingsomgeving voert u de brontekst van de aparte module in. Door de zogenoemde Syntax Highlighting worden de verschillende syntax – elementen in verschillende instelbare kleuren en schrijfstijlen getoond. Daardoor wordt de leesbaarheid van de programma’s op het beeldscherm en bij het uitprinten verhoogd. Bovendien kunnen eenvoudige schrijffouten makkelijk onderkend worden. De editor beschikt over de gebruikelijke functies voor het laden en opslaan van bestanden, zoeken en vervangen van tekstpassages alsmede over Undo en Redo voor veranderingen in de brontekst. Verdere gereedschappen ter ondersteuning van uw werk zijn de automatische completering van kenmerken tijdens het invoeren, context – sensitieve hulp bij C2 – codewoorden en module – overstijgend zoeken naar de definitie van C2 – kenmerken in het actuele project. De exacte beschrijvingen daartoe vindt u in de Online – Help van de geintegreerde ontwikkelingsomgeving (toets [F1]). 6.3
Richtlijnen voor de formattering van de brontekst
6.3.1 Voordelen van de uniforme formattering Voor de syntactische en functionele correctheid van een programma is de formattering van een brontekst zonder betekenis. In het belang van de overzichtelijkheid en de begrijpelijkheid moeten bronteksten echter ook “optisch” correct zijn. Een stijlvol en gedisciplineerd vormgegeven brontekst volgens uniforme richtlijnen is ook na langere tijd en ook voor andere programmeurs leesbaar en begrijpelijk. Geformatteerde bronteksten bevatten in de regel vanaf het begin al minder fouten. Als er fouten in staan, kan het zoeken en verhelpen daarvan in een nette brontekst eenvoudiger uitgevoerd worden. De onderstaande richtlijnen voor de vormgeving zijn basisvoorstellen. Het staat u vrij, de voorstellen te accepteren, te variëren of te verwerpen. Als u echter ondersteuning van Conrad Electronic wenst en daartoe bronteksten ter controle naar ons toestuurt, kunnen deze alleen bewerkt worden als ze herkenbaar overeenkomen met de hieronder opgevoerde richtlijnen. Bij twijfel kunt u zich oriënteren op de formattering van de standaardmodules en voorbeelden op de CD voor de C-Control II unit. 6.3.2 Commentaren 1. Een programma dient commentaren te bevatten, als dat leidt tot een wezenlijke verbetering van de begrijpelijkheid. 2. Een commentaar dient vermeden te worden, als de zin van opdrachten ook door zelfbeschrijvende kenmerken duidelijk kan worden. 3. Commentaren mogen niet triviaal zijn, b.v. x = 1; / / 1 aan x toewijzen 4. Einde regel – commentaren moeten op zijn minst voor opeenvolgingen van opdrachten, die niet door spaties gescheiden zijn, links uitgelijnd onder elkaar staan. 5. Een verklarend commentaar bij een opeenvolging van opdrachten staat in een eigen regel voor deze opdrachten, met dezelfde inspringing als deze opdrachten. 6. Commentaren zijn in één enkele taal opgemaakt, d.w.z. of helemaal in het Engels of helemaal in het Nederlands. Commentaren dienen in dezelfde taal als de kenmerken geformuleerd te worden. 6.3.3 Kenmerken 1. Kenmerken dienen zelfbeschrijvend te zijn. Afkortingen zijn mogelijk, zo lang de betekenis in de context zonder extra commentaren herkenbaar blijft. Bijvoorbeeld “get/MaxTemp” in plaats van “getMaximumTemperature” is toegestaan. Alleen primitieve functies, tijdelijke variabelen voor het opslaan van tussenresultaten, indicaties of lusvariabelen, mogen uit enkele letters of korte tekencombinaties bestaan. 2. Kenmerken van modules, threads, functies en variabelen beginnen met een kleine letter. 3. Kenmerken van samengestelde datatypes beginnen met een hoofdletter. 4. Kenmerken van constanten bestaan alleen uit hoofdletters, onderstrepen en cijfers. 5. Kenmerken van functies moeten zo veel mogelijk met een werkwoord of een gebruikelijke afkorting van een werkwoord beginnen (b.v. get, set, put, write, init, calc …). 6. In langere kenmerken moeten losse woorden door onderstrepen of aparte hoofdletters bij het wisselen van woorden gescheiden te worden, b.v. getMaxTemp of get_max_temp. U dient de eenmaal gekozen schrijfwijze aan te houden.
48
7. Kenmerken worden in één enkele taal geschreven, b.v. geheel in het Engels of geheel in het Nederlands. Kenmerken dienen in dezelfde taal geformuleerd te worden als de commentaren. 6.3.4 Termen Complexe numerieke termen dienen door het plaatsen van haakjes en spaties zo vorm gegeven te worden, dat deeltermen optisch herkenbaar zijn. 6.3.5 Functie – definities 1. De definitieregels worden door “/ / ----“ – commentaarregels in een frame geplaatst (zie standaardmodule – bronteksten). Tussen deze commentaren staat niets behalve de functiedefinitie. 2. Een definitieregel begint met een inspringing van twee spaties. 3. Rechts en links van de ronde haakjes staat een spatie, b.v. function fx ( int param ). Bij functies zonder parameters vervallen de spaties binnen de ronde haakjes, b.v. function ( ). 4. Bij functiedefinities met meerdere parameters staat na elke komma in de lijst van de formele parameters een spatie, b.v. function fx ( int a, int b, int c). 5. Als een definitie zich over meerdere regels uitstrekt, dan dient u de tweede en volgende regels links uitgelijnd onder het typen van de eerste parameter voort te zetten, b.v. //---------------------------------------------------------------function getMaxTemp ( int deviceID, int channel ) returns int //---------------------------------------------------------------6.3.6 Threads 1. De definitieregels zijn net als bij functies door “/ / ----“ – commentaarregels in een frame geplaatst. 2. Threads staan steeds aan het einde van een module – brontekst. 6.3.7 Opdrachtblokken 1. De definitie van locale variabelen is door een spatie gescheiden van de overige opdrachten. 2. Een afsluitende return – opdracht is door een spatie gescheiden van de voorafgaande opdrachten. 3. Langere opdrachtblokken dienen door extra spaties op geschikte wijze gestructureerd te worden. 4. Accolades staan steeds paarsgewijs onder elkaar. 5. Accolades staan steeds alleen in een regel. 6. Gekoppelde opdrachtblokken worden steeds met twee spaties ingesprongen, b.v. //---------------------------------------------------------------function getMaxTemp ( int channel ) returns int //---------------------------------------------------------------{ int i; int result; if channel == 13 { for i = 0 . . . <20 { //... } } }
return result;
6.3.8 Combinaties met codewoorden voor de besturing van het verloop 1. Losse opdrachten in combinatie met codewoorden voor de besturing van het verloop (if, else, lolop, while, do, for) staan in dezelfde regel als het codewoord of bij voorkeur met twee spaties ingesprongen in de volgende regel. 2. De accolades van opdrachtblokken na codewoorden voor de besturing van het verloop staan links uitgelijnd onder het codewoord. 3. Voor de codewoorden if, loop, while, do en for moet een spatie staan. De spatie kan vervallen, als het gaat om een gekoppelde constructie, en het codewoord ingesprongen direct volgt na een {- regel.
49
do fx() while not ready; do fx() while not ready; if x < LIMIT make_it(); else leave_it_alone(); while is_good() { for x = 0 … 9 { do_this(); do_that(); } } 6.4
Automatische compiler
Al tijdens de invoer van de brontekst loopt op de achtergrond de syntax –analyse en vertaling door de C2 – compiler. In het resultaat wordt direct in het editor –venster getoond of een programmaregel een fout vertoont (kruissymbool) of tot een uitvoerbare code leidt (puntsymbool). Het dienovereenkomstige symbool wordt voor de regel getoond. Lege regels of dergelijke, die niet direct tot een uitvoerbare code leiden, hebben geen symbool. Als uw invoer fouten bevat, worden er in het meldingsvenster concrete beschrijvingen van de fouten getoond. Nadat u alle module – bronteksten van een project volledig geschreven en alle syntax – fouten verholpen heeft, kan uw programma gesimuleerd worden of overgebracht worden naar de C-Control II unit. 6.5
Simulatie en debugging
6.5.1 Test en zoeken van fouten Nadat een programma qua syntax correct gecompileerd is, moet de functionele afwezigheid van fouten gecontroleerd worden. Het verdient geen aanbeveling de C-Control II unit te laden met een programma, waarvan de principiële functie niet in de simulator van de geïntegreerde ontwikkelingsomgeving getest is. Probeer zelf in te schatten welke gevolgen het foutief functioneren van een programma bij gebruik van uw applicatie kan hebben. Afgezien van de meest simpele toepassingen, zal een programma zelden meteen zo functioneren als het in detail gewenst is. Menig foutief functioneren is duidelijk en reproduceerbaar (“steeds als ik op de toets druk, dan …”). De oorzaak kan vaak makkelijk gevonden en verholpen worden. Moeilijker is het vinden van fouten, die alleen in de koppeling van meerdere, voor een deel zeldzame omstandigheden optreden. (“Wekenlang loopt het programma foutloos, dan …”). Een paar aanbevelingen voor het testen en het zoeken van fouten. • Er geldt het principe: alles dat niet getest is, zal vroeger of later fouten vertonen – geloof nooit, dat iets functioneert, maar testen en weten. • Test een programma niet pas als het volledig opgebouwd is. Zorg er eerst voor dat alle subprogramma’s (threads, functies) correct zijn, voeg de bestanddelen stukje bij beetje samen, en voer steeds weer tussentijdse tests uit. • “Voer” uw functies voor een test met alle mogelijke invoerdata, niet alleen met de voor uw toepassing “normale” waarden. Vroeger of later komt het tot “abnormale” situaties, waaraan u op dit moment misschien niet denkt. • Bouw in uw programma statusuitvoeren op het mini – LCD in, ook als uw toepassing het LCD niet nodig heeft, gebruik vrije digital ports voor de uitvoer van statussignalen. Bekijk het gedrag van uw programma aan de hand van de statusuitvoeren en –signalen. • Markeer fouten door het gericht becommentariëren van programmaregels. Gebruik breakpoints, stap voor -stap - functie en de controle en weergave van variabelen.
50
6.5.2 Simulatie – omvang De kern van de simulatie is dezelfde virtuele machine, die ook in het besturingssysteem van de C-Control II unit werkt. De uitvoering van alle geheugen -, besturings – en rekenoperaties is absoluut identiek. Daardoor kan de logische en algoritmische correctheid van een programma getest en gegarandeerd worden. Wat de simulator niet of niet volledig nabootst, zijn extern aangesloten systemen, zoals b.v. ICs op de 2 I C-bus of sensormodules. Bovendien komt de timing van de simulator niet overeen met die van de werkelijke unit. Dat betekent dat uit de uitvoeringstijd van bepaalde programmahoofdstukken op de PC kunnen geen conclusies getrokken worden met betrekking tot het tijdgedrag tijdens het gebruik van de CControl II unit. Daaruit volgt: De correcte functie van een programma in de simulatie is een noodzakelijk, echter geen toereikend criterium voor de foutloze werking van uw applicatie in real time en onder reële hardware – voorwaardes! In de simulator kan een programma in de stap voor stap – mode of in zijn geheel gestart worden. Daarbij kunt u in speciale uitvoervensters de toestanden van de belangrijkste hardware – resources (b.v. digital ports) bekijken. Bovendien kunt u de waarden van globale en locale variabelen laten tonen. 6.5.3 Bediening Aanwijzingen betreffende de bediening van de simulator vindt u in de Online - Hulp van de geïntegreerde ontwikkelingsomgeving.
6.6
Programma – overdracht naar de unit
Sluit de C-Control II unit aan op een seriële interface van uw PC. Gebruik daarvoor het meegeleverde nulmodem – en de SUB-D- adapterkabel. Als u geen application board of een andere tussenprintplaat gebruikt, steek dan de adapterkabel zo op de pins van X1, dat de rode ader van de vlakbandkabel naar de rand van de behuizing wijst:
Sluit de voedingsspanning aan op de unit en activeer de host - mode (zie hoofdstuk 4.3). Stel in de geïntegreerde ontwikkelingsomgeving de juiste interface in. Beëindig alle andere programma’s, die toegang hebben tot dezelfde seriële interface. Als u een C2 – project laadt of bewerkt, compileer dat dan en roep in de geïntegreerde ontwikkelingsomgeving het menu voor de overdracht van het programma op. Lees daartoe ook de Online – Hulp.
51
7
Standaardmodule
Dit programma geeft een overzicht van alle bibliotheekmodules voor de toegang tot de systeemresources van de C-Control II unit. Gespecificeerd zijn dat de modules: Bestand can.c2 constant.c2 hwcom.c2 i2c.c2 lcd.c2 lpt.c2 math.c2 mem.c2 plm.c2 ports.c2 str.c2 swcom.c2 system.c2 twb.c2 vmcodes.c2 7.1 can.c2 7.1.1
Inhoud CAN – bus algemene constanten e 1 seriële interface (hardware – interface) 2 I C – bus Mini – LCD van de unit Printerinterface via digitale ports van de unit Zwevende komma – aritmetica Bytebuffer – operaties Impulsbreedte –modulaties voor D/A -omvorming en uitvoer van het geluid Digitale ports en analoge ports (A/D) String – manipulatie e 2 seriële interface (software – interface) Timer, systeemklok, interrupt – omleiding Tweedraads bus Codeconstanten van de virtuele machine
Initialisering
Function init ( int speed, int globalMask, int specialMask ) Voor de data – overdracht op de CAN – bus moet het systeem geïnitialiseerd worden. De eerste parameter van de init - functie is bedoeld voor het vastleggen van de overdrachtsnelheid. De volgende snelheidswaarden worden ondersteund: Speed SPEED_50 (0) SPEED_62 (1) SPEED_125 (2) SPEED_250 (3) SPEED_500 (4)
Overdrachtsnelheid 50 kbit/s 62,5 kbit/s 125 kbit/s 250 kbit/s 500 kbit/s
Als u een ongeldige waarde voor speed invoert, wordt de overdrachtsnelheid op 125 kbits/s vastgezet. Voor de ontvangstfiltering van binnenkomende CAN – berichten moeten twee maskerwaarden, e globalMask en specialMask, gespecificeerd worden. globalMask geldt voor alle 15 kanalen, voor het 15 kanaal (channel 14) geldt bovendien het specialMask, dat door de microcontroller intern aan de globalMask UND- gekoppeld wordt. Het ontvangstmasker bepaalt, welke bits van de message – ID van een inkomend bericht met de ontvangst – ID van een CAN – kanaal vergeleken moeten worden, om te beslissen of een binnenkomend bericht voor dit kanaal bestemd en te ontvangen is. Een 0 – bit betekent “don’t care” (maakt niet uit), een 1-bit betekent “compare” (moet vergeleken worden). Voorbeeld, geldig voor alle kanalen 0 … 13: GlobalMask Ontvangst –ID Message – ID Ontvangst ja/nee
0x0000 maakt niet uit maakt niet uit ja
0x07FF 0x0120 0x0120 ja
0x7F 0x7FE 0x120 0x120 0x121 0x121 nee Ja
Als specialMask niet gelijk is aan globalMask, dan worden, vanwege de UND – koppeling, voor kanaal 14 minder bits vergeleken dan bij de kanalen 0 … 13. Kanaal 14 is dus klaar voor ontvangst van meer binnenkomende berichten. Men zou b.v. globalMask op 0x07FF kunnen zetten (= alle 11 ID-Bits) en
52
specialMask op 0x0000. Dan is elk kanaal 0 … 13 alleen belast met de ontvangst van precies één bericht, en kanaal 14 is een universele ontvanger. Voor verdere details betreffende de ontvangst van berichten zie ook vanaf 7.1.7. 7.1.2 Status opvragen voor een CAN - kanaal function ready ( int channel ) returns int De functie ready controleert, of een kanaal klaar is voor een nieuwe CAN – overdracht. channel 0 … 14 (channel 14 kan alleen ontvangen en is nooit klaar). Antwoord: -1 indien klaar, anders 0 7.1.3
Test op overdrachtsfouten
Function error ( ) returns int De functie error vraagt de geïntegreerde CAN – hardware van de C164CI naar de het laatst opgetreden fout. Een toewijzing van een fout aan een specifiek kanaal is niet mogelijk. Om de aparte foutcodes te begrijpen bevelen wij dringend aan een vakboek te lezen over het thema CAN – bus alsmede de systeemdocumentatie over de C164CI microcontroller. Antwoord:
. 7.1.4
Bericht zenden
function send ( int channel, int id, byte buff[ ], int length ) De functie send geeft bytes uit een bytebuffer door aan een CAN – uitvoerkanaal. channel0 … 13 id buf length
(channel 14 kan alleen ontv angen!) Message – ID van het bericht referentie aan bytebuffer – variabele bufferlengte, max. 8
7.1.5 Bericht publiceren function publish (int channel, int id, byte buf[ ], int length ) De functie publish geeft bytes uit een bytebuffer door aan een CAN – uitvoerkanaal en stelt de data ter beschikking voor “remote-request” – aanvragen van andere CAN – busdeelnemers. Dat betekent dat andere busdeelnemers onder vermelding van de passende message – ID de overdracht van de bufferdata aanvragen.
53
channel id buf length
0 … 13 (chann el 14 kan alleen ontvangen!) message – ID van het bericht referentie aan bytebuffer – variabele bufferlengte, max. 8
7.1.6 Tellen van de “remote – request” – aanvragen function rtrcount ( int channel ) returns byte De functie rtrcount levert na publicatie van een bericht een getalswaarde, hoe vaak dit bericht door andere busdeelnemers opgevraagd is. De teller is echter gelimiteerd op het waardebereik van een byte. Als een bericht vaker dan 253 keer opgevraagd wordt, dan blijft de tellerwaarde op 253 staan. channel 7.1.7
0 … 13 (channel 14 kan alleen ontvangen!) Instellen van de ontvangst – ID function expect ( int channel, int id )
Voor elk kanaal dat gebruikt moet worden voor het ontvangen van CAN – berichten, moet een ontvangst – ID ingesteld worden (zie ook 7.1.1). Als voor meerdere kanalen dezelfde ontvangstvoorwaardes gemaakt worden, resulterend uit het ontvangstmasker en de ontvangst – ID, dan wordt een inkomend bericht dat aan deze voorwaarden voldoet, in het laagste vrije kanaal opgeslagen. Een kanaal is vrij, als het laatste door dit kanaal ontvangen bericht met get uitgelezen is (zie 0). channel
0 … 14
id
ontvangst – ID van het kanaal
7.1.8 Zenden van een “remote – request” - aanvraag function request ( int channel ) Net zoals de C-Control II unit berichten kan publiceren (zie 7.1.5), kan de unit ook zelf een bericht opvragen, dat door een andere CAN- busdeelnemer gepubliceerd is. Het moet bekend zijn, onder welke message – ID dit bericht opgeroepen kan worden. Deze ID moet eerst per expect voor het kanaal channel als ontvangst – ID ingesteld zijn, anders kan het antwoord van de busdeelnemer niet ontvangen worden. 7.1.9 Test op ontvangst function rxd ( int channel ) returns int De functie rxd test, of een nieuw bericht op een ontvangstkanaal channel beschikbaar is. Als dat zo is, dan geeft hij als antwoord –1, anders 0. 7.1.10 Ontvangen data lezen function get ( int channel, byte buf[ ] ) returns int Data die op een kanaal channel automatisch of op verzoek ontvangen zijn, kunnen met get opgehaald en naar een buffervariabele overgebracht worden. De buffer moet plaats bieden voor 8 bytes. De functie levert als resultaat het aantal bytes, dat daadwerkelijk ontvangen is; geldige berichten kunnen ook uit 0 databytes bestaan. channel buf
0 … 14 referentie aan bytebuffer - variabele
54
7.2
hwcom.c2 en swcom.c2
De C-Control II unit beschikt over twee asynchrone seriële interfaces. Eén ervan is als hardware (hwcom) al in de microcontroller geïmplementeerd. De tweede interface (swcom) kan door het besturingssysteem softwarematig via twee interrupt – sensibele ports gekopieerd worden. De toegang tot beide interfaces in C2 is identiek. De hierna beschreven functies zijn in de modules hwcom.c2 en swcom.c2 op dezelfde manier gedefinieerd. 7.2.1 Initialisering function init () De functie init initialiseert een seriële interface en deactiveert eventueel concurrerende portfuncties. 7.2.2 Instellen van de overdrachtsnelheid Voor elk van beide interfaces kan de overdrachtsnelheid ingesteld worden. De hwcom - interface kan daarbij tot 115.200 Baud werken, swcom maar tot 9.600 Baud. function setspeed ( int speed )
speed
overdrachtssnelheid
(SPEED_19200 tot SPEED_115200 alleen voor hwcom) 7.2.3 Instellen van de uitgebreide ontvangstbuffer Het besturingssysteem implementeert voor beide seriële interfaces standaard elk een ontvangstbuffer van 64 byte. In applicaties, waarin grotere ontvangstblokken ontvangen moeten worden, dient een uitgebreide ontvangstbuffer gereserveerd te worden. Anders kan dat leiden tot het verlies van ontvangen data, die door het programma niet snel genoeg uit de buffer gelezen worden. function setbuf ( byte buf[ ], intg length ) buf referentie aan een statische of quasi – statische bytebuffer – variabele length lengte van de buffer. 7.2.4 Verwerpen van data Applicaties, die seriële data in framevorm ontvangen, kunnen onder bepaalde omstandigheden onvolledige frames in de ontvangstbuffer ontvangen. Dan is het noodzakelijk alle bytes in de ontvangstbuffer te verwerpen, om te synchroniseren op het begin van het volgende frame. function flush ( ) De functie flush verwijdert alle data uit de ontvangstbuffer.
55
7.2.5 Test op ontvangst function rxd ( ) returns int De functie rxd test, of één of meerdere nieuwe bytes in de ontvangstbuffer van een seriële interface beschikbaar is/zijn. Als dat zo is, dan wordt de waarde –1 teruggegeven, anders 0. 7.2.6 Lezen van een ontvangen byte function get ( ) returns byte De functie get leest en verwijdert een enkele byte uit de ontvangstbuffer. 7.2.7 Ontvangst van dataframes function receive ( byte buf[ ], int length, long timeout ) returns int De functie receive leest en verwijdert een aantal bytes (dataframe) uit de ontvangstbuffer en kopieert deze in een bytebuffer – variabele. Als de ontvangstbuffer bij het oproepen van de functie minder ontvangen bytes bevat dan gespecificeerd, dan wacht de functie op de ontvangst van verdere bytes. Het wachten wordt afgebroken, als er tussen twee bytes een langere pauze herkend wordt (timeout). De antwoordwaarde geeft het aantal van de daadwerkelijk gelezen bytes terug. buf length timeout
referentie aan een bytebuffer – variabele lengte van de buffer. timeout in milliseconden
7.2.8 Test op zendparaatheid function ready ( ) returns int De functie ready test, of een seriële interface klaar is voor een nieuwe overdracht. Antwoord: -1 indien klaar, anders 0. 7.2.9 Verzenden van een byte function put ( byte c ) De functie put verzendt één enkele byte via een seriële interface. 7.2.10 Verzenden van dataframes function send ( byte buf[ ], int length) De functie send verzendt een aantal bytes via de seriële interface. Het verzenden gebeurt op de achtergrond. D.w.z. de functie geeft alleen het adres van de zendbuffer door aan het systeem en start de overdracht. Daarom moet de bytebuffer – variabele statisch zijn (globale variabele of variabele van een thread). buf length
referentie aan een statische bytebuffer – variabele lengte van de buffer.
7.3 i2c.c2 2
Via de functies van de module i2c.c2 kan een programma toegang krijgen tot ICs, die op de I C-bus van de C-Control II unit zijn aangesloten. Een typische toepassing is de aansluiting van seriële EEEEPROMS voor het registreren van data. 2 De I C-bus van de C-Control II unit is als Single-Master-Bus geïmplementeerd. D.w.z. de impulssignalen, de start- en stopvoorwaardes worden steeds door de C-Control II unit geproduceerd.
56
7.3.1 Initialisering function init () 2
De functie init initialiseert de I C-bus. Omdat ook het LCD van de C-Control II unit op deze bus is aangesloten, wordt de initialisering reeds automatisch bij de reset van het systeem uitgevoerd en hoeft in de regel niet in het gebruikersprogramma uitgevoerd te worden. 7.3.2 Start van de overdracht function start ( byte device ) returns int 2
Elke toegang tot een IC op de I C-bus vindt plaats door het produceren van de startvoorwaarde met het aansluitend zenden van het apparaat – adres op de bus. De functie start neemt deze opgave over. Welk apparaat – adres voor welke IC welke betekenis heeft, kunt u vinden in de documentatie van deze ICs. Het resultaat van de functie start is –1 als de aangesproken IC paraat is, anders is het 0. 7.3.3 Zenden van de stopvoorwaarde function stop () Een data – overdracht naar de IC–bus wordt afgesloten door de stopvoorwaarde. De functie stop produceert dit signaal op de bus. 7.3.4 Schrijven van een byte function write ( byte c ) returns int 2
De functie write zendt een byte naar de I C-bus. Het resultaat van de functie is –1, als de aangesproken IC met een Acknowledge (bevestiging) geantwoord heeft, anders is het 0. 7.3.5 Lezen van een byte met Acknowledge function read ( ) returns byte 2
De functie read leest een byte via de I C-bus en antwoordt met een Acknowledge – signaal. Een typische toepassing is het sequentiële lezen van bytes uit een seriële EEEEPROM. 7.3.6 Lezen van een byte zonder Acknowledge function readlast ( ) returns byte 2
De functie readlast leest een byte via de I C-bus en en antwoordt met een No-Acknowledge – signaal. Een typische toepassing is het lezen van de laatste byte van een byte – sequentie uit een seriële EEEEPROM. 7.3.7 Testen op zendparaatheid function ready ( ) returns int 2
De functie ready controleert, of de I C-bus klaar is voor een nieuwe overdracht. Antwoord –1 als de bus klaar is, anders 0. 7.4 (vervalt) * 7.4.1 *(vervalt)* 7.4.2 *(vervalt)* 7.4.3 *(vervalt)*
57
7.4.4 *(vervalt)* 7.4.5
*(vervalt)*
7.4.6
*(vervalt)*
7.4.7
*(vervalt)*
7.4.8
*(vervalt)*
7.4.9
*(vervalt)*
7.4.10 *(vervalt)* 7.5 Ipt.c2 De digitale ports van de C-Control II unit kunnen onder andere gebruikt worden als parallelle printer – interface. 7.5.1 Initialisering function init () De functie init initialiseert de printer – interface. Eventueel concurrerende portfuncties worden gedeactiveerd. 7.5.2 Uitvoerbuffer leegmaken function flush () De functie flush maakt de uitvoerbuffer leeg en beëindigt zo een op de achtergrond lopende printprocedure. 7.5.3 Test op uitvoerparaatheid function ready () returns int De functie ready controleert, of de printer – interface klaar is voor een nieuwe opgave. Antwoord: -1 als de interface klaar is, anders 0. 7.5.4 Een teken printen function put ( byte c ) De functie put geeft een enkel teken (ASCII – code) door naar de printer. 7.5.5 Tekst printen function print ( byte buf[ ], int length ) De functie print geeft tekens (ASCII – codes) uit een bytebuffer – variabele door naar de printer. De uitvoer vindt op de achtergrond plaats. D.w.z. de functie geeft alleen het adres van de zendbuffer door aan het systeem en start de overdracht. Daarom moet de bytebuffer – variabele statisch zijn (globale variabele of variabele van een thread). buf length
referentie aan een statische bytebuffer – variabele lengte van de buffer.
58
7.6
math.c2
7.6.1 Wiskundige standaardfuncties De definities van de standaardfuncties hebben de vorm function fx ( float x ) returns float Naam sqr sqt curt sin cos tan asin acos atan log ln exp ceil floor
Berekend resultaat Kwadraat Wortel uit het kwadraat Kubieke wortel Sinus, argument x in boogmaat (radiant) Cosinus, argument x in boogmaat (radiant) Tangens, argument x in boogmaat (radiant) Arkussinus, resultaat in boogmaat (radiant) Arkuscosinus, resultaat in boogmaat (radiant) Arkustangens, resultaat in boogmaat (radiant) Logaritme voor basis 10 Natuurlijke logaritme x Exponentiële functie e Kleinste gehele getal, dat niet kleiner is dan x (naar boven afronden) Grootste gehele getal, dat niet groter is dan x (naar beneden afronden)
7.6.2 Machtsverheffen De functie function pow ( float x, float y ) returns float berekent de y-macht voor basis x (x y, “x tot de macht y”) 7.6.3 Absolute waarde – functies Voor elk numeriek datatype (behalve byte, dat komt overeen met int bij het oproepen van de functie) is er een absolute waarde – functie: function abs ( int value ) returns int function labs ( long value ) returns long function fabs ( float value ) returns float 7.6.4 Minimum- en maximumfuncties Voor elk numeriek datatype (behalve byte, dat komt overeen met int bij het oproepen van de functie) is er een minimum - en maximum – functie: function function function function function function
min ( int a, int b ) returns int lmin ( long a, long b ) returns long fmin ( float a, float b ) returns float max ( int a, int b ) returns int lmax ( long a, long b ) returns long fmax ( float a, float b ) returns float
7.7 mem.c2 De functies van de module mem.c2 maken verschillende manipulaties van bytebuffer – variabelen mogelijk. De hoofdtoepassingen van deze functies zijn • • •
het opbouwen van dataframes voor een data – overdracht het lezen van data uit ontvangen dataframes de regelformattering voor een uitvoer, b.v. naar een printer
59
7.7.1 Vullen met een waarde function fill ( byte buf[ ], int length, byte c ) De functie fill vult een aangegeven bytebuffer – variabele met een aantal gelijke tekens, b.v. spaties. buf length c
referentie aan een bytebuffer – variabele vullengte teken (ASCII – code)
7.7.2 Kopiëren function copy ( byte dest[ ], int pos, byte src[ ], int length ) De functie copy kopieert een aantal (length) tekens uit een bytebuffer – variabele (src) naar een bepaalde positie (pos) van een andere bytebuffer – variabele (dest). U dient er op te letten, dat de doelbuffer genoeg plaats biedt voor de gekopieerde tekens. 7.7.3 Opslaan van numerieke waarden in een bytebuffer Bij het opbouwen van bytebuffers voor een overdracht moeten vak numerieke waarden opgeslagen worden, die meer plaats nodig hebben dan een enkele byte: Integer-, Long- of vloeiende komma – waarden. Daarvoor kunnen de volgende functies van de module mem.c2 gebruikt worden: function putint ( byte dest[ ], int pos, int value ) function putlong ( byte dest[ ], int pos, long value ) function putfloat ( byte dest[ ], int pos, float value ) Voor alle drie functies is dest pos c
referentie aan een bytebuffer – variabele uitvoerpositie in de buffer de getalswaarde
De functie putint slaat de waarde op in 2 bytes vanaf de positie in de volgorde HiByte – LoByte; Putlong slaat de waarde op in vier bytes vanaf de positie pos in de volgorde: HiByte van HiWord - LoByte van HiWord – HiByte van LoWord – LoByte van LoWord. putfloat slaat de waarde op in 8 bytes vanaf de positie pos in het IEEE- format. Omdat dit format niet door alle computersystemen op dezelfde manier geïnterpreteerd wordt, moet putfloat alleen gebruikt worden voor de data – uitwisseling tussen C-Control II – systemen. 7.7.4 Lezen van numerieke waarden uit een bytebuffer Bij de functies voor het schrijven van numerieke waarden is er een dienovereenkomstige functie voor het lezen van de waarden uit een bytebuffer. function getint (byte src[ ], int pos ) returns int function getlong (byte src[ ], int pos ) returns long function getfloat (byte src[ ], int pos ) returns float Voor alle drie functies is: src pos
referentie aan een bytebuffer - variabele leespositie in de buffer
60
7.8 plm.c2 7.8.1 Instellen van de tijdbasis Er kunnen acht verschillende tijdbasiswaarden ingesteld worden. Het instellen gebeurt met de functie settimebase. function settimebase ( int channel, int timebase ) channelPLM – kanaal (0, 1, 2) timebase tijdbasis De overgedragen numerieke waarden leveren de volgende tijdbases op: (Let er op, dat channel 0 en channel 1 een gemeenschappelijke tijdbasis hebben.) timebase BASE_400 (0) BASE_800 (1) BASE_1600 (2) BASE_3200 (3) BASE_6400 (4) BASE_12800 (5) BASE_25600 (6) BASE_51200 (7)
Tijdbasis (duur van een tick) 400 ns 800 ns 1,6 µs 3,2 µs 6,4 µs 12,8 µs 25,6 µs 51,2 µs
7.8.2 Instellen van de port – mode Elk van de drie PLM – ports kan in één van twee verschillende hardware – modes gebruikt worden: of met digitaal uitgangsniveau of met transistor–push–pull – uitgang. Het instellen van de mode vindt plaats met de functie setmode. function setmode ( int channel, int mode ) channelPML – kanaal (0, 1, 2) mode port – mode (0 = digitaal, 1 = push-pull transistorfase) 7.8.3 Instellen van de periodelengte Het instellen van de periodelengte gebeurt met de functie function setperiod ( int channel, int length ) channelPML – kanaal (0, 1, 2) length periode – lengte, N ticks Let er op, dat channel 0 en channel 1 een gemeenschappelijke periodelengte hebben. 7.8.4 PLM – uitvoer function out ( int channel, int value ) channel length
PLM – kanaal (0, 1, 2) periodelengte, N ticks
De functie out geeft een waarde impulsbreedte – gemoduleerd door aan een PLM – port. Als de uitvoerwaarde minstens zo groot is als de voor dit kanaal ingestelde periodelengte, dan is het uitgangsniveau van de port permanent high. Een uitvoerwaarde 0 leidt tot een permanent low niveau 7.8.5 Uitvoer van audio -frequenties Op elk van de drie PLM – ports kan gedurende een bepaalde periodelengte en een uitvoerwaarde van b.v. een halve periodelengte een rechthoeksignaal met een bepaalde frequentie afgegeven worden. Daarbij dient u rekening te houden met de ingestelde tijdbasis. De uitvoerfrequentie van de impulslengte
61
– modulatie voor een kanaal resulteert uit 1 / (tijdbasis * periodelengte), als de PLM – uitvoerwaarde kleiner is dan de periodelengte en groter dan 0. Om de uitvoer van audio -frequenties te vergemakkelijken is er de functie beep. Deze heeft steeds betrekking op het derde PLM – kanaal (channel 2). Alle berekeningen en instellingen van periodelengtes onder inachtneming van de actuele tijdbasis worden door deze functie overgenomen. function beep ( int tone ) ””
De parameter tone bepaalt een toon in het bereik van de tonen a tot c . Een toon met de frequentie van 440 Hz is de kamertoon a’ – de toon van een stemvork. Een negatieve tone – waarde schakelt het geluid uit en legt de PLM – port op permanent Low level. Een aantal tone – constanten is gedefinieerd in het modulebestand plm.c2. Voor het gebruik van beep dient een lage tijdbasis gekozen te worden, omdat daardoor de audio –frequenties met grotere precisie weergegeven worden. 7.9 ports.c2 De C-Control II unit stelt in totaal 16 digitale ports en 8 A/D – omvormer – ports van de microcontroller op de pins ervan tot uw beschikking voor universeel gebruik. De toegang tot deze ports vindt plaats via de functies van de module De toegang tot deze ports vindt plaats via de functies van de module ports.c2. Tussen de digitale processor – ports en de portnummer – parameters van de functies van deze module bestaat de volgende samenhang: Processor - port P1L0 P1L1 P1L2 P1L3 P1L4 P1L5 P1L6 P1L7 P1H.0 P1H.1 P1H.2 P1H.3 P1H.4 P1H.5 P1H.6 P1H.7
Nummers van de aparte ports 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Nummers van de Nibble - ports
Nummers van de byte - ports
0 0 1
2 1 3
7.9.1 Opvragen van digitale ports Digitale ports kunnen apart, in groepen van vier (Nibbles), byte – gewijs en in hun geheel als een 16bitinteger (Word) opgevraagd worden. Het resultaat van het opvragen is altijd een integer – waarde, die als bitmasker de poorttoestand weerspiegelt: 1-bit = port high; 0-bit = port low. Let op de volgende bijzonderheid: Het opvragen van één enkele digitale port levert – net als een vergelijking – het resultaat –1 (port is high) of 0 (port is low) op. De parameter van de opvraagfuncties is het nummer van de port, de eerste port heeft altijd het nummer 0. function get ( int number ) returns int function getn ( int number ) returns int function getb ( int number ) returns int function getw ( int number ) returns int
62
De volgende tabel toont geldige portnummers en het waardebereik van de resultaten van de aparte opvraagfuncties. Functie get getn getb getw
Toepassing Opvragen van aparte ports Opvragen van Nibble - ports Opvragen van byte – ports Opvragen van Word - ports
Portnummers 0 … 15 0 … 3 0 … 1 0
Resultaat 0, -1 0 …15 0 …255 0x0000 … 0xFFFF
7.9.2 Instellen van digitale ports Elk van de 16 digitale ports kan gebruikt worden als ingang of als uitgang. Voor het gebruik als uitgang moet voor de eerste uitvoer de interne elektronica van de microcontroller dienovereenkomstig geactiveerd worden. Dat wordt automatisch gedaan door het besturingssysteem van de C-Control II unit bij het oproepen van de set – functies. Het instellen van ports kan net als bij het lezen apart, als Nibble, als Byte of als 16bit-integer (Word) gedaan worden. De parameters van de set…-functies zijn het portnummer en de in te stellen port – toestand als bitmasker. Bits met een hogere waarde, die in een uitvoer niet weergegeven kunnen worden, worden genegeerd; b.v. het instellen van een Nibble –port op de waarde 17 (of 10001) is niet mogelijk en wordt geïnterpreteerd als instellen op 1 (of 00001). Bij de uitvoer naar aparte ports leiden alle waarden ongelijk aan 0 tot het instellen van de port op high level. function set ( int number, int state ) function setn ( int number, int state ) function setb ( int number, int state ) function setw ( int number, int state ) 7.9.3 Omschakelen en impulsen Nadat een port met een set…-functie geïnitialiseerd is, staan de volgende functies ter beschikking: function toggle ( int number ) function pulse ( int number ) De functie toggle keert een port om. De impuls – functie geeft een naaldimpuls aan een port (twee keer inverteren kort na elkaar). Dat kan bijvoorbeeld gebruikt worden als kloksignaal voor digitale schakelcircuits met trigger – ingang. Beide functies hebben steeds betrekking op één enkele digitale port, waarvan het nummer als parameter doorgegeven wordt. 7.9.4 Deactiveren van ports Als een digitale port na het oproepen van een set…-functie als uitgang gebruikt wordt, dan zijn er in de microcontroller speciale transistorfases geactiveerd, die een port van stroom voorzien (port high) of tegen massa kunnen trekken (port low). Bij sommige toepassingen moeten digitale ports als uitgang en dan weer als ingang gebruikt worden. Daartoe moeten de driver- fases uitgeschakeld (gedeactiveerd) worden. Dat gebeurt door het oproepen van de volgende functies, steeds voor één enkele port, Nibble – port, Byteport of Wordport: function deact function deactn function deactb function deactw
( ( ( (
int int int int
number number number number
) ) ) )
7.9.5 Impulstelling getcount ( int number ) returns long De vier digitale ports P1H.0 …P1H.3 zijn interrupt – sensibel. Ze worden door het besturingssysteem bij de reset zo ingericht, dat ze inkomende impulsen tellen (bij High-Low- flank op de digitale port). Deze vier tellerstanden kunnen via de functie getcount opgevraagd worden. Als parameter verwacht de functie het
63
portnummer 0 … 3. Bij elke keer dat de stand wordt opgevraagd, wordt deze stand op 0 teruggezet. Het optellen over een langere periode moet in het hoofdprogramma gebeuren. 7.9.6 Frequentiemeting function getfreq ( int number ) returns long De pins DCF/FRQ 0 en FRQ 1 van de C-Control II unit kunnen gebruikt worden voor het meten van impulsfrequenties. Het opvragen gebeurt met de functie getfreq, met het cijfer 0 of 1 als parameter. 7.9.7 Analoog – Digitaal – omvorming function adc ( int number ) returns int De functie adc levert de gedigitaliseerde meetwaarde van een van de 8 ADC – ports van de C-Control II unit. Het nummer van de port (0 … 7) wordt als parameter doorgegeven. Het resultaat is een Integer in het bereik van 0 tot 1023 – in overeenstemming met de 10bit – resolutie van de A/D – omvormer van de microcontroller; zie daarvoor ook het hfst. 3.2.3. 7.10 str.c2 De C-Control II unit ondersteunt eenvoudige string- operaties al op het niveau van de virtuele machine. De toegang tot deze operaties vindt plaats via de functies van de module str.c2. 7.10.1 String leegmaken function clear ( string s ) De functie clear maakt de als referentie doorgegeven string leeg, de lengte wordt op 0 ingesteld. 7.10.2 Stringlengte bepalen function length ( string s ) returns int De functie length bepaalt de lengte van de als referentie doorgegeven string. 7.10.3 String vullen met tekens function fill ( string s, int pos, int c ) De functie fill vult een string s vanaf de positie pos (0…29) tot aan de maximale lengte (30 tekens) met het teken c (ASCII – code). 7.10.4 Uitvoer in een string Via de put…-functies in de module str.c2 kunnen inhouden aan een bestaande string – variabele gekoppeld worden: aparte tekens, deelstrings, integer-, long- of floatwaarden: function function function function function
putchar ( string s, int c ) putstring ( string dest, string source ) putint ( string s, int value ) putlong ( string s, long value ) putfloat ( string s, float value )
7.10.5 Geformatteerde invoer in een string C2 ondersteunt een paar eenvoudige formatteringen bij het koppelen van numerieke waarden aan strings. Het format wordt bepaald door een integer – parameter. * int- uitvoer function puntinf ( string s, int value, int format )
64
De functie putinf koppelt een geformatteerde integer aan een string. De parameter format legt het aantal invoerposities vast. Ontbrekende voorafgaande posities worden opgevuld met “0”. putinf (s, 1, 4); koppelt dus “0001” aan s. Negatieve formatwaarden leiden tot invoer als hexadecimaal getal met hoofdletters. putinf (2, 255, -4); breidt s uit met “00FF”. * long – invoer function putlongf ( string s, long value, int format ) De functie putlongf werkt identiek aan puntintf, maar accepteert echter een long – waarde als uitvoer. * float – uitvoer function putfloatf ( string s, float value, int format ) Bij de functie putfloatf legt de format – parameter het aantal cijfers achter de komma vast. Eventueel wordt een aantal nullen achter de decimale punt ingevoerd. Voorbeeld: putfloatf (s, 1, 3); koppelt “1.000” aan s. In totaal worden maximaal 8 cijfers (voor en na de decimale punt) ingevoerd. 7.10.6 Invoer van een bitmasker function putmask ( string s, int value, int c1, int c0 ) De functie putmask voegt een integer – waarde (0…255) als 8 bittekens in een string in. Het teken voor Highbits wordt bepaald door de parameter c1 (ASCII – code), c0 legt het low – teken vast. Voorbeeld: putmask(s, 170, `o´, `-´); koppelt “o-o-o-o-“ aan s. Met putmask kunnen bijvoorbeeld byteport – toestanden eenvoudig voorbereid worden voor weergave op het LCD. 7.11 system.c2 7.11.1 Systeemtimer Het besturingssysteem beheert een vrijlopende timer. In elke milliseconde wordt de timer met 1 verhoogd. De tellerstand wordt door het systeem opgeslagen in een interne long – variabele. De actuele waarde van deze variabelen kan door de functie Function timer ( ) returns long opgevraagd worden. Let er op, dat de tellerstand volgens het waardebereik van de long – variabele na 2147483647 overgaat in de negatieve waarde –217483648.
65
7.11.2 Tijd De C-Control II unit beschikt over een interne real time – klok, die door aansluiting op een DCF77 – actieve antenne tot op de seconde precies gesynchroniseerd kan worden. Bovendien kan de tijd ook in het C2- programma ingesteld worden, en wel door het oproepen van de functie function settime ( int hour, int minute, int second ) De deelwaarden van de actuele tijd (uur, minuut, seconde) kunnen door de volgende functies opgevraagd worden: function hour ( ) returns int function minute ( ) returns int function second ( ) returns int Denk er aan, dat er bij het opvragen van de aparte functies een nieuwe minuut of uur kan aanbreken. Gebruik daarom bij voorkeur de functie Function gettime ( TIME time ) Deze functie geeft de volledige tijd in een blok in de als parameters ingevoerde datastructuur van het type TIME weer: type { int int int }
TIME hour; minute; second;
7.11.3 Status van de DCF77 – synchronisatie Het besturingssysteem probeert op elke hele minuut de interne real-time klok te synchroniseren met het ontvangen DCF77 – dataframe. Onder slechte ontvangstomstandigheden kan een synchronisatie langere tijd duren. De interne real-time klok loopt dan kwarts -gestuurd door. Vanwege temperatuurinvloeden en toleranties van de elektronische componenten leidt dit na langere tijd tot een toenemende tijdafwijking van de interne klok. Om in het C2 – programma de actualiteit en precisie van de interne klok te taxeren, kan via de functie dcferr een teller van het besturingssysteem opgevraagd worden, die het aantal vergeefse synchronisaties weergeeft. function dcferr ( ) returns int Het terugzetten van de teller gebeurt bij elke correcte synchronisatie. Als er dan b.v. binnen 30 minuten geen nieuwe synchronisatie mogelijk is, staat de teller op 30. Bij permanent uitvallen van de synchronisatie wordt de teller op de waarde 32767 vastgehouden. Ook bij reset wordt de teller met deze waarde geïnitialiseerd. 7.11.4 Datum Met de DCF77 – synchronisatie wordt ook de datum van het systeem ingesteld. Als u de datum in het C2 – programma wilt manipuleren, gebruikt u de functie function setdate ( int year, int month, int day ) Voor het opvragen van de afzonderlijke datuminformatie dienen de functies function function function function
year ( ) returns it month ( ) returns it day ( ) returns it dow ( ) returns it
dow levert de dag van de week. Daarbij staat 0 voor zondag, 1 voor maandag enz. tot 6 voor zaterdag. Overtuig u er bij het opvragen van de afzonderlijke datumwaarden van, dat er niet tussendoor een dagwisseling (middernacht) kan optreden (vergelijk de broncode van de functie gettime).
66
7.11.5 Zomertijdflag De functie function dst ( ) returns int geeft de informatie weer, of het bij de actuele systeemdatum gaat om een datum in de zomertijd – periode: 0 komt overeen met de normale tijd (wintertijd), -1 betekent zomertijd.
7.11.6 Oproepen van systeemfuncties Vanuit het C2 – programma kunnen willekeurige functies van het besturingssysteem of van gebruiker – gedefinieerde Assembler-/C-routines opgeroepen worden. Daartoe bevindt zich in de module system.c2 de functie function call ( int segment, int offset ) Via het oproepen van de functie function jump (int segment, int offset ) kunt u de virtuele machine van de C-Control II unit en daarmee ook de bewerking van een C2 – programma verlaten en naar een willekeurige routine in de totale adresruimte van de C164Cl springen. Voorwaarde bij het oproepen van call en jump is, dat u steeds het adres (segment, offset) van de functie kent. De adressen van uw eigen Assembler-/C-routines kunt u vinden in de uitgaven van uw Assembler/C-ontwikkelingstools. Een voorbeeld van de toepassing van call vindt u op de Utility – CD. 7.11.7 Gebruiker – gedefinieerde interrupt- routines Voor een onmiddellijke reactie op de gebeurtenissen
* 1 ms – timercyclus van het systeem, * High-Low-flanken op de digitale ports P1H.0 … P1H.3, kunnen interrupt – routines in Assembler of C-Control geschreven en in het segment 3 van de FLASHEEEEPROM opgeslagen worden. Lees daarvoor het hoofdstuk 8 “systeemprogrammering”. Het activeren van de gebruiker –gedefinieerde interrupt –routines gebeurt door het oproepen van de functie hook. function hook ( int event, int segment, int offset, int mode ) De functie hook koppelt een gebruiker –gedefinieerde interrupt –routine aan de normale interrupt – behandeling van het systeem. De parameter event geeft aan, voor welke interrupt – bron een interrupt – routine geactiveerd moet worden: Event EVENT_TIMER (0) EVENT_P1H0 (1) EVENT_ P1H1 (2) EVENT_ P1H2 (3) EVENT_ P1H3 (4)
Interrupt - bron 1 ms timer Digital port P1H.0 Digital port P1H.1 Digital port P1H.2 Digital port P1H.3
De parameters segment en offset geven het geheugenadres van de interrupt -routine in de totale adresruimte van de microcontroller aan. Het geheugenadres kunt u vinden in de uitgaven van uw Assembler-/C-ontwikkelingstools. Lees daartoe de documentatie van deze tools. Als u een C-functie als interrupt –routine wilt schrijven, moet deze in de stijl void fx ( void ) gedefinieerd zijn, dus zonder parameters en returnwaarde. Als een interrupt –routine aan de normale interrupt –behandeling van het systeem wordt gekoppeld, zijn er voor de bewerking bij het optreden van de interrupt drie mogelijkheden.
67
U kunt de gewenste variant bepalen door de parameter mode: Mode HOOK_REPLACE (0) HOOK_BEFORE (1) HOOK_AFTER (2)
Uitvoering van de gebruiker – gedefinieerde interrupt - routine In plaats van de normale interrupt – behandeling van het systeem Voor de normale interrupt – behandeling van het systeem Na de normale interrupt – behandeling van het systeem
Het activeren van eigen interrupt – routines vormt een aanzienlijke ingreep in het totale systeem en heeft een beslissende invloed op het tijdgedrag ervan! Interrupt – routines moeten zo kort mogelijk gehouden worden! Een interrupt – routine voor een gebeurtenis kan door het oproepen van de functie unhook gedeactiveerd worden function unhook ( int event ) 7.12 twb.c2 7.12.1 Initialisering De initialisering van de 2W-bus-interface gebeurt met de functie function init ( ) Eventueel concurrerende portfuncties worden gedeactiveerd. 7.12.2 Opvragen van ontvangst van het antwoordframe De functie function rxd ( ) returns int levert –1, als een antwoordframe door het 2W-bus-modem ontvangen is, anders 0. 7.12.3 Data – overdracht De communicatie met de 2W-bus-modems loopt steeds via een 2W-bus-modem. Tussen de C-Control II unit en het modem worden serieel – synchroon 8 byte lange dataframes overgebracht. De betekenis van de afzonderlijke bytes kunt u vinden in de handleidingen bij de 2W-bus-modules en het modem. function io ( byte buf[ ] ) returns int De functie io verwacht als parameter een referentie aan een 8 byte lang array. Uw programma moet de aan de 2W-bus te sturen informatie daar invoeren, b.v. het adres van de aangesproken module, het commando en eventuele databytes. De functie io verzendt deze bytebuffer en wacht op de ontvangst van het antwoordframe. Dit antwoordframe wordt in de verzonden bytebuffer buf overgebracht. Het antwoord van de functie is –1 bij geslaagde data – overdracht en 0 als het niet goed is gegaan (de module heeft niet geantwoord). Let er svp op, dat u in elke 2W-bus-module voor de eigenlijke toepassing een ondubbelzinnig adres moet overbrengen. Lees daartoe de handleidingen bij de 2W-bus-modules en het modem. Sommige van deze handleidingen waren al klaar voor het verschijnen van de C-Control II unit. De tekst van deze handleidingen bevat daarom geen expliciete verwijzingen naar C-Control. 7.13 constant.c2 en vmcodes.c2 De module constant bevat een paar algemene constanten, die in de brontekst zelf bekeken kunnen worden. De module vmcodes bevat een lijst van alle operatiecodes van de virtuele machine. Een documentatie van de codes vormt geen onderdeel van deze gebruiksaanwijzing en is niet noodzakelijk voor de gebruikersprogrammering van de C-Control II unit.
68
8
SYSTEEMPROGRAMMERING
8.1.1 TASKING C/C++ tools Het besturingssysteem van de C-Control II unit is ontwikkeld met de volledige versie van de TASKING C/C++ tools. Een demo – versie van deze tools vindt u op de Utility CD bij de C-Control II unit. Deze tools bevatten o.a. een ontwikkelingsomgeving met editor en projectbeheer, een geïntegreerde C/C++ compiler, een assembler en linker. Verdere informatie vindt u in de bestanden en installatie – aanwijzingen op de CD. 8.1.2 Uitbreiding van de virtuele machine en veranderingen aan het besturingssysteem In segment 3 van de externe FLASH-EEPROM van de microcontroller – schakeling kunt u kleine systeemroutines laden als uitbreiding van de virtuele machine. Deze kunnen vanuit het C2 – programma opgeroepen worden met de functies system.call en system.jump of met de functie system.hook als interrupt – handler voor digitale ports of de systeemtimer geïnstalleerd worden (zie hfst. 7.11). De routines in Assembler, C of C++ kunnen met behulp van de demoversie van de Tasking C/C++ Tool overgebracht worden. Let daarbij op de limiteringen van de demoversie. De geproduceerde uitvoerfile in Intel – Hexformaat kan met behulp van de C2- ontwikkelingsomgeving naar segment 3 van de unit overgebracht worden. De adressen van de functies daarvan vindt u in het gemaakte Map- bestand. Als u uit uw Assembler-, C- of C++-routines toegang moet hebben tot data en functies van het besturingssysteem of als u het door Conrad geleverde besturingssysteem naar uw wensen wilt aanpassen, dan heeft u de bronteksten en de documentatie van het systeem nodig, evenals een geschikte compiler. De bronteksten en de documentatie ervan ontvangt u op aanvraag als extra bestelling bij Conrad Electronic. Een passende compiler vindt u in de volledige versie van de TASKING C/C++ tools. Actuele informatie over prijzen en support vindt u vanaf beschikbaarheid op de C-Control – homepage www.ccontrol.de. 8.1.3 Implementering van een eigen besturingssysteem In principe kunt u een volledig eigen besturingssysteem ontwerpen en in de C-Control II unit laden. U dient daarbij echter over omvangrijke kennis van de toepassing en programmering van de C164CI – microcontroller te beschikken. Bovendien heeft u een geschikte ontwikkelingsomgeving nodig, b.v. de volledige versie van de TASKING C/C++ tools. Wij vragen om uw begrip dat wij voor de programmering van uw eigen besturingssystemen geen gratis support kunnen leveren. Als u geïnteresseerd bent in ontwikkelingsondersteuning, doen wij u graag een dienovereenkomstig aanbod.
69
9 AANHANGSEL 9.1 Technische specificaties Aanwijzing: u vindt gedetailleerde informatie in de PDF-bestanden van de IC fabrikant op de C-Control – Utility CD. Alle spanningsaanduidingen hebben betrekking op gelijkspanning (DC). 9.1.1 Mechaniek Buitenafmetingen zonder pins Gewicht Pinraster
ca. 82mm x 60mm x 18mm ca. 90g 2,54mm
9.1.2 Omgevingsvoorwaardes Bereik van de toelaatbare omgevingstemperatuur
0°C…40°C
Bereik van de toelaatbare relatieve omgevingsluchtvochtigheid
20% … 60%
9.1.3 Voedingsspanning Bereik van de toelaatbare voedingsspanning 8V …24V Stroomverbruik van de unit zonder extreme belasting ca. 60 … 100mA Max. toelaatbare permanente stroom uit de gestabiliseerde 5V-spanning van de unit 100mA Max. toelaatbare verliescapaciteit van de unit 1,5W 9.1.4 Ports Max. toelaatbare stroom uit digitale ports Max. toelaatbare totaal van de stromen op digitale ports Bereik van de toelaatbare ingangsspanning op de pinports (digitaal en A/D)
± 5mA 50mA -0,5V … 5,5V
9.2 Literatuurregister SIEMENS (Infineon): “16bit-microcontrollers – C164CI User’s manual” R. Schultes, I. Pohle: 80C166 Mikrocontroller, Franzis’ Verlag, ISBN 3-7723-5893-4 e
W. Lawrenz: “CAN Controller Area Network, Grundlagen und Praxis”, 2 druk. Hütig Verlag, 1997, ISBN 3-7785-2575-1 K. Dembowski: “Computerschnittstellen und Bussysteme”, Hüthig Verlag, ISBN 3-7785-2526-3 P. Rechenberg, G. Pomberger (Hrsg.): “Informatik-Handbuch”, Carl Hanser Verlag, 1977, ISBN 3-446-18691-3 S. McConnel: “Code Complete”, Microsoft Press, 1994, ISBN 3-86063-333-3 R. Hopfer, R. Müller: “BASIC Einführung in das Programmieren”, VEB-Fachbuchverlag Leipzig, 1987, ISBN 3-343-00367-0;-)
70
Rangvolgorde van de operatoren in C2 Rekenkundige operatoren (pag. 61) Operator Betekenis + Optellen Aftrekken * Vermenigvuldigen / Delen % mod Staartdeling (deelrest) Negatief voorteken Vergelijkingsoperatoren (pag. 62) Operator Betekenis == Is gelijk aan? != Is niet gelijk aan? > Is groter dan? < Is kleiner dan? >= Is groter of gelijk aan? <= Is kleiner of gelijk aan? Logische operatoren en bitmanipulaties(pag. 63) Operator Betekenis ! not niet (bit -invertering) & and En !& nand en met aansluitende bitinvertering | or Of !| nor of met aansluitende bitinvertering ^ xor Exclusief-of Bitschuifoperatoren (pag. 62) Operator Betekenis << shl Naar links schuiven >> shr Logisch naar rechts schuiven Gedetailleerde informatie over de aansluitingen vindt u in hoofdstuk 3.3 vanaf pagina 22. Diversen tabellen, codewoorden en LCD – tekenset vindt u in de meegeleverde Duitse handleiding!
71