198219_C Control Mega_128_compleet C_Control_Pro_unit_Mega128 Ver. 01 198219 An Nl C Pro Unit Mega128
C_Control_Pro_unit_Mega128 - Ver. 01 198484-an-01-nl-C_Control_Pro_unit_Mega128 Starter kit C-Control Pro PRO Mega 128 Spar-Set from Conrad.com
User Manual: C_Control_Pro_unit_Mega128 - Ver. 01 Processor unit C-Control Pro Mega 128 from Conrad.com
Open the PDF directly: View PDF 
.
Page Count: 194 [warning: Documents this large are best viewed by clicking the View PDF Link!]

C-Control Pro 
Mega Series 
                                                        © 2005 Conrad Electronic 
2 
Inhoudsopgave 
Hoofdstuk 1  Belangrijke aanwijzingen        2 
 1 Introductie                2 
2 Het lezen van deze gebruiksaanwijzing        2 
3 Gebruik                3 
4 Gebruik waarvoor dit apparaat bedoeld is       3 
5 Garantie en aansprakelijkheid          3 
6 Service                4 
7 Open Source              4 
8 Historie                4 
Hoofdstuk 2  Installatie              8 
1 Software                8 
2 Application Board              11 
Hoofdstuk 3  Hardware              13 
1 Firmware                13 
2 Mega 32                14 
2.1 Module                15 
2.2 Application Board             17 
2.4 Pintoewijzing              21 
2.5 Jumper Application board          22 
2.6 Schakelschema’s             24 
3 Mega 128                29 
3.1 Module                30 
3.2 Application Board             33 
3.3 Pintoewijzing              37 
3.4 Jumper Application board          39 
3.5 Schakelschema’s             40 
Hoofdstuk 4  IDE                47 
  1 Projecten                48 
1.1 Maken van een project            48 
1.2 Projecten compileren             48 
1.3 Beheren van een project           49 
1.4 Projectopties              50 
1.5 Thread –opties              51 
3 
1.6 Bibliotheekbeheer            52 
2 Editor                53 
2.1 Editor functies              53 
2.2 Reguliere uitdrukkingen            54 
3  C-control hardware             55 
3.1 Programma starten            55 
3.2 Output                56 
3.3 PIN functies              56 
3.4 Controle van de versie            57 
4  Debugger                57 
4.1 Breakpoints              58 
4.2 Variabele venster             59 
4.3 Array venster              60 
5  Opties                61 
5.1 Editor instellingen             62 
5.2 Instellingen vooraf van compiler         63 
5.3 IDE instellingen              64 
6  Vensters                66 
7  Hulp                 67 
Hoofdstuk 5  Compiler              69 
1  Algemene features             69 
1.1 Externe RAM              69 
1.2 Pre-processor              69 
1.3 Pragma aanwijzingen            71 
1.4 Map bestand              71 
2  Compact C               72 
2.1 Programma              72 
2.2 Aanwijzingen              73 
2.3 Data –types              75 
2.4 Variabelen              75 
2.5 Operatoren              79 
2.6 Controlestructuren            81 
2.7 Functies                86 
2.8 Tabellen                88 
3  BASIC                91 
3.1 Programma              91 
3.2 Aaanwijzingen              91 
3.3 Data-types              93 
3.4 Variabelen              94 
4 
3.5 Operatoren              97 
3.6 Controlestructuren             99 
3.7 Functies                103 
3.8 Tabellen                105 
4   Bibliotheken              107 
4.1 Interne functies              107 
4.2 AbsDelay                107 
4.3 Analoog –comparator            108 
4.4 Analoog – digitaal –omvormer          109 
4.5 DCF 77                113 
4.6 Debug                117 
4.7 EEPROM               119 
4.8 I2C                122 
4.9 Interrupt                126 
4.10 Keyboard              130 
4.11 LCD                131 
4.12 Poort                136 
4.13 Math                141 
4.14 RS232                147 
4.15 SPI                153 
4.16 Strings                153 
4.17 Threads                158 
4.18 Timer                165 
Hoofdstuk 6   FAQ                  189 

                                  Hoofdstuk     
2 
1  Belangrijke aanwijzingen 
Dit hoofdstuk behandelt belangrijke informatie voor de garantie en support en gebruik van de 
C-control.Por hardware en software. 
1.1 
Introductie 
De C-Control Pro systemen zijn gebaseerd op de Atmel Mega 32 resp. de Atmel Mega 128 
RISC microcontroller. Deze microcontroller wordt in zeer vele apparaten in grote aantallen 
toegepast. Van de amusementselektronica, via huishoudmachines tot verschillende toepas-
singsmogelijkheden in de industrie. Daar neemt de controller belangrijke besturingsopgaven 
over. C-Control Pro biedt u deze uiterst moderne technologie om uw besturingsproblemen op 
te lossen. U kunt analoge meetwaarden en schakelposities registreren en afhankelijk van 
deze ingangscondities de desbetreffende schakelsignalen afgeven, bijv. voor relais of 
servomotoren. In combinatie met een zendergestuurde DCF77 –antenne kan C-Control Pro 
de atoom –exacte tijd ontvangen en precieze schakelklokfuncties overnemen. Verschillende 
hardware –interfaces en bussystemen maken het mogelijk C-Control Pro te koppelen met 
sensoren, actoren en andere besturingssystemen. Wij willen onze technologie ter beschik-
king stellen aan een brede toepassingskring. Wij weten vanuit onze werkzaamheden bij de 
C-Control serviceafdeling, dat ook klanten zonder enige ervaring met elektronica en 
elektrotechniek maar graag iets daarover willen leren, geïnteresseerd zijn in C-Control. Als u 
tot deze toepassingsgroep behoort, sta ons dan toe op deze plaats een tip te geven: 
C-Control Pro is slechts in beperkte mate geschikt om in te stappen in de programmering 
van microcomputers en de elektronische schakeltechniek! Wij stellen als voorwaarde dat u 
minimaal beschikt over basiskennis betreffende een hogere programmeertaal, zoals bijv. 
BASIC, PASCAL, C, C++ of Java. Bovendien nemen wij aan, dat u vertrouwd bent met de 
bediening van een PC onder één van de Microsoft Windows besturingssystemen 
(98SE/NT/2000/ME/XP). U dient ook enige ervaring te hebben met het hanteren van 
soldeerbouten, multimeters en elektronische componenten. We hebben ons best gedaan alle 
beschrijvingen zo eenvoudig mogelijk te formulieren. Helaas kunnen wij in een gebruiks-
aanwijzing over het onderhavige thema niet steeds afzien van het gebruik van vaktermen en 
anglicismen. Sla indien nodig de desbetreffende vakliteratuur er op na. 
1.2 
  Lezen van deze gebruiksaanwijzing 
Lees deze gebruiksaanwijzing helemaal door voor u de C-Control Pro unit in gebruik neemt. 
Terwijl sommige hoofdstukken alleen van belang zijn voor het begrijpen van de diepere 
samenhang, bevatten andere hoofdstukken belangrijke informatie; als u dit niet in acht 
neemt, kan dat leiden tot foutief functioneren of tot beschadigingen.   
 Hoofdstukken en alinea’s die belangrijke thema’s bevatten, worden gekenmerkt door het 
symbool . Lees deze aanwijzingen bijzonder intensief door. 
Lees voor de ingebruikneming de volledige gebruiksaanwijzing door, er staan belangrijke 
aanwijzingen in betreffende het correcte gebruik. Bij materiële schade of persoonlijk letsel 
die/dat veroorzaakt wordt door onvakkundig gebruik of het niet in acht nemen van deze 
gebruiksaanwijzing, vervalt het recht op garantie! Wij zijn niet aansprakelijk voor schades die 
daarvan het gevolg zijn! 
3 
1.3 
  Gebruik 
De C-Control Pro unit bevat gevoelige componenten. Deze kunnen door elektrostatische 
ontladingen vernield worden! Let op de algemene regels voor het gebruik van elektronische 
componenten. Richt uw werkplek vakkundig in. Aard uw lichaam voor u begint met de 
werkzaamheden, bijv. door het aanraken van een geaard, geleidend voorwerp (bijv. een 
radiator). Vermijd het aanraken van de aansluitpins van de C-Control Pro unit. 
1.4 
Correcte toepassing 
De C-Control Pro unit is een elektronische component in de zin van een geïntegreerd 
schakelcircuit. De C-Control Pro unit is bedoeld voor de programmeerbare aansturing van 
elektrische en elektronische apparaten. De opbouw en het gebruik van deze apparaten moet 
gebeuren conform de geldende Europese toelatingsrichtlijnen (CE).   
De C-Control Pro unit mag niet in galvanische verbinding staan met spanningen hoger dan 
beveiligde laagspanning. De koppeling aan systemen met een hogere spanning mag uit-
sluitend plaatsvinden via componenten met VDE –toelating. Daarbij moeten de voorgeschre-
ven lucht – en kruipafstand aangehouden worden en moeten er tevens voldoende maatrege-
len getroffen worden ter bescherming tegen het aanraken van gevaarlijke spanningen.  
Op de printplaat van de C-Control Pro unit werken elektronische componenten met hoog-
frequente kloksignalen en steile pulsflanken. Bij onvakkundig gebruik van de unit kan dit 
leiden tot het uitzenden van elektromagnetische stoorsignalen. Het gebruik van desbetreffen-
de maatregelen (bijv. het gebruik van smoorspoelen, limietweerstanden, blokcondensatoren 
en afschermingen) valt onder de verantwoordelijkheid van de gebruiker. 
De maximaal toegestane lengte van aangesloten kabels zonder extra maatregelen bedraagt 
0,25 meter (uitgezonderd de seriële interface). Onder invloed van sterke elektromagnetische 
wisselvelden of stoorimpulsen kan de functie van de C-Control Pro unit beïnvloed worden. 
Eventueel is in dat geval een reset en het opnieuw starten van het systeem noodzakelijk. 
Let bij het aansluiten van externe modules op de maximaal toelaatbare stroom – en span-
ningswaarden van de aparte pins. Het aanleggen van een verkeerd gepoolde of te hoge 
spanning of een belasting met een te hoge stroom kan leiden tot de onmiddellijke vernieling 
van de unit. Houd de C-Control Pro unit uit de buurt van spatwater en condenswater. Let op 
het toelaatbare temperatuurbereik in de technische specificaties in de bijlage. 
1.5 
 Garantie en aansprakelijkheid 
Conrad Electronic biedt voor de C-Control Pro unit een garantieperiode van 24 maanden 
gerekend vanaf de datum van aankoop. Binnen deze periode worden defecte units gratis 
omgeruild, als het defect aantoonbaar terug te voeren is op een productiefout of aan 
transportschade. 
De software in het besturingssysteem van de microcontroller alsmede de PC –software op 
CD-ROM worden in de aanwezige vorm geleverd. Conrad Electronic geeft geen garantie dat 
de prestatiekenmerken van deze software voldoen aan individuele eisen en dat de software 
in elk geval werkt zonder onderbrekingen en fouten. Conrad Electronic is niet aansprakelijk 
voor schade die rechtstreeks door of ten gevolge van de toepassing van de C-Control Pro 
unit ontstaan. Het gebruik van de C-Control Pro unit in systemen, die direct of indirect be-
doeld zijn voor medische, gezondheid – of leven beschermende doelen, is niet toegestaan. 
4 
Als de C-Control Pro unit inclusief software niet aan uw eisen voldoet, of u bent het niet eens 
met de garantie – en aansprakelijkheidsbepalingen, maak dan gebruik van onze 14-daagse 
geld-terug-garantie. Stuur ons dan de unit binnen deze termijn zonder sporen van gebruik, in 
de onbeschadigde originele verpakking en inclusief alle accessoires terug voor terugbetaling 
of verrekening van de waarde van dit artikel! 
1.6  Service 
Conrad Electronic stelt u een team van ervaren servicemedewerkers ter beschikking. Als u 
vragen heeft over de C-Control Pro unit, kunt u onze klantenservice bereiken per brief, fax of 
e-mail. 
Per brief    Conrad Electronic 
       Technische Anfrage 
       Klaus Conrad-Strasse 2   
       92530 Wernjberg-Köblitz 
       Bundesrepublik Deutschland 
Faxnr.   0049-9604 / 408848 
e-mail    webmaster@c-control.de 
Onze voorkeur gaat uit naar communicatie per e-mail. Als u een probleem heeft, geef ons 
dan indien mogelijk een schets van uw aansluitschakeling als bijgevoegd beeldbestand (in 
JPG-formaat) alsmede de tot het probleem gereduceerde programma– brontekst (maximaal 
20 regels). Meer informatie en actuele software om te downloaden vindt u op de C-Control 
homepage op internet onder www.c-control.de.  
1.7   Open Source 
Bij het maken van C-Control Pro is ook Open Source software gebruikt: 
ANTRL 2.73        http://www.antrl.org 
Inno Setup 5.15      http://www.jrsoftware.org 
GPP (Generic preprocessor)     http://www.nothingisreal.com/gpp 
Volgens de bepalingen van de “LESSER GPL” (www.gnu.org/copyleft/lesser) wordt bij de 
installatie van de IDE ook de originele Source Code van de Generic preprocessor meege-
leverd, alsmede de brontekst van de aangepaste versie, die bij de C-Control Pro gebruikt 
wordt. Beide bronteksten zijn te vinden in het “GNU” submenu in een ZIP archief. 
1.8   Historie 
Versie 1.50  d.d. 08.11.2005 
Nieuwe features 
•  IDE ondersteuning voor Mega128 
•  Verbeterde cache algorithme bij toegang IDE op looptijddata in de debugger 
•  Nieuwe bibliotheekroutines voor Timer 3 (Mega128) 
•  Programma's gebruiken de uitgebreide (>64Kb) adresplaats (Mega128) 
•  Ondersteuning externe 64Kb SRAM 
•  Externe interrupts 3-7 worden ondersteund (Mega128) 
•  Routines voor 2
de
 seriele interface (Mega128) 
•  Mathematische functies (Mega128) 
5 
•  Weergave van de geheugengrootte bij start van de interpreter 
•  Interne RAM check voor de herkenning wanneer globale vaiabelen te groot voor 
hoofdgeheugen 
•  Interne RAM check voor de herkenning wanneer thread configuratie te groot voor 
hoofdgeheugen 
•  Looptijdcontrole of stacklimiets beschadigd worden 
•  Bronbestanden kunnen in de project hiërarchie naar boven en onder beweegt worden 
•  Waarschuwing bij toewijzing van te lange strings 
•  De compiler maakt naar wens een map-bestand die de grootte van alle 
programmavariabelen beschrijft 
•  Nieuw adresmodel voor globale variabelen (hetzelfde programma loopt op verschillende 
RAM-groottes) 
•  Interruptroutines voor seriële interface (max. 256 Byte ontvangstbuffer / 256 Byte 
zendbuffer 
•  Vaste bedrading IRQ routines om een periodemeting van kleine tijdspannes mogelijk te 
maken 
•  Recursies kunnen nu onbeperkt gebruikt worden 
•  Willekeurig grote arrays kunnen in de debugger weergegeven worden in een eigen 
venster 
•  Strings (character arrays) worden nu als tooltip in de debugger getoond 
•  SPI kan uitgeschakeld worden om de pins als I/O te gebruiken 
•  De seriele interface kan uitgechakeld worden om de pins als I/O te gebruiken 
•  De hex-waarde wordt nu extra als tooltip in de debugger getoond 
•  Nieuwe functie Thread_MemFree() 
•  Extra EEPROM routines voor woord- en floating point-toegang 
•  Tijdmeting met Timer_TickCount() 
•  #pragma commando's om fouten of waarschuwingen te maken 
•  voorgedefinieerd symbool in de preprocessor: __DATE__,__TIME__ 
__FILE__,__FUNCTIE__;__LINE__ 
•  Versienummer in splashscreen 
•  Aanvulling documentatie 
•  Interactieve grafiek bij "Jumper Application Board" in het helpbestand 
•  Nieuwe demo-programma's 
•  Ctrl-F1 start contexthulp 
Fout-correcties 
•  Een fout wordt geproduceerd wanneer er geen return-aanwijzing op het einde van een 
functie is 
•  Breakpoint markeringen worden niet meer gewist 
•  Limieten bij EEPROM-toegang nauwkeuriger gecontroleerd (interne overloop 
opgevangen) 
•  Enkele stap kan in de debugger niet meer te vroeg het volgende commando afzetten 
Versie 1.39 d.d. 09.06.2005 
Nieuwe features 
•  BASIC ondersteuning 
•  CompactC en BASIC kunnen in een project gemengd worden 
•  Aanvulling documentatie 
•  Lusoptimalisatie voor For – Next in BASIC 
•  Thread-info functie 
6 
•  Nieuwe demo-programma's 
Foutcorrecties 
•  Bij umlauten crasht de compiler niet meer 
•  Interne bytecode commando StoreRel32XT gecorrigeerd 
•  Offset in stringtabel verbeterd 
Versie 1.28  d.d. 26.04.2005 
•  Initiaalversie 

7 
                            Hoofdstuk   

8 
2     Installatie 
In dit hoofdstuk wordt de installatie van de hard- en software beschreven. 
2.1  Application Board 
Belangrijke aanwijzing voor het in- en uitbouwen van een Mega-module 
Voor de verbinding van de module en het Application Board moeten hoogwaardige 
insteekpinnen gebruikt worden, die een goed contact garanderen. De in- en uitbouw van een 
module mag uitsluitend met uitgeschakelde voedingsspanning (spanningsvrij) uitgevoerd 
worden, anders kunnen vernielingen op het Application board of de module ontstaan. Door 
het aantal contacten (40/64 pins) is er aardig wat kracht nodig om de module in- en uit te 
bouwen. Bij de inbouw moet u er op letten dat de module gelijkmatig, d.w.z. niet gekantelt, in 
de fitting gedrukt wordt. Leg het Application board hiertoe op een vlakke ondergrond. 
Monteer de module Mega32 met de juiste plaatsbepaling. Hiertoe de pin 1- markering in acht 
nemen. De opschriften van de module wijzen dan naar de bedieningselementen op het 
Application board. 
Inbouwrichting module Mega32 
Bij de module Mega 128 zijn de insteekpinnen zo geplaatst dat er geen verkeerde inbouw 
mogelijk is. Bij de uitbouw wordt de module voorzichtig met een geschikt gereedschap uit de 
fitting getild. Om de aansluitingen niet om te buigen moet het omhoogheffen op verschillende 
plaatsen van de module gebeuren. 

9 
Installatie van de USB driver 
Verbind het Application board met een netvoeding. U kunt hiervoor een standaard 
stekkernetvoeding met 9V/250mA gebruiken. U kunt de poling zelf uitkiezen, deze wordt 
door diodes steeds correct omgezet. Afhankelijk van extra schakelingen kan het later 
noodzakelijk zijn een netvoeding met een hogere capaciteit te gebruiken. Maak een 
verbinding tussen het Application board en uw PC met behulp van een USB kabel. Schakel 
het Application board in. 
 Een Windows besturingssysteem ouder dan Win98 SE (“Second Edition”) zal 
vermoedelijk geen betrouwbare USB verbinding mogelijk maken tussen PC en Application 
board. De USB drivers van Microsoft functioneren pas vanaf Win98 SE betrouwbaar met alle 
USB apparatuur. In een dergelijk geval kunnen we u alleen maar aanraden over te stappen 
naar een actueler besturingssysteem, of alleen de seriële verbinding naar het Application 
board te gebruiken. 
Als het Application board voor de eerste keer aangesloten is, zal er nog geen driver voor de 
FTDI chip aanwezig zijn. Onder Windows XP wordt dan het volgende venster getoond: 
U dient hier “Software uit een lijst of een bepaalde bron installeren” te kiezen en op 
“Volgende” te klikken. 

10 
Daarna dient u het pad naar de map van de driver aan te geven. Als u de software naar 
“C:\Programma’s” geïnstalleerd heeft, is het pad “C:\Programma’s\C-Control\FTDI USB 
Driver”. 
Het bericht “C-Control Pro USB Device hat den Windows-Logo-Test nicht bestanden…” 
(“C-Control Pro USB Device heeft de Windows-Logo-Test niet doorstaan…”) is heel normaal. 
Het betekent niet, dat de driver bij de Windows-Logo-Test gefaald heeft, maar dat de driver 
niet deelgenomen heeft aan de (tamelijk dure) test in Redmond.  

11 
Op deze plek drukt u gewoon op “Installatie voortzetten”. Na een paar seconden moet de 
driver dan volledig geïnstalleerd zijn.   
In de PC –software klikt u in het menu Opties op IDE en selecteert u het bereik “Interfaces”.  
Kies daar de communicatiepoort "USB0". 
Seriële aansluiting 
Vanwege de langzame overdrachtsnelheid van de seriële interface heeft een USB 
aansluiting de voorkeur. Als er echter vanwege de hardware geen USB interface 
beschikbaar is, kan de bootloader naar de seriële modus gebracht worden.  
Hiertoe moet bij het inschakelen van het Application board de toets SW1 ingedrukt gehouden 
worden. Daarna is de seriële bootloader modus geactiveerd. 
In de PC-software klikt u op het punt IDE in het menu opties en daar kiest u het bereik 
interfaces. Daar kiest u een communicatieport “COMx”, die bij de interface op de PC past, 
waarop het board aangesloten is. 
2.2  Software 
Als de meegeleverde CD in de computer gelegd wordt, dient de installer automatisch te 
starten, om de C-Control Pro software te installeren. Als dat niet gebeurt, bijv. omdat de 
“Autostart” –functie voor CD’s of DVD’s in Windows uitgeschakeld is, start dan de installer 
handmatig met “C-ControlSetup.exe” in het hoofdbestand van de CD-ROM. 
 Voor de installatie van de software en de installatie van de USB –drivers moet u als 
"Administrator" aangemeld zijn. Bij het normale werken met C-Control Pro is dit niet nodig. 
 Om de consistentie van de Demo-programma's te behouden, wordt bij een nieuwe 
installatie op een eerdere installatie de oude map van de demoprogramma's vervangen door 
een neiuwe. Om die reden raden wij u aan, uw eigen programma's buiten de map C-Control-
Pro te bewaren. 
Aan het begin van de installatie kiest u in welke taal de installatie uitgevoerd moet worden. 
Daarna kunt u uitzoeken, of C-Control Pro in de standaardmap geïnstalleerd moet worden, of 
dat u een eigen doelmap wilt aangeven. Aan het eind van de installatie wordt u nog 
gevraagd, of er iconen op uw desktop geïnstalleerd moeten worden. 
Als de installatieprocedure afgesloten is, kunt u naar wens eerst het “ReadMe” –bestand 
(korte introductie) weergeven, of de C-Control Pro ontwikkelingsomgeving starten. 

12 
                            Hoofdstuk  

13 
3      Hardware 
In dit hoofdstuk wordt de hardware beschreven die bij de C-Control Pro serie gebruikt wordt. 
Hier wordt de module beschreven van C-Control Pro Mega32 en C-Control Pro Mega128. 
Verdere paragrafen verklaren de opbouw en functie van het bijhorende Application board en 
de meegeleverde LCD module en het toetsenbord. 
3.1      Firmware 
Het besturingssysteem van de C-Control Pro bestaat uit de volgende componenten: 
•  Bootloader 
•  Interpreter 
Bootloader 
De bootloader staat altijd tot uw beschikking. Deze zorgt voor de USB of seriële 
communicatie met de IDE. Via regel–commando’s kunnen de interpreter en het 
toepassingsprogramma van de PC naar de Atmel Risc chip overgebracht worden. Als een 
programma gecompileerd wordt en overgebracht wordt naar de mega chip, dan wordt 
tegelijkertijd ook de actuele interpreter mee overgebracht. 
 Als er in plaats van de USB interface een seriële verbinding van de IDE naar de C-Control 
Pro module opgebouwd moet worden, dan dient u bij het inschakelen van de module de 
toets SW1 (Poort M32:D.2 resp. M128:E.4 op low) ingedrukt te houden. In deze modus wordt 
elke communicatie via de seriële interface geleid. Dit is praktisch, als de module al in de 
hardware applicatie is ingebouwd, en het Application board daarom niet ter beschikking 
staat. De seriële communicatie is echter aanzienlijk langzamer dan een USB verbinding. In 
de seriële modus worden de pins voor USB niet gebruikt en staan de gebruiker voor andere 
doeleinden ter beschikking. 
 Omdat de SW1 bij het starten van de module de seriele bootloader inleidt, mag op de 
Port M32:D.2 resp. M128:E.4 bij het inschakelen van de applicatie geen signaal aanwezig 
zijn. Deze poorten kunnen namelijk ook als uitgangen gebruikt worden. 
SPI uitschakeling (alleen Mega128) 
Een signaal op de SPI interface, bij het inschakelen van de module, kan de USB 
communicatie activeren. Om dit te voorkomen kan men PortG.4 (LED 2) bij het inschakelen 
op low zetten en daardoor wordt de SPI interface niet geconfigureerd. De SPI interface kan 
ook later door de interpreter handmatig met SPI Disable() uitgeschakeld worden. 
Interpreter 
De interpreter bestaat uit meerdere componenten: 
•  Bytecode interpreter 
•  Multithreading ondersteuning 
•  Interrupt -verwerking 
•  Toepassingsfuncties 
•  RAM en EEPROM interface 
14 
In de hoofdzaak werkt de interpreter de bytecode af, die door de compiler gegenereerd is. 
Verder zijn de meeste bibliotheekfuncties in de interpreter geïntegreerd, opdat het bytecode 
–programma bijv. toegang kan krijgen tot hardware-poorten. De RAM en EEPROM interface 
wordt gebruikt door de debugger in de IDE, om toegang te krijgen tot variabelen, als de 
debugger gestopt is bij een breakpoint.  
Autostart 
Als er geen USB interface is aangesloten, en u heeft bij het inschakelen niet op SW1 gedrukt 
om in de seriële bootloadermodus te komen, dan wordt de bytecode (voor zover aanwezig) 
in de interpreter gestart. Dat wil zeggen, als de module in een hardware applicatie 
ingebouwd wordt, dan is het aanleggen van de voedingsspanning voldoende om het 
toepassingsprogramma automatisch te starten. 
3.2        Mega32 
Mega32 overzicht 
De microcontroller ATmega32 komt uit de AVR –familie van ATMEL. Dit betreft een low-
power microcontroller met Advanced RISC Architecture. Hier volgt een korte samenstelling 
van de hardware resources: 
•  131 Powerful instructions – Most Single-clock Cycle Execution 
•  32 x 8 General purpose Working Registers 
•  Up to 16 MIPS Throughput at 16 MHz 
•  Nonvolatile Program and Data Memories 
  32K Bytes of In-System Self-Programmable Flash 
Endurance: 10,000 Write/Erase Cycles 
In-System Programming by On-chip Boot Program 
•  1024 Bytes EEPROM 
•  2K Byte Internal SRAM 
•  Peripheral Features: 
Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes 
One 16-bit Timer/Counter with Separate Prescaler, Compare mode and Capture 
Mode 
Four PWM Channels 
8-channel, 10-bit ADC 
8 Single-ended Channels 
2 Differential Channels with Programmable Gain at 1x, 10x or 200x 
Byte-oriented Two-wire Serial Interface (I2C) 
Programmable Serial USART 
On-chip Analog Comparator 
External and Internal Interrupt Sources 
32 Programmable I\O Lines 
•  40-pin DIP 
•  Operating Voltages 4.4 – 5.5 V 
15 
3.2.1       Module 
Modulegeheugen 
In de C-Control Pro module zijn 32kB FLASH, 2kB EEPROM en 2kB SRAM geïntegreerd. 
Op het Application board bevindt zich een extra EEPROM met een geheugen van 8kB. Dit 
EEPROM kan aangesproken worden via een 12C interface. 
Aanwijzing: U vindt gedetailleerde informatie in de PDF-bestanden van de IC –fabrikanten op 
de C-Control Pro software CD. 
ADC  Referentiespanning –opwekking 
De microcontroller beschikt over een analoog –digitaal –omvormer met een resolutie van 
10Bit. Dit betekent dat gemeten spanningen als gehele getallen van 0 tot 1023 weergegeven 
kunnen worden. De referentiespanning voor de ondergrens is het GND- niveau, dus 0V. De 
referentiespanning voor de bovengrens kan door de gebruiker gekozen worden:  
* 5V voedingsspanning (VCC) 
* interne referentiespanning van 2,56V 
* externe referentiespanning bijv. 4,096V gegenereerd door referentiespannings –IC 
Als x een digitale meetwaarde is, wordt de desbetreffende spanningswaarde als volgt 
berekend: 
u = x * referentiespanning / 1024 
Genereren van klokfrequentie 
Het genereren van de klokfrequentie gebeurt door een 14,7456MHz kwartsoscillator. Alle 
tijdprocedures van de controller zijn van deze klok-frequentie afgeleid.  
Reset 
Een reset zorgt voor het terugkeren van het microcontroller –systeem naar een 
gedefinieerde begintoestand. De C-Control Pro module kent in principe twee reset –bronnen: 
•  Power-On -Reset: wordt automatisch uitgevoerd na het inschakelen van de 
voedingsspanning 
•  Hardware -Reset : wordt uitgevoerd als de RESET (pin 9) van de module op “low” 
getrokken en weer losgelaten wordt, bijv. door het kort indrukken van de aangesloten 
reset –toets RESET1 (SW3). 
Door een “Brown-Out-Detection” wordt voorkomen dat de controller bij het te laag worden 
van de voedingsspanning in een ongedefinieerde toestand terecht kan komen. 
Digitale poorten (PortA, PortB, PortC, PortD) 
De C-Control Pro module beschikt over vier digitale poorten met elk 8 pinnen. Op de digitale 
poorten kunnen bijv. toetsen met pull -up weerstanden, digitale –IC's, opto–koppelingen of 
driverschakelingen voor relais aangesloten worden. De poorten kunnen apart, d.w.z. pin- of 
bytewijze aangesproken worden. Elke pin kan of uitgang of ingang zijn.  

16 
 Schakel nooit direct twee poorten samen, die gelijktijdig als uitgang moeten werken! 
Digitale ingangpinnen zijn hoogohmig of met een interne pull-up weerstand geschakeld en 
zetten een aanwesend spanningssignaal om in een logische waarde. Voorwaarde daarvoor 
is, dat het spanningsignaal zich binnen het voor TTL – resp. CMOS –IC's gedefinieerde 
bereiken voor low -  of high- niveau bevindt. In de verdere bewerking in het programma 
worden de logische waarden van aparte ingangspoorten als 0 (“low”) of –1 (“high”) 
weergegeven. Pinnen nemen waarden van 0 of 1 aan, bytepoorten 0 tot 255. 
Uitgangspoorten kunnen via een interne driverschakeling digitale spanningssignalen 
afgeven. Aangesloten schakelingen kunnen een bepaalde stroom uit de poorten trekken (bij 
high niveau) resp. deze poorten er mee voeden (bij low niveau).  
 Let op de maximaal toelaatbare laststroom voor een afzonderlijke poort en voor alle 
poorten bij elkaar. Een overschrijding van de maximale waarden kan leiden tot vernieling van 
de C-Control Pro module. Na de reset is in eerste instantie elke digitale poort als 
ingangspoort geconfigureerd. Via bepaalde commando’s kan de datarichting omgeschakeld 
worden. 
  Het is belangrijk om vóór de programmering de pintoewijzing van M32 en M128 te 
bestuderen, aangezien belangrijke functies van de programma- ontwikkeling (bijv. de USB –
interface van het Application board) op bepaalde poorten liggen. Als deze poorten 
omgeprogrammeerd worden of als de bijbehorende jumpers op het Application board niet 
meer gezet zijn, kan het gebeuren dat de ontwikkelingsomgeving geen programma’s meer 
kan overbrengen naar de C-Control Pro. Ook in- en uitgangen van de timer, A/D omvormer, 
I2C en de seriële interface zijn met bepaalde poortpinnen verbonden. 
PLM -ports 
Er zijn twee timers beschikbaar voor de PLM, Timer_0 met 8 bit en Timer_1 met 16 bit. Deze 
kunnen gebruikt worden voor de D/A –omvorming, voor het aansturen van servomotoren in 
de modelbouw of voor het afgeven van audio -frequenties. Een pulslengte –gemoduleerd 
signaal heeft een periode van N zogenaamde “Ticks”. De duur van een tick is de tijdbasis. 
Als u de uitvoerwaarde van een PLM –poort op X zet, dan houdt deze gedurende X ticks van 
een periode high niveau en valt voor de rest van de periode op low. Voor de programmering 
van de PLM –kanalen zie Timer. 
De PLM –kanalen voor Timer_0 en Timer_1 hebben een onafhankelijke tijdbasis en 
periodelengte. In toepassingen voor pulsbreedte –gemoduleerde digitaal- analoog -
omvorming worden tijdbasis en periodelengte eenmalig ingesteld en daarna wordt alleen de 
uitvoerwaarde veranderd. De PLM –poorten zijn vanwege hun elektrische eigenschappen 
digitale poorten. Let op de technische randvoorwaarden voor digitale poorten (max. stroom).

17 
Technische specificaties module  
Aanwijzing: u vindt gedetailleerde informatie in de PDF –bestanden van de IC –fabrikanten 
op de C-Control Pro software CD. 
Alle spanningen hebben betrekking op gelijkspanning (DC). 
 Omgevingscondities   
Bereik van de toelaatbare omgevingstemperatuur      0 °C … 70 °C 
Bereik van de toelaatbare relatieve luchtvochtigheid 
van de omgeving      20% …60% 
Voedingsspanning   
Bereik van de toelaatbare voedingsspanning  4.5V … 5,5V 
Stroomverbruik van de module zonder externe lasten
ca. 20mA 
Puls   
Pulsfrequentie (kwarts –oscillator)  14,7456MHz 
Mechanische deel   
Buitenafmetingen zonder pinnen ca.  53 mm x 21 mm x 8 mm
Gewicht  ca. 90g 
Pinraster  2,54mm 
Aantal pins (2 rijen)  40 
Afstand van de rijen  15,24mm 
Poorten   
Max. toelaatbare stroom uit digitale poorten 
± 20mA 
Toelaatbare totaal van de stromen op digitale poorten
200mA 
Toelaatbare ingangsspanning op poortpins 
(digitaal en A/D)  -0,5V … 5,5V 
Interne pull –up weerstanden (uitschakelbaar)  20 – 50 kOhm 
3.2.2  Application Board 
USB 
Het Application board beschikt over een USB interface voor het laden en debuggen van het 
programma. Door de hoge datasnelheid van deze interface zijn de dataoverdracht –tijden 
aanzienlijk korter vergeleken met de seriële interface. De communicatie vindt plaats via een 
USB –controller van FDTI en een AVR Mega8 controller. De mega8 heeft een eigen reset –
toets (SW5). Tijdens het USB gebruik wordt de status van de interface getoond via twee  

18 
lichtdiodes (LD4 rood, LD5 groen). Als alleen de groene LED oplicht, dan is de USB interface 
klaar voor gebruik. Als er een dataoverdracht plaatsvindt, branden beide LEDs. Dit geldt ook 
voor de debug –modus. Het knipperen van de rode LED geeft een foutconditie aan. Voor de 
USB –communicatie wordt de SPI –interface van de mega32 gebruikt (PortB.4 t/m PortB.7, 
PortA.6, PortA.7) en deze moeten via de desbetreffende jumpers verbonden zijn. 
Aanwijzing: U vindt meer gedetailleerde informatie over de Mega8 in de PDF –bestanden 
van de IC –fabrikanten op de C-Control Pro software CD. 
Aan - /Uitschakelaar      
De schakelaar SW4 bevindt zich aan de voorkant van het Application board en is bedoeld 
voor het in -/uitschakelen van de spanningvoorziening. 
Lichtdiodes 
Er zijn 5 lichtdiodes beschikbaar. LD3 (groen) bevindt zich aan de voorkant onder de DC –
aansluiting en brandt, als er voedingsspanning aanwezig is. LD4 en LD5 geven de status 
van de USB interface aan (zie "USB" hiervoor). De groene lichtdiodes LD 1 en LD2 bevinden 
zich naast de vier toetsen en staan de gebruiker vrij ter beschikking. Ze zijn via een 
voorweerstand aan VCC gelegd. Via een jumper kan LD1 aangesloten worden op PortD.6 en 
LD2 op PortD.7. De lichtdiodes branden als de desbetreffende poortpin low (GND) is.  
Toetsen 
Er zijn vier toetsen gepland. Met SW3 (RESET1) wordt bij de Mega32 een reset geactiveerd 
en met SW5 (RESET2) een reset voor de mega8. Over de toetsen SW1 en SW2 kan de 
gebruiker beschikken. SW1 kan via een jumper met PortD.2 verbonden worden en op 
dezelfde manier SW2 met PortD.3. Er bestaat de mogelijkheid SW1/2 of tegen GND of tegen 
VCC te schakelen. Deze keuzemogelijkheid wordt vastgelegd met JP1 resp. JP2. Om bij een 
open schakelaar een gedefinieerd niveau op de ingangspoort te krijgen, moet de 
desbetreffende pull –up ingeschakeld zijn (zie hoofdstuk Digitale poorten).  
  Als u op SW1 drukt bij het inschakelen van het board, wordt de seriële bootloader –
modus geactiveerd. 
LCD 
Er kan een LCD –module met het Application board verbonden worden. Deze laat 2 rijen met 
elk 8 tekens zien. Ook anders georganiseerde displays kunnen in principe via deze interface 
gebruikt worden. Elk teken bestaat uit een monochrome matrix van 5x7 punten. Een 
knipperende cursor onder één van de tekens kan de actuele uitvoerpositie aanduiden. Het 
besturingssysteem biedt een eenvoudige software –interface voor uitvoer naar het display. 
Het display wordt aangesloten op de stekker X14 (16-polig, twee rijen). Door een 
mechanische bescherming tegen verkeerde poling is het verkeerd insteken niet mogelijk. 
De gebruikte LCD module is van het type Hantronix HDM08216L-3. Verdere informatie vindt 
u op de Hantronix website http://www.hantronix.com en onder datasheets op de CD-ROM. 

19 
LCD –contrast (LCD-ADJ) 
U heeft de beste zichtbaarheid van de tekens als u er frontaal naar kijkt. Eventueel moet u 
het contrast een beetje bijregelen. Het contrast kan ingesteld worden via de draaiweerstand 
PT1.  
Toetsenbord 
Voor het invoeren van data heeft de gebruiker een 12-delig toetsenbord (0 … 9, *, #) ter 
beschikking (X15: 13-polige stekker). Het toetenbord is 1 uit 12 georganiseerd, d.w.z. aan 
iedere toets is een leiding toegewezen. De toetsinformatie wordt serieel via een 
schuifregister ingelezen. Als er geen toetsenbord gebruikt wordt, kunnen de 12 ingangen als 
extra digitale ingangen gebruikt worden. Het toetsenbord beschikt over een 13-polige 
aansluiting (één rij) en wordt met X15 zo verbonden dat het toetsenveld naar het Application 
board wijst. 
12C-interface 
Via deze interface kunnen seriële data met hoge snelheid verzonden worden. Er zijn 
daarvoor slechts twee signaalleidingen nodig. De overdracht gebeurt via het 12C –protocol. 
Voor het effectieve gebruik van deze interface worden speciale functies ter beschikking 
gesteld (zie de softwarebeschrijving 12C). 
12C SCL  12C-bus pulsleiding    PortC.0 
12C SDA  12C-bus dataleiding      PortC.1 
Voedingsspanning (POWER, 5 Volt, GND) 
Het Application board wordt via een stekkernetvoeding (9V/250mA) van spanning voorzien. 
Afhankelijk van de extra schakelingen van het Application board kan het later nodig zijn een 
netvoeding met een hogere capaciteit te gebruiken. Een vaste spanningsregelaar produceert 
de interne gestabiliseerde voedingsspanning van 5V. Alle delen van de schakeling op het 
Application board worden met deze spanning gevoed. Door de capaciteitsreserve van de 
netvoeding staan deze 5V ook ter beschikking als voeding voor externe IC's. 
 Let op de maximaal afneembare stroom. Een overschrijding kan leiden tot vernieling! 
Vanwege het relatief hoge stroomverbruik van het Application board in het bereik van 125mA 
is deze niet aan te bevelen voor toepassing in permanent op batterijen werkende apparaten. 
Let op de aanwijzing betreffende het kort uitvallen van de voedingsspanning (“zie Reset -
gedrag”). 
Seriële interface 
De microcontroller Atmega32 bezit voor wat betreft de hardware over een asynchrone seriële 
interface volgens RS232 standaard. Het formaat kan vastgelegd worden bij de initialisering 
van de interface (databits, pariteitbit, stopbit). Op het Application board 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 niveau- omvormer- IC beschikt over een verhoogde 
bescherming tegen spanningspieken. Spanningspieken kunnen in een elektromagnetische 
omgeving, bijv. in industriële toepassingen, in de interfacekabel geïnduceerd worden en 
aangesloten schakelcircuits vernielen. D.m.v. jumpers kunnen de datakabels RxD en TxD 
met de controller PortD.0 en PortD.1 verbonden worden. In rusttoestand (geen actieve 
dataoverdracht) kunt u op pin TxD een negatieve spanning van een paar volt tegen GND 
meten. RxD is hoogohmig. Op de 9-polige SUB-D bus van het Application board ligt RxD aan 
pin 3 en TxD aan pin 2. De GND –aansluiting ligt op pin 5. Er worden voor de seriële 
dataoverdracht geen handshake- signalen gebruikt.  

20 
Een kabelverbinding met aansluiting aan de NRZ –pinnen TxD, RxD, RTS mag maximaal 10 
meter lang zijn. U dient waar mogelijk afgeschermde normkabels te gebruiken. Bij langere 
kabels of onafgeschermde kabels kunnen storende invloeden de dataoverdracht 
beïnvloeden. Sluit alleen verbindingskabels aan waarvan de aansluitbezetting bekend is. 
 Verbind nooit de seriële zenduitgangen van twee apparaten met elkaar! U herkent de 
zenduitgangen meestal aan de negatieve uitgangsspanning in rusttoestand. 
Testinterfaces 
De 4-polige stiftstrip X16 wordt alleen voor interne testdoeleinden gebruikt en zal ook niet op 
alle application boards gemonteerd worden. Voor de gebruiker is deze stiftstrip zonder 
betekenis. 
Een andere testinterface is de 6-polige stiftstrip (twee rijen met elk 3 pinnen) bij JP4. Ook 
deze stiftstrip is alleen voor intern gebruik en wordt op latere boardseries waarschijnlijk niet 
meer gemonteerd.  
Technische specificaties application board 
Aanwijzing: gedetailleerde informatie vindt u in de PDF- bestanden van de IC –fabrikanten 
op de C-Control Pro software CD.    
Alle spanningsaanduidingen hebben betrekking op gelijkspanning (DC). 
 Mechaniek   
Buitenafmetingen ca.   160 mm x 100 mm 
Pinraster bedradingsveld  2,54 mm 
Omgevingscondities   
Bereik van de toelaatbare omgevingstemperatuur  0°C … 70° C 
Bereik van de toelaatbare omgevingsluchtvochtigheid
20% … 60% 

21 
Voedingsspanning   
Bereik van de toelaatbare voedingsspanning  8V … 24V 
Stroomverbruik zonder externe lasten  ca. 125mA 
Max. toelaatbare permanente stroom uit 
gestabiliseerde 5V-spanning  200mA 
3.2.3      Pintoewijzing 
PortA t/m PortD worden voor directe pin-functies (bijv. Port WriteBit) van 0 tot 31 geteld, zie 
“Poortbit”. 
Pinbezetting voor application board Mega32  
PIN
Poort
Poort  Poortbit
Naam  Schakelschema
Opmeringen 
1  PB0  PortB.0
8  T0    Ingang timer/counter0 
2  PB1  PortB.1
9  T1    Ingang timer/counter1 
3  PB2  PortB.2
10  INT2/AIN0
  (+) analoge comparator, 
externe interrupt2 
4  PB3  PortB.3
11  OTO/AIN1
  (-)analoge comparator, 
uitgang timer0 
5  PB4  PortB.4
12    SS  USB -communicatie 
6  PB5  PortB.5
13    MOSI  USB –communicatie 
7  PB6  PortB.6
14    MISO  USB –communicatie 
8  PB7  PortB.7
15    SCK  USB –communicatie 
9        RESET     
10        VCC     
11        GND     
12        XTAL2    Oscillator: 14,7456MHz 
13        XTAL1    Oscillator: 14,7456MHz 
14  PD0  PortD.0
24  RXD  EXT-RXD  RS232, seriële interface 
15  PD1  PortD.1
25  TXD  EXT-TXD  RS232, seriële interface 
16  PD2  PortD.2
26  INT0  EXT-T1  SW1 (toets 1); 
externe interrupt0 
17  PD3  PortD.3
27  INT1  EXT-T2  SW2 (toets 2): 
externe interrupt1 
18  PD4  PortD.4
28  OT1B  EXT-A1  Uitgang B timer 1 
19  PD5  PortD.5
29  OT1A  EXT-A2  Uitgang A timer 1 
20  PD6  PortD.6
30  ICP  LED1  Lichtdiode; input capture
pin; puls -/periodemeting 
21  PD7  PortD.7
31    LED2  Lichtdiode 
22  PC0  PortC.0
16  SCL  EXT-SCL  12C.interface 
23  PC1  PortC.1
17  SDA  EXT-SDA  12C-interface 
24  PC2  PortC.2
18       
25  PC3  PortC.3
19       
26  PC4  PortC.4
20       
27  PC5  PortC.5
21       
28  PC6  PortC.6
22       
29  PC7  PortC.7
23       
30        AVCC     
31        GND     
32        AREF     
33  PA7  PortA.7
7  ADC7  RX_BUSY  ADC7 ingang: 

22 
USB-communicatie 
34  PA6  PortA.6
5  ADC6  TX_REQ  ADC6 ingang: 
USB-communicatie 
35  PA5  PortA.5
5  ADC5  KEY_EN  ADC5 ingang; 
LCD/toetsenbord 
interface 
36  PA4  PortA.4
4  ADC4  LCD_EN  ADC4 ingang; 
LCD/toetsenbord 
interface 
37  PA3  PortA.3
3  ADC3  EXT_SCK  ADC3 ingang; 
LCD/toetsenbord 
interface 
38  PA2  PortA.2
5  ADC2  EXT_DATA  ADC2 ingang; 
LCD/toetsenbord 
interface 
39  PA1  PortA.1
1  ADC1    ADC1 ingang 
40  PA0  PortA.0
0  ADC0    ADC0 ingang 
3.2.4           Jumper Application board 
Jumper 
Met behulp van jumpers kunnen bepaalde opties geselecteerd worden. Dit geldt voor 
bepaalde poorten welke speciale functies bezitten (zie tabel pintoewijzing M32). Bijvoorbeeld 
is de seriële interface via de pinnen PortD.0 en PortD.1 gerealiseerd. Als de seriële interface 
niet gebruikt wordt, kunnen de desbetreffende jumpers verwijdert worden en deze pinnen zijn 
dan voor andere functies beschikbaar. Naast de jumpers voor deze poorten zijn er nog extra 
jumpers, deze worden hierna beschreven. 
Poorten A t/m D 
De bij de Mega32- module beschikbare poorten zijn in deze grafiek ingetekend. Daarbij is de 
rechter kant met de module verbonden en de linker kant verbindt naar componenten van het 
Application board. Als een jumper getrokken wordt, onderbreekt dit de verbinding naar het 
Application board 
JP1 en JP2 
Deze jumpers zijn toegewezen aan de toetsen SW1 en SW2. Er bestaat de mogelijkheid de 
toetsen te laten werken tegen GND of VCC. In de standaardinstelling schakelen de toetsen 
tegen GND. 

23 
Jumperposities bij uitlevering 
JP4 
JP4 is bedoeld voor het omschakelen van de voedingsspanning (netvoeding of USB). Het 
Application board moet gevoed worden via netvoeding en spanningsregelaar (toestand bij 
uitlevering). De maximale stroomlevering van het USB interface is kleiner dan door een 
netzvoeding. Een overschrijding kan leiden tot beschadiging van de USB interface van de 
computer. 
JP6 
Bij gebruik van het display kan met JP6 de verlichting (back light) uitgeschakeld worden. 
PAD3 
PAD3 (rechts naast de module, onder de blauwe opschrift) wordt als ADC_VREF_EXT voor 
de functies ADC Set en ADC SetInt benodigd. 

24 
3.2.5       Schakelschema’s 
De schakelschema's zijn ook als pdf-bestand op de installatie-CD. 
3.2.5.1     Mega 32 module 

25 
3.2.5.2          Application board 

26 

27 

28 
3.2.5.3          Onderdelenschema 
29 
3.3       Mega 128 
Mega128 overzicht 
De microcontroller Atmega 128 komt uit de AVR –familie van ATMEL. Hij is een low-power 
microcontroller met Advanced RISC Architecture. Hier volgt een korte samenstelling van de 
hardware resources: 
•  133 Powerful Instructions – Most Single Clock Cycle Execution 
•  32 x 8 General Purpose Working Registers + Peripheral Control Registers 
•  Fully Static Operation 
•  Up to 16 MIPS Throughput at 16 MHz 
•  On-chip 2-cycle Multiplier 
•  Nonvolatile Program and Data Memories 
128K Bytes of In-System Reprogrammable Flash 
Endurance: 10,000 Write/Erase Cycles 
Optional Boot Code Section with Independent Lock Bits 
In-System Programming by On-chip Boot Program 
•  True Read-While-Write Operation 
4K Bytes EEPROM 
Endurance: 100,000 Write/Erase Cycles 
4K Bytes Internal SRAM 
Up to 64K Bytes Optional External Memory Space 
Programming Lock for Software Security 
SPI Interface for In-System Programming 
•  JTAG (IEEE std. 1149.1 Compliant) Interface 
Boundary-scan Capabilities According to the JTAG Standard 
Extensive On-chip Debug Support 
       Programming of Flash, EEPROM, Fuses and Lock Bits through the JTAG Interface 
•  Peripheral Features 
Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes 
Two Expanded 16-bit Timer/Counters with Separate Prescaler, Compare Mode and 
Capture Mode 
Real Time Counter with Separate Oscillator 
Two 8-bit PWM Channels 
6 PWM Channels with Programmable Resolution from 2 to 16 Bits 
Output Compare Modulator 
8-channel, 10-bit ADC 
8 Single-ended Channels 
7 Differential Channels 
2 Differential Channels with Programmable Gain at 1x, 10x, or 200x 
Byte-oriented Two-wire Serial Interface 
Dual Programmable Serial USARTs 
Master/Slave SPI Serial Interface 
Programmable Watchdog Timer with On-chip Oscillator 
On-chip Analog Comparator 
•  Special Microcontroller Features 
Power-on Reset and Programmable Brown-out Detection 
Internal Calibrated RC Oscillator 
External and Internal Interrupt Sources 
Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby, 
and Extended Standby 

30 
Software Selectable Clock Frequency 
ATmega103 Compatibility Mode Selected by a Fuse 
Global Pull-up Disable 
•  I/O and Packages 
53 Programmable I/O Lines 
64-lead TQFP and 64-pad MLF 
•  Operating Voltages 
2.7 - 5.5V for ATmega128L 
4.5 - 5.5V for ATmega128 
3.3.1      Module 
Pinlayout van de module 
De Mega128 module wordt geleverd op 4 dubbele rijen (2x8) vierkante pinnen. Voor een 
hardware applicatie moeten overeenkomstige busstrippen in het onderstaande rasterformaat 
ingericht worden: 
In de afbeelding worden de busstrippen X1-X4 aangegeven en de eerste twee pinnen van de 
busstrippen. Pin 1 van strip X1 komt overeen met de aansluiting X1_1 (zie Mega128 
Pintoewijzing). 
Modulegeheugen 
In de C-Control Pro 128 module zijn 128kB FLASH, 4kB EEPROM en 4kB SRAM 
geïntegreerd. Op het Application board bevindt zich een extra EEPROM met een geheugen 
van 8kB en een SRAM met 64kB geheugen. Het EEPROM kan aangesproken worden via 
een 12C interface. 
Aanwijzing: U vindt gedetailleerde informatie in de PDF-bestanden van de IC –fabrikanten op 
de C-Control Pro software CD. 

31 
ADC  Referentiespanning –opwekking 
De microcontroller beschikt over een analoog –digitaal –omvormer met een resolutie van 
10Bit. Dit betekent dat gemeten spanningen als gehele getallen van 0 tot 1023 weergegeven 
kunnen worden. De referentiespanning voor de ondergrens is het GND- niveau, dus 0V. De 
referentiespanning voor de bovengrens kan door de gebruiker gekozen worden:  
* 5V voedingsspanning (VCC) 
* interne referentiespanning van 2,56V 
* externe referentiespanning bijv. 4,096V gegenereerd door referentiespannings –IC 
Als x een digitale meetwaarde is, wordt de desbetreffende spanningswaarde als volgt 
berekend: 
u = x * referentiespanning / 1024 
Genereren van klokfrequentie 
Het genereren van de klokfrequentie gebeurt door een 14,7456MHz kwartsoscillator. Alle 
tijdprocedures van de controller zijn van deze klokfrequentie afgeleid. 
Reset 
Een reset zorgt voor het terugkeren van het microcontroller –systeem naar een gede-
finieerde begintoestand. De C-Control Pro module kent in principe twee reset –bronnen: 
•  Power-On -Reset: wordt automatisch uitgevoerd na het inschakelen van de voedings-
spanning 
•  Hardware -Reset : wordt uitgevoerd als de RESET (X2_3) van de module op “low” 
getrokken en weer losgelaten wordt, bijv. door het kort indrukken van de aangesloten  
reset –toets RESET1 (SW3). 
Door een “Brown-Out-Detection” wordt voorkomen dat de controller bij het te laag worden 
van de voedingsspanning in een ongedefinieerde toestand terecht kan komen. 
Digitale poorten (PortA, PortB, PortC, PortD, PortE, PortF, PortG) 
De C-Control Pro module beschikt over zes digitale poorten met elk 8 pinnen en een digitale 
poort met 5 pinnen. Op de digitale poorten kunnen bijv. toetsen met pull -up weerstanden, 
digitale IC's, opto-koppelingen of driverschakelingen voor relais aangesloten worden. De 
poorten kunnen apart, d.w.z. pinwijze of bytewijze aangesproken worden. Elke pin kan of 
uitgang of ingang zijn.  
 Schakel nooit direct twee poorten samen, die gelijktijdig als uitgang moeten werken! 
Digitale ingangspinnen zijn hoogohmig of met een interne pull –up weerstand geschakeld en 
zetten een aanliggend spanningssignaal om in een logische waarde. Voorwaarde daarvoor 
is, dat het spanningsignaal zich binnen de voor TTL – resp. CMOS –IC's gedefinieerde 
bereiken voor Low - of High niveau bevindt. In de verdere bewerking in het programma 
worden de logische waarden van aparte ingangspoorten als 0 (“low”) of –1 (“high”) 
weergegeven. Pinnen nemen waarden van 0 of 1 aan, bytepoorten 0 tot 255. 
Uitgangspoorten kunnen via een interne driverschakeling digitale spanningssignalen 
afgeven. Aangesloten schakelingen kunnen een bepaalde stroom uit de poorten trekken (bij 
High niveau) resp. deze poorten er mee voeden (bij Low niveau).  
 Let op de maximaal toelaatbare laststroom voor een aparte poort en voor alle poorten bij 
elkaar. Een overschrijding van de maximale waarden kan leiden tot vernieling van de C-

32 
Control Pro module. Na de reset is in eerste instantie elke digitale poort als ingangspoort 
geconfigureerd. Via bepaalde commando’s kan de datarichting omgeschakeld worden. 
 Het is belangrijk om vóór de programmering de pintoewijzing M32 en M128 te bestude-
ren, aangezien belangrijke functies van de programma –ontwikkeling (bijv. de USB –interface 
van het Application board) op bepaalde poorten liggen. Als deze poorten omgeprogram-
meerd worden of als de bijbehorende jumpers op het Application board niet meer gezet zijn, 
kan het gebeuren dat de ontwikkelingsomgeving geen programma’s meer kan overbrengen 
naar de C-Control Pro. Ook in- en uitgangen van de timer, A/D omvormer, I2C en de seriële 
interface zijn met bepaalde pinnen verbonden. 
PLM -poorten 
Er staan twee timers ter beschikking voor de PLM, Timer_0 met 8 bit en Timer_1 en Timer_3 
met  elk 16 bit. Deze kunnen gebruikt worden voor de D/A –omvorming, voor het aansturen 
van servomotoren in de modelbouw of voor het afgeven van geluidsfrequenties. Een 
pulslengte –gemoduleerd signaal heeft een periode van N zogenaamde “Ticks”. De duur van 
een tick is de tijdbasis. Als men de uitvoerwaarde van een PLM –poort op X stelt, dan houdt 
deze geduren-de X ticks van een periode high niveau en valt voor de rest van de periode op 
low. Voor de programmering van de PLM –kanalen zie Timer. 
De PLM –kanalen voor Timer_0 en Timer_1 en Timer_3 hebben een onafhankelijke tijdbasis 
en periodelengte. In toepassingen voor pulsbreedte –gemoduleerde digitaal – analoog -
omvorming worden tijdbasis en periodelengte eenmalig ingesteld en daarna wordt alleen de 
afgiftewaarde veranderd. De PLM –poorten zijn vanwege hun elektrische eigenschappen 
digitale poorten. Let op de technische randvoorwaarden voor digitale poorten (max. stroom). 
Technische specificaties module  
Aanwijzing: u vindt gedetailleerde informatie in de PDF –bestanden van de IC –fabrikanten 
op de C-Control Pro software CD. 
Alle spanningen hebben betrekking op gelijkspanning (DC). 
Omgevingscondities   
Bereik van de toelaatbare omgevingstemperatuur          0 °C … 70 °C 
Bereik van de toelaatbare relatieve luchtvochtigheid 
van de omgeving           20% …60% 

33 
Voedingsspanning   
Bereik van de toelaatbare voedingsspanning  4.5V … 5,5V 
Stroomverbruik van de module zonder externe lasten
ca. 20mA 
Puls   
Pulsfrequentie (kwarts –oscillator)  14,7456MHz 
Mechanische deel   
Buitenafmetingen zonder pinnen ca.  40 mm x 40 mm x 8 mm
Gewicht  ca. 90g 
Pinraster  2,54mm 
Aantal pinnen (2 rijen)  64 
Poorten   
Max. toelaatbare stroom uit digitale poorten 
± 20mA 
Toelaatbare totaal- stroom aan digitale poorten  200mA 
Toelaatbare ingangsspanning op poortpinnen 
(digitaal en A/D)  -0,5V … 5,5V 
Interne pull –up weerstanden (uitschakelbaar)  20 – 50 kOhm 
3.3.2            Application Board 
USB 
Het Application board beschikt over een USB interface voor het laden en debuggen van het 
programma. Door de hoge datasnelheid van deze interface zijn de dataoverdrachttijden aan-
zienlijk korter vergeleken met de seriële interface. De communicatie vindt plaats via een USB 
–controller van FDTI en een AVR Mega8 controller. De Mega8 heeft een eigen reset –toets 
(SW5). Tijdens het USB gebruik wordt de status van de interface getoond via twee licht-
diodes (LD4 rood, LD5 groen). Als alleen de groene LED oplicht, dan is de USB interface 
bedrijfsklaar. Als er een dataoverdracht plaatsvindt, branden beide LED's. Dit geldt ook voor 
de debug –modus.Het knipperen van de rode LED geeft een foutconditie aan. Voor de USB- 
communicatie wordt de SPI –interface van de Mega128 gebruikt (PortB. 0 t/m PortB.4, 
PortE.5) en deze moeten via de desbetreffende jumpers verbonden zijn. 
Aanwijzing: U vindt meer gedetailleerde informatie over de Mega8 in de PDF –bestanden 
van de IC –fabrikant op de C-Control pro software CD. 
Aan - /Uitschakelaar 
De schakelaar SW4 bevindt zich aan de voorkant van het Application board en dient voor het 
in -/uitschakelen van de spanningvoorziening. 

34 
Lichtdiodes 
Er zijn 5 lichtdiodes beschikbaar. LD3 (groen) bevindt zich aan de voorkant onder de DC –
aansluiting en brandt, als er voedingsspanning aanwezig is. LD4 en LD5 geven de status 
van de USB interface aan (zie par. USB). De groene lichtdiodes LD1 en LD2 bevinden zich 
naast de vier toetsen en staan de gebruiker vrij ter beschikking. Ze zijn via een 
voorweerstand aan VCC gelegd. Via jumper kan LD1 aangesloten worden op PortG.3 en 
LD2 op PortG.4. De lichtdiodes branden als de desbetreffende poort pin low (GND) is.  
Toetsen 
Er zijn vier toetsen gepland. Met SW3 (RESET1) wordt bij de Mega128 een reset 
geactiveerd en met SW5 (RESET2) een reset voor de Mega8. De toetsen SW1 en SW2 
staan ter beschikking van de gebruiker. SW1 kan via een jumper met PortE.4 verbonden 
worden en op dezelfde manier SW2 met PortE.6. Er bestaat de mogelijkheid SWS1/2 of 
tegen GND of tegen VCC te schakelen. Deze keuzemogelijkheid wordt vastgelegd meet JP1 
resp. met JP2. Om bij een open schakelaar een gedefinieerd niveau op de ingangspoort te 
hebben, moet de desbetreffende pull –up ingeschakeld zijn (zie par. Digitale poorten).  
  Als u op SW1 drukt bij het inschakelen van het board, wordt de seriële bootloader –
modus geactiveerd. 
LCD 
Er kan een LCD –module met het Application board verbonden worden. Deze geeft 2 regels 
met elk 8 tekens weer. Ook anders georganiseerde displays kunnen in principe via deze 
interface gebruikt worden. Elk teken bestaat uit een monochrome matrix van 5x7 punten. 
Een knipperende cursor onder één van de tekens kan de actuele uitvoerpositie aanduiden. 
Het besturingssysteem biedt een eenvoudige software –interface voor uitvoer naar het 
display. Het display wordt aangesloten op de stekker X14 (16-polig, twee rijen). Door een 
mechanische bescherming tegen verkeerde polariteit is het verkeerd insteken niet mogelijk. 
De gebruikte LCD module is van het type Hantronix HDM08216L-3. Verdere informatie vindt 
u op de Hantronix website http://www.hantronix.com en in het datasheets register op de CD-
ROM. 
LCD –contrast (LCD-ADJ) 
De beste zichtbaarheid van de LCD- tekens wordt verkregen door frontaal naar te kijken. 
Eventueel moet het contrast iets bijgeregeld worden. Het contrast kan ingesteld worden via 
de draaiweerstand PT1.  
Toetsenbord 
Voor de invoeren is een 12-delig toetsenbord (0 … 9, *, #) beschikbaar (X15: 13-polige 
stekker). Het toetsenbord is 1 uit 12 georganiseerd, d.w.z. aan iedere toets is een leiding 
toegewezen. De toetsinformatie wordt serieel via een schuifregister ingelezen. Als er geen 
toetsenbord gebruikt wordt, kunnen de 12 ingangen als extra digitale ingangen gebruikt 
worden. Het toetsenbord beschikt over een 13-polige aansluiting (één rij) en wordt zo in de 
X15 gestoken, dat het toetsenveld naar het Application board wijst. 

35 
SRAM 
Op het Application board bevindt zich een SRAM-chip (K6X1008C2D) van Samsung. 
Hierdoor wordt het beschikbare SRAM-geheugen uitgebreid op 64KB. De SRAM gebruikt 
voor de aansturing de poorten A, C en deels poort G. Als het SRAM niet gebruikt wordt kan 
deze met JP7 deactiveert worden en de poorten zijn weer beschikbaar. 
 Oftewel de gebruikte RAM chip een capaciteit van 128 KB heeft, kan opgrond van het 
geheugenmodel slechts 64kb daarvan benut worden. 
12C-interface 
Via deze interface kunnen seriële data met hoge snelheid verzonden worden. Er zijn daar-
voor slechts twee signaalleidingen nodig. De overdracht gebeurt via het I2C –protocol. Voor 
het effectieve gebruik van deze interface worden speciale functies ter beschikking gesteld 
(zie de softwarebeschrijving I2C). 
I2C SCL  12C-bus pulsleiding    PortD.0 
I2C SDA  12C-bus dataleiding    PortD.1 
Voedingsspanning (POWER, 5 Volt, GND) 
Het Application board wordt via een stekkernetvoeding (9V/250mA) van spanning voorzien. 
Afhankelijk van de verdere schakelingen van het Application board kan het later nodig zijn 
een netvoeding met een hogere capaciteit te gebruiken. Een vaste spanningsregelaar 
produceert de interne gestabiliseerde voedingsspanning van 5V. Alle delen van de 
schakeling op het Application board worden met deze spanning gevoed. Door de 
capaciteitsreserve van de netvoeding staat deze 5V ook ter beschikking als voeding van 
externe ICs. 
 Let op de maximaal afneembare stroom. Een overschrijding kan leiden tot vernieling! 
Vanwege het relatief hoge stroomverbruik van het Application board in het bereik van 125 
mA is deze niet aan te bevelen voor toepassing in permanent op batterijen werkende 
apparaten. Let op de aanwijzing betreffende het kort uitvallen van de voedingsspanning (“zie  
Reset gedrag”). 

36 
Seriële interface 
De microcontroller Atmega128 bezit voor wat betreft de hardware twee asynchrone seriële 
interfaces volgens RS232 standaard. Het formaat kan vastgelegd worden bij de initialisering 
van de interface (databits, pariteitbit, stopbit). Op het application board 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, nega-
tieve spanning voor highbits). De niveau-omvormer-IC beschikt over een verhoogde be-
scherming tegen spanningspieken. Spanningspieken kunnen in een elektromagnetische 
omgeving, bijv. in industriële toepassingen, in de interfacekabel geïnduceerd worden en 
aangesloten schakelcircuits vernielen. D.m.v. jumpers kunnen de datakabels RxD0 
(PortE.0), TxD (PortE.1) en RxD1 (PortD.2), TxD (PortD.3) van de controller met de niveau-
omvormer verbonden worden. In rusttoestand (geen actieve dataoverdracht) kunt u op pin 
TxD een negatieve spanning van een paar volt tegen GND meten. RxD is hoogohmig. Op de 
9-polige SUB-D bus van het application board ligt RxD0 aan pin 3 en TxD0 aan pin 2. De 
GND –aansluiting ligt op pin 5. Er worden voor de seriële dataoverdracht geen handshake –
signalen gebruikt. De tweede seriële interface is op een 3-polige stiftstrip geleid. RxD1 ligt 
aan pin 2 en TxD1 aan pin 1, pin3=GND. 
Een kabelverbinding met aansluiting aan de NRZ –pinnen TxD, RxD, RTS mag maximaal 10 
meter lang zijn. U dient waar mogelijk afgeschermde normkabels te gebruiken. Bij langere 
kabels of onafgeschermde kabels kunnen storende invloeden de dataoverdracht beïnvloe-
den. Verbind alleen verbindingskabels waarvan de pinbezetting bekend ist. 
 Verbind nooit de seriële zenduitgangen van twee apparaten met elkaar! U herkent de 
zenduitgangen meestal aan de negatieve uitgangsspanning in rusttoestand. 
Testinterfaces 
De 4-polige stiftstrip X16 wordt alleen voor interne testdoeleinden gebruikt en zal ook niet op 
alle application boards gemonteerd worden. Voor de gebruiker is deze stiftstrip zonder 
betekenis. 
Een andere testinterface is de 6-polige stiftstrip (twee rijen met elk 3 pinnen) rechts onder bij 
JP4. Ook deze stiftstrip is alleen voor intern gebruik en wordt op latere boardseries 
waarschijnlijk niet meer gemonteerd.  

37 
Technische specificaties application board 
Aanwijzing: U vindt gedetailleerde informatie in de PDF –bestanden van de IC –fabrikant op 
de C-Control Pro software CD.    
Alle spanningsaanduidingen hebben betrekking op gelijkspanning (DC). 
 Mechaniek   
Buitenafmetingen ca.   160 mm x 100 mm 
Pinraster bedradingveld  2,54 mm 
Omgevingscondities   
Bereik van de toelaatbare omgevingstemperatuur  0°C … 70° C 
Bereik van de toelaatbare omgevingsluchtvochtigheid
20% … 60% 
Voedingsspanning   
Bereik van de toelaatbare voedingsspanning  8V … 24V 
Stroomverbruik zonder externe lasten  ca. 125mA 
Max. toelaatbare permanente stroom uit 
gestabiliseerde 5V-spanning  200mA 
3.3.3        Pintoewijzing 
PortA tot PortD worden voor directe pin-functies (b.v. Port WriteBit) van 0 tot 52 geteld, zie 
“Portbit”. 
Pinbezetting voor application board Mega128 

38 

39 
3.3.4  Jumper Applicatie board 
Jumper 
D.m.v. de jumpers kunnen bepaalde opties gekozen worden. Dit zijn bepaalde poorten welke 
speciale functies bezitten (zie tabel pintoewijzing van M128). Bijvoorbeeld is de seriële 
interface via de pinnen PortE.0 en PortE.1 gerealiseerd. Als de seriële interface niet gebruikt 
wordt, kunnen de desbetreffende jumpers verwijdert worden en deze pinnen zijn dan voor 
andere functies beschikbaar. Naast de jumpers voor deze poorten zijn er nog extra jumpers, 
deze worden hierna beschreven. 
                                       Jumperposities bij uitlevering 
Poorten A tot G 
De beschikbare poorten bij de Mega 128 module zijn in de grafiek ingetekend. Daarbij is de 
gele kant met de module verbonden, de lichtblauwe kant is verbonden met de componenten 
van het application board. Wanneer een jumper getrokken wordt dan is de verbinding naar 
het application board verbroken. Dit kan een storing aan de USB, RS232 etc. veroorzaken. 
De grijze markering toont de eerste pin (pin 0) van de poort. 

40 
JP1 en JP2 
De jumpers zijn toegewezen aan de toetsen SW1 en SW2. Er bestaat de mogelijkheid de 
toetsen te laten werken tegen GND of VCC. In de basisinstelling schakelen de toetsen tegen 
GND. 
JP4 
JP4 is bedoeld voor het omschakelen van de voedingsspanning (netvoeding of USB). Het 
application board moet gevoed worden via netvoeding en spanningsregelaar (toestand bij 
uitlevering). De maximale uithaalbare stroom van de USB interface is lager dan van de 
netvoeding. Het overschrijden kan de USB interface van de computer beschadigen. 
JP6 
Bij gebruik van het display kan met JP6 de verlichting (back light) uitgeschakeld worden. 
JP7 
Als de SRAM op het application board niet gebruikt wordt dan kan es mit JP7 deactiveerd 
worden en deze poorten staan dan de gebruiker ter beschikking. 
JP4 
Aan de jumper J4 is de 2
e
 seriële interface van de Mega 128 aangesloten via een niveau- 
omvormer. 
Pin 1 (links, grijs)  TxD 
Pin 2 (midden)  RxD 
Pin 3 (rechts)  GND 
PAD3 
PAD3 (rechts naast de module) wordt als ADC_VREF_EXT voor de functies ADC Set en 
ADC Setint benodigd. 
3.3.5     Schakelschema’s 
De schakelschema’s bevinden zich eveneens op de installatie- CD als pdf-bestand. 

41 
3.3.5.1         Mega 128 module 

42 
3.3.5.2      Application board 

43 

44 

45 
3.3.5.3          Opbouwschema 

46 
Hoofdstuk  

47 
4         IDE 
Het C-Control Pro gebruikersoppervlak (IDE) bestaat uit de volgende hoofdelementen: 
Sidebar voor 
projectbestanden   Meerdere bestanden kunnen hier tot een project geplaatst  worden. 
Editor venster  Er kunnen zo veel editor vensters geopend worden als u maar wilt om 
bestanden te bewerken.  
Compiler meldingen  Foutmeldingen en algemene compiler informatie worden hier getoond. 
C-Control uitvoeren  Uitvoer van debug berichten van de CompactC programma’s. 
Variabelen –venster  Bewaakte variabelen worden hier getoond. 

48 
4.1      Projecten 
Elk programma voor de C-control module wordt door een project geconfigureerd. In een 
project staan de gebruikte bronbestanden en bibliotheken. Eveneens zijn hier de instellingen 
van de compiler. Een project bestaat uit het projectbestand met de extentie “.cprj” en de 
bijhorende bronbestanden. 
4.1.1    Maken van een project 
Onder het menu Project kunt u met het oproepen van Nieuw de dialoogbox Project maken 
oproepen. Daar wordt voor het project een projectnaam aangegeven en het project wordt in 
de sidebar gemaakt.  
 U dient vooraf te beslissen of u een CompactC of een Basic project wilt maken. In een 
project kunt u als projectbestanden CompactC en Basic gemengd aanleggen en daaruit een 
programma maken. De brontekst bestanden in een project bepalen welke programmeertaal 
van toepassing is. Bestanden met de extensie *.cc lopen in een CompactC context. 
Bestanden met een extensie *.cbas worden met BASIC vertaald. 
4.1.2    Projecten compileren 
Onder het menu Project kan met compileren (F9) het actuele project door de compiler 
vertaald worden.De compiler- berichten worden in een eigen vensterbereik getoond. Als er  

49 
fouten bij het compileren optreden, dan wordt per regel de fout beschreven en wel in de vorm 
van: 
Bestandsnaam (regel, kolom):     .foutbeschrijving 
De foutpositie in de brontekst kan via de bevelen Volgende fout (F11) of Vorige fout Shift-
F11) gevonden worden. Beide commando’s bevinden zich onder het menupunt Project, of er 
kan door dubbelklikken op een foutbericht van de compiler de cursor bij de foutposities in de 
editor positioneren. 
Bij een succesvolle compilatie wordt de bytecode als bestand met de extensie “*.bc* in het 
projectregister opgeslagen. 
Door met rechts in het bereik van de compilerberichten te klikken kunnen de volgende 
procedures gestart worden: 
•  Wissen – verwijdert de lijst met compilerberichten 
•  Naar het klembord kopiëren – kopieert alle tekstberichten naar het klembord.  
4.1 .3    Projectbeheer 
Als u met de rechter muistoets op het nieuw gemaakte project in de sidebar klikt, verschijnt 
er een pop-up menu met de opties 
* Neu Hinzufügen   - Er wordt een nieuw bestand aangelegd en tegelijkertijd wordt er een  
         editor –venster geopend 
* Toevoegen    - Een bestaand bestand wordt aan het project toegevoegd 
* Andere naam geven - De naam van het project wordt veranderd (dit is niet persé de naam  
   van het projectbestand) 
* Kompilieren    - De compiler wordt gestart voor het project 
* Optionen     - De projectopties kunnen veranderd worden 
Projectbestanden toevoegen 
Wordt er op toevoegen van projectbestanden geklikt, verschijnt een bestand- openen- 
dialoog waarin bestanden geselecteerd kunnen worden die aan het project toegevoegd 
worden. Er kunnen meerdere bestanden geselecteerd worden. 
Projectbestanden 
Als bestanden aan het project toegevoegd zijn, kunnen deze geopend worden door 
dubbelklikken op de bestandsnaam. Door met rechts te klikken verschijnen verdere opties. 
op de bestandsnaam dubbel  dan kunt u de bestanden met een dubbelklik op de 
bestandsnaam openen. Met een klik op de rechter muisknop verschijnen er nog meer opties: 

50 
•  Nach oben   - Het projectbestand wordt naar boven verschoven (ook met Ctrl – pijl  
              omhoog) 
•  Nach unten   - Het projectbestand wordt naar beneden verschoven (ook met Ctrl –  
                                 pijl omlaag) 
•  Umbenennen  - De naam van het bestand wordt veranderd  
•  Entfernen    - Het bestand wordt verwijderd uit het project 
•  Optionen     - De projectopties kunnen veranderd worden 
4.1.4      Projectopties 

51 
Voor elk project kunnen de compilerinstellingen apart veranderd worden. 
De invoeren Autor, Version, Kommentar  kunnen vrij voorzien worden van tekst, ze zijn 
alleen bedoeld als geheugensteuntje, om zich later beter bijzonderheden van het project te 
herinneren. 
In “CPU Auswahl” legt u het doelplatform van het project vast. Als u op “Hardware opvragen” 
klikt, dan wordt de aangesloten C-Control Pro module uitgelezen en wordt de CPU juist 
gekozen. 
Bij de “Opties” configureert u de multithreading en of er een debug code gemaakt moet 
worden.  
 Als er met de debug code gecompileerd wordt, dan wordt de bytecode een klein beetje 
langer. Per regel in de brontekst die uitvoerbare aanwijzingen bevat, wordt de bytecode een 
byte groter.  
 Als er multithreading gebruikt moet worden, dan moet in de project- opties de keuzebox 
geselecteerd worden en bovendien moeten de threads onder “Threads configureren” apart 
geparametriseerd worden.  
In de opties kan ook gekozen worden of er een Map bestand gemaakt moet worden. 
4.1.5        Thread –opties 
Om een thread voor de looptijd te kunnen activeren moet hij in deze keuzebox geactiveerd 
worden en moeten de parameters stackgrootte en cyclustijd ingesteld worden. 
Aan elke extra thread, behalve voor het hoofdprogramma, wordt een plaats op de stack 
toegewezen, die hij niet mag overschrijden. 

52 
 Als een thread meer plaats gebruikt dan toegewezen, wordt de geheugenplaats van de 
andere threads mede beschadigd, en het is zeer waarschijnlijk dat het programma zal 
crashen.  
De cyclustijd is het aantal cycli (bytecode operaties) die een thread mag verwerken tot er 
omgeschakeld wordt naar een andere thread. Via het aantal cycli tot aan het wisselen van 
threads wordt ook de prioriteit van de threads gestuurd. Zie ook Threads. 
4.1.6    Beheer van de bibliotheek 
In het bibliotheekbeheer kunnen de brontekst –bibliotheken gekozen worden die naast de 
projectbestanden mede gecompileerd worden.   
Alleen die bestanden waarvan de checkbox ook geselecteerd werd worden bij het 
compileren betrokken.    
De lijst kan met behulp van het pad tekst -invoerveld “Bibliotheeknaam” en de opties in het 
dialoogvenster veranderd worden.  
* Einfügen  - het pad wordt aan de lijst toegevoegd 
* Ersetzen  - De geselecteerde invoer in de lijst wordt vervangen door de pad –naam 
* Löschen  - De geselecteerde invoer in de lijst wordt gewist. 
* Bibliotheek  
  updaten  - Bestanden die in de compiler- voorafinstelling aanwezig zijn, maar niet in  
  deze lijst, worden toegevoegd. 

53 
4.2         Editor 
U kunt in het C-Control Pro oppervlak meerdere editorvensters openen. Elk venster kan qua 
grootte en qua getoonde tekstgedeelte veranderd worden. Dubbelklikken op de titelregel 
maximaliseert het venster.  
Een klik op het bereik links naast het begin van de tekst plaatst daar een stop (breakpoint). 
Daartoe moet eerst de brontekst zonder fouten met “Debug info” gecompileerd zijn, en 
moeten er in de desbetreffende regel daadwerkelijk uitvoerbare programmateksten staan 
(b.v. geen commentaarregel of dergelijke). 
4.2.1      Editorfuncties 
Onder het menupunt “bearbeiten” (bewerken) kunt u de belangrijkste editorfuncties vinden: 
•  “Rückgängig” (Ctrl-Z) voert een Undo operatie uit. Hoeveel dit commando ongedaan 
maakt hangt ook af van de instelling van “ Gruppen rückgängig” (groepen ongedaan). 
•  “Wiederherstellen” (herstellen) (Ctrl-Y) – herstelt de editortoestand, die eerst door 
“ongedaan” veranderd werd. 
•  “Ausschneiden” (knippen) (Ctrl- X) – verwijdert geselecteerde tekst en kopieert deze naar 
het klembord 
•  “Kopieren” (Ctrl-C) – kopieert geselecteerde tekst naar het klembord 
•  “Einfügen” (Crtl-V) – kopieert de inhoud van het klembord naar de cursorpositie 
•  “Alles markieren” (Ctrl-A) – selecteert de gehele tekst   

54 
•  “Suchen” (Ctrl-F) – opent de “Zoeken” –dialoog 
•  “Weitersuchen” (F3) – zoekt verder met dezelfde zoek –criteria 
•  “Ersetzen” (Ctrl-R) – opent de “Vervangen”-dialoog 
•  “Gehe zu” (Alt-G) – u kunt naar een bepaalde regel springen 
Zoeken / Vervangen dialoog 
•  Zoektekst – invoerveld voor de te zoeken tekst 
•  Vervangen door – de vervangende tekst 
•  Hoofdletters/ kleine letters – onderscheidt hoofd – en kleine letters 
•  Alleen hele woorden – vindt alleen hele woorden en geen tekenketens 
•  Reguliere uitdrukkingen – activeert de invoer van reguliere uitdrukkingen in het 
zoekmasker 
•  Om bevestiging vragen bij treffers – voor het vervangen wordt de gebruiker om 
bevestiging gevraagd 
Verder kan de zoekrichting bepaald worden, of de gehele tekst of slechts een geselecteerd 
bereik doorzocht wordt, en of het zoeken bij de plaats van de cursor of aan het begin van de 
tekst moet beginnen. 
4.2.2     Reguliere uitdrukkingen 
De zoekfunctie in de editor ondersteunt reguliere uitdrukkingen. Daarmee kunnen 
tekenketens zeer flexibel gezocht of vervangen worden. 
^  Een circumflex aan het begin van een woord vindt het woord aan het begin van de regel 
$  Een dollarteken vertegenwoordigt het einde van een regel 
. 
Een punt symboliseert een willekeurig teken 
*  Een sterretje staat voor het meervoudig voorkomen van een patroon. Het aantal mag 
echter ook nul zijn  
+  Een plus staat voor het meerdere keren maar minimaal één keer optreden van een patroon
[ ]  Tekens tussen rechthoekige haakjes staan voor het opduiken van één van de tekens  
[^]  Een circumflex tussen rechte haakjes negeert de keuze 
[-]  Een minteken tussen rechte haakjes symboliseert een letterbereik 
{ }  Accolades groeperen aparte uitdrukkingen. Er mogen maximaal 10 niveaus ingevoegd 
worden 
\  De backslash ontneemt aan het volgende teken de speciale betekenis 
Voorbeelden  
Voorbeeld
vindt 
^void  Het woord “void”alleen aan het begin van de regel
;$  De puntkomma alleen aan het eind van de regel 
^void$  In de regel mag alleen maar “void” staan 
vo.*d  b.v. “vod”, “void”, “vqqd” 
vo.+d  b.v. “void”, “vqqd” maar niet “vod” 
[qs]  de letters ‘q’of ‘s’ 
[qs]port  “qport” of “sport” 
[^qs]   alle letters behalve ‘q’of ‘s’ 
[a-g]  alle letters tussen ‘a’ en ‘g’ (inclusief) 
{tg}+  b.v. “tg”, “tgtg”, “tgtgtg” enz.  
\$  ‘$’ 

55 
4.3       C-Control hardware 
Onder het menupunt C-Control kan de hardware relevante functies uitvoeren. Hierbij horen 
de overdracht en het starten van het programma op de hardware, en eveneens de wacht-
woordfunctie. 
4.5.1    Programma starten 
Programma –overdracht 
Als een programma foutloos vertaald is, moet de bytecode eerst overgebracht worden naar 
de Mega 32 of Mega 128, voor het uitgevoerd kan worden. Dit gebeurt met het commando 
“Übertragen” (overbrengen – shift-F9) uit het menu C-Control. 
 Niet alleen de bytecode wordt overgebracht naar de Mega module, maar gelijktijdig wordt 
ook de nieuwste versie van de interpreter naar de C-Control module gestuurd. 
Starten 
Door Starten (F10) wordt dan de uitvoering van de bytecode overgebracht naar de Mega 32 
of Mega 128 module. 
Stoppen 
Bij normaal gebruik wordt een programma gestopt door op de toets RESET1 te drukken. Om 
redenen van performance wordt de uitvoering van het programma op de module bij normaal 
gebruik niet via de software gestopt. Dit is echter mogelijk met de IDE functie Programma 
stoppen, als het programma in de debug –modus loopt. 
 In zeldzame gevallen kan bij USB gebruik het systeem vastlopen als er op de toets 
RESET1 gedrukt wordt. Gebruik dan de toets RESET2 om ook de Mega8 een reset impuls 
te geven. De Mega8 houdt zich op het Application Board bezig met de USB interface. 
Autostart 
Als er geen USB interface is aangesloten, en er werd bij het inschakelen niet op SW1 
gedrukt om in de seriële bootloadermodus te komen, dan wordt de bytecode (voor zover 
aanwezig) in de interpreter gestart. D.w.z. als de module in een hardware applicatie wordt 
ingebouwd, dan is het aanleggen van de voedingsspanning voldoende om de toepassing 
automatisch te starten. 
  Een signaal op INT_0 bij het inschakelen van de C-Control Pro module kan de autostart 
storen. Volgens de pintoewijzing  van M32 en M128 ligt de INT_0 op dezelfde pin als de 
SW1. Als de SW1 bij het inschakelen ingedrukt wordt, leidt dit tot activering van de seriële 
bootloader modus en het programma wordt niet automatisch gestart.  

56 
4.3.2       
Uitvoer
Om debug berichten te tonen is er een “Uitvoer” – venster. 
Hier wordt getoond wanneer de bytecode interpreter gestart en beëindigd is, en hoe lang (in 
milliseconden) de interpreter uitgevoerd werd. De uitvoeringstijd is natuurlijk niet geldig als 
de interpreter in de debug modus gestopt werd.        
In het uitvoervenster kan echter ook de gebruiker zijn eigen debug –berichten laten zien. 
Voor dit doel bestaan er meerdere debug functies. 
Met een klik op de rechter muisknop in het bereik van de debug uitvoer kunt u de volgende 
commando’s kiezen:  
•  wissen – wist de lijst met debug berichten 
•  naar geheugen kopiëren – kopieert alle tekstberichten in het tussengeheugen 
4.3.3      PIN functies
De verschillende functies van de interpreter kunnen beveiligd worden met een alfanumerieke 
PIN. Als een interpreter door een PIN beveiligd is, dan zijn normale operaties verboden. De 
interpreter kan door een nieuwe overdracht overschreven worden, maar de PIN blijft 
behouden. Ook het normale starten is niet meer toegestaan, met uitzondering van het 
Autostart gedrag. Ook het opvragen van de versienummers van hardware en firmware is 
geblokkeerd. 
Als u toch probeert toegang te krijgen tot een verboden functie, dan verschijnt er een dialoog 
met de tekst “C-Control ist Passwordgeschützt. Operation nicht erlaubt!” (“C-Control is 
beveiligd met een toegangscode. Operatie niet toegestaan”)   
Door het invoeren van de PIN via Pin invoer in het  C-Control menu zijn alle operaties 
toegankelijk. 
Om een nieuwe PIN in te voeren of een ingestelde PIN te wissen bestaan er in het C-Control 
menu de commando’s PIN invoeren en PIN wissen. Als er al een PIN was ingesteld, moet de 
module natuurlijk eerst door invoer van de oude PIN gedeblokkeerd worden. Een PIN mag 
maximaal 6 alfanumerieke tekens lang zijn. 

57 
  Als u de code vergeten bent, is er een functie voor noodgevallen om de module terug te 
zetten naar de uitgangstoestand. Onder C-Control bestaat de functie Modul zurücksetzen 
(module terugzetten), waarmee u PIN, interpreter en programma kunt wissen.  
4.3.4      Versie controleren 
Omdat de C-Control Pro MEGA serie meerdere hardware platformen ondersteunen, is het 
belangrijk de actuele versienummers van bootloader, interpreter en hardware –versie in het 
oog te houden. Dit is mogelijk met Hardware versie in C-Control. 
4.4      Debugger 
Om de debugger te activeren, moet het project eerst zonder fouten met Debug code 
gecompileerd en naar de module overgebracht zijn. Het bestand met de debug code (*.dbg) 
moet in het projectregister aanwezig zijn.   
In het “Debugger” menu zijn alle debugger commando’s. Met Debug modus (Shift-F 10) 
wordt de debugger gestart. Is op dat moment geen breakpoint gezet, dan stopt de debugger 
bij de eerste uitvoerbare aanwijzing. 

58 
Als u zich in de Debug modus bevindt, springt u met starten (F10) naar de volgende stop. Als 
er geen breakpunt gezet is, wordt het programma normaal afgewerkt, met de uitzondering 
dat het programma gestopt kan worden met Programma stoppen. Dit functioneert echter 
alleen, als het programma gestart is vanuit de debug modus. 
Als de debugger in het programma gestopt is (de groene balk is zichtbaar), dan kunt u het 
programma stapsgewijs (“singlestep”) laten uitvoeren. De commando’s Einzelschritt (stap 
voor stap = Shift-F8) en Prozedurschritt  (=procedurestap = F8) voeren steeds de 
programmacode tot aan de volgende coderegel uit en blijven dan staan. In tegenstelling tot 
Einzelschritt springt  Prozedurschritt niet in functieoproepen, maar loopt overheen.  
 Als een lus slechts uit één coderegel bestaat, dan voert een enkele stap de hele lus uit, 
omdat er dan pas naar een nieuwe coderegel vertakt wordt.  
Met de aanwijzing Debug modus verlaten wordt de debug modus beëindigd.  
 Terwijl de debug modus actief is, kan de programmatekst niet veranderd worden. Dit 
wordt gedaan opdat de regelnummers niet kunnen verschuiven waar breakpoints gezet zijn. 
De debugger zou anders niet in staat zijn met de bytecode op de C-Control module te 
synchroniseren.  
4.4.1   Breakpoints 
Met de editor is het mogelijk om max. 16 stopposities (breakpoints) te zetten. Een breakpoint 
wordt ingevoerd door met de linker muistoets, naast de beginpositie van een regel, te klikken 
(zie IDE of Editorvenster). 
   Het aantal breakpoints is beperkt tot 16, omdat deze informatie bij het lopen van de 
bytecode interpreter in het RAM meeloopt. Andere debugger zetten stoppunten direct in de 
programmacode. Dit is hier niet wenselijk, omdat dit de levensduur van het flashgeheugen 
(ca. 10000 schrijftoegangen) aanzienlijk zou reduceren. 

59 
4.4.2      Variabelen -venster 
In de debugger kunt u de inhoud van variabelen bekijken. Daartoe wordt de muis boven de 
variabele geplaatst, en na ca. 2 seconden wordt de inhoud van de variabele als tooltip 
getoond. De variabele wordt eerst volgens het overeenkomstige bestandstype getoond en 
dan, door een komma gescheiden, als hexgetal met daarvoor “0x”. 
Als u meerdere variabelen wilt controleren, dan kunt u de variabelen in een lijst samenvatten.  
Er bestaan twee mogelijkheden om een variabele in te voeren in de lijst van gecontroleerde 
variabelen. U kunt enerzijds de cursor aan het begin van een variabele in de tekst -editor 
plaatsen, en dan met een klik op de rechter muisknop variabele invoegen kiezen. 
De andere variant gaat via het contextmenu in de lijst van variabelen, dat u eveneens met 
een klik op de rechter muisknop kunt activeren: 
Als u daar variabele invoegen kiest, kunt u de te controleren variabele in de lijst invoeren als 
tekst. Als het een lokale variabele is, dan wordt daar de functienaam met een dubbele punt 
vooraan geplaatst (functienaam : variabele naam). Met Variabele veranderen kunt u de 
tekstinvoer in de lijst veranderen, en met variabele verwijderen de variabele uit de lijst 
verwijderen. Daarbij moet eerst de regel met de te wissen variabele geselecteerd zijn. het 
commando Alle variabelen verwijderen wist alle invoeren uit de lijst. 

60 
 Het is niet mogelijk de inhoud van arrays in de debugger te bekijken. 
Onder bepaalde omstandigheden wordt in plaats van een waarde in een lijst een foutmelding 
getoond:       
Geen debug code  Er is geen debug code gegenereerd 
Foutieve syntax  Bij de tekstinvoer zijn ongeldige tekens voor 
de variabele ingevoerd 
Functie onbekend  De functienaam is onbekend 
Variabele onbekend  De variabele –naam is onbekend 
Niet in de debug modus
De debug modus is niet geactiveerd 
Geen context  Locale variabelen kunnen alleen aangetoond  
worden, als u zich in de functie bevindt 
Niet actueel  De inhoud van de variabele is niet geactualiseerd
Als er veel variabelen in de controlelijst ingevoerd zijn, dan kan het bij een singlestep lang 
duren voordat alle inhouden van variabelen uit de module opgevraagd zijn. In dat geval kunt 
u de optie Auto actualiseren voor aparte variabelen uitschakelen. Dan wordt de inhoud van 
deze variabelen pas getoond als het commando Variabelen actualiseren uitgevoerd wordt. 
Op deze manier kunt u snel in de debugger doorgaan met singlestep en de inhouden worden 
pas indien nodig geactualiseerd. 
  Variabelen van het type character worden worden als afzonderlijke ASCII tekens 
weergegeven. 
4.4.3     Array venster 
Voor het bekijken van de inhoud van array variabelen kan een venster met de inhoud van de 
array opgeroepen worden. Plaats hiertoe de cursor op de variabelen en klik met rechts op 
Array weergeven. 

61 
In de linker kolom wordt de index van de array getoond en rechts de inhoud. Bij 
multidimensionele arrays groeit de index in de rechter kolom het snelst. 
Na elke stop van de debugger of bij een singlestep kan de inhoud van een array venster al 
niet meer actueel zijn. Als bij elke singlestep in de debugger meerdere array- vensters  
opnieuw geactualiseerd worden kan het tot vertragingen komen omdat de gegevens van de 
module geladen moeten worden. Daarom zijn er drie gebruiksmodi: 
Automatisch actualiseren  Actualiseren bij singlestep en stoppunten 
Bij stoppunt actualiseren  Actualiseren alleen bij stoppunt (breakpoint) 
Handmatig actualiseren  Alleen actualiseren na klikken op de 
schakelaar 
4.5      Opties 
In het menu opties vindt u de instellingen van de IDE en de standaardinstellingen voor de 
compiler. 

62 
4.5.1      Editorinstellingen 
•  Automatisch Einrücken – door op Enter te drukken wordt de cursor op de volgende regel 
ingesprongen op de plaats van de vorige regel. 
•  Einfügen – Invoegen. is deze optie uit, is “overschrijven” de standaardinstelling. 
•  Benutze Tabulator – Gebruik  tab’s – als deze optie activeert is worden tab’s ingevoegd, 
anders spaties. 
•  Smart Tabulator – er wordt met de tabulator een tab ingevoegd tot aan de beginpositie 
van de vorige regel. 
•  Optimales Füllen – “Automatisch inspringen” zet eerst tab’s en daarna spaties. 
•  Backspace rückt aus – met backspace wordt teruggesprongen tot aan de beginpositie 
van de vorige regel. 
•  Cursor geht durch Tabulatoren – tab’s worden net als spaties doorlopen. 
•  Gruppen Rückgang – een undo (ongedaan maken) wordt niet in kleine stappen maar in 
blokken doorgevoerd. 
•  Cursor hinter Dateiende – de cursor springt naar het einde van het bestand. 
•  Cursor hinter Zeilenende – de cursor springt naar het einde van de regel. 
•  Erlaube Undo nach speichern – de undo- buffer wordt na het opslaan niet leeggemaakt. 
•  Folgende Leerzeichen behalten – is dit geactiveerd worden spaties op het einde van een 
regel niet verwijdert. 
•  Blöcke überschreiben – als een blok geselecteerd is wordt deze door de volgende invoer 
overschreven. 
•  Erlaube Selektion – tekst kan geselecteerd worden. 
•  Erlaube Draggen – tekst kan met de muis geselecteerd en door het vasthouden van de 
linker muistoets verschoven worden (drag & drop). 
•  Markierung bei Suchoperation – na het vinden van de gezochte tekst is deze 
geselecteerd. 

63 
•  Doppelklick selektiert Zeile – dubbelklikken selecteert een regel, standaard wordt bij het 
dubbelklikken een woord geselecteerd 
•  Suchtext von Cursor – de tekst bij het “Zoektekst- invoerveld” wordt door de cursorpositie 
overgenomen. 
•  Dreifachklick selektiert Zeile – als een dubbelklik een woord selecteert wordt door drie 
keer klikken een regel geselecteerd. 
•  Automatische Rechtschreibprüfung – deze optie schakelt de spellingscontrole voor 
commentaren in. 
•  Benutze Syntax Einfärbung – de syntax highlighting voor *.cc en *.cbas- bestanden wordt 
ingeschakeld. 
In de keuzebox toetsbezetting kan de toets- layout voor gangbare editor ingesteld worden. 
Deze emulatie is echter niet compleet omdat het gedrag van de verschillende editor heel 
complex is. Meestal worden de belangrijkste toetscommando’s ondersteund. 
Bij blok invoegen wordt het aantal spaties ingevoegd waarmee de blok geselecteerd werd, 
met tab of zonder. 
Het invoerveld Tabulatoren bepaald hoeveel tekens een tab breed is. 
4.5.2        Compiler instellingen vooraf 
Bij de compiler instellingen kunnen de standaardwaarden geconfigureerd worden die bij het 
maken van een nieuwe project opgeslagen worden. De instellingen vooraf zijn onder 
compiler in het menu optie te vinden. 
Een beschrijving van de opties bevindt zich onder projectopties. De keuzeboxen “Threads 
configureren” en “Bibliotheek configureren” zijn identiek aan de beschrijvingen in hoofdstuk 
projecten. 

64 
4.5.3        IDE instellingen 
U kunt aparte aspecten van de IDE configureren. 
•  Übertragung nach Kompilieren Abfrage – Als een programma gecompileerd maar niet 
naar de C-Control module overgebracht is, wordt de gebruiker gevraagd of het 
programma gestart moet worden. 
•  Letztes Projekt wieder öffnen – Het laatste geopende project wordt bij het starten van de 
C-Control Pro IDE weer geopend. 
•  Editorvenster maximiert öffnen – Bij het openen van een bestand wordt automatisch het 
editorvenster op volledige grootte geschakeld. 
•  Splashscreen nur kurz zeigen – het splashscreen wordt dan alleen tot aan het openen 
van het hoofdvenster getoond.  
•  Mehrere Instanzen von C-Control Pro zulassen – Als het C-Control Pro oppervlak 
meervoudig gestart wordt, kan dat leiden tot conflicten met betrekking tot de USB 
interface. 
Bovendien kunnen hier ook de lijsten van de “laatst geopende projecten”, alsmede de “laatst 
geopende bestanden” gewist worden. 

65 
4.5.3.1        Communicatie 
Via een keuzebox kunt u de verbinding met het Application Board instellen. USB 
verbindingen beginnen met de afkorting “USB” en worden dan doorgenummerd: USB0, 
USB1 … Seriële interfaces worden op dezelfde manier behandeld. Ze beginnen met de 
afkorting “COM”: COM 0, COM1 … enz. 
Met de toets “Schnittstellensuche” worden alle interfaces doorzocht tot de commandoregels 
interface van de C-Control Pro reageert. Opdat een Application Board herkend wordt, moet 
de stroom ingeschakeld zijn en de firmware mag zich niet opgehangen hebben. U kunt het 
beste voor u gaat zoeken een keer uit – en weer inschakelen.   
De knoppen “C-Control Test” en “Hardware Version” maken het mogelijk direct te zien of de 
gekozen interface ook zinvol kan communiceren met de C-Control Pro module. 
4.5.3-2       
Internet update 
Om te controleren of er door Conrad verbeteringen of correcties van fouten gepubliceerd 
zijn, kunt u de Internet update activeren. Als u de keuzebox “Alle n dagen controleren op 
updates” kiest, dan wordt met een interval van n dagen bij het starten van de IDE op internet 
naar een update gezocht. De parameter n kan ingesteld worden in het invoerveld rechts 
ernaast. 
De knop “Jetzt auf Update prüfen” (“nu op update controleren”) activeert onmiddellijk het 
zoeken naar updates.  

66 
 Opdat de internet update zoals voorgeschreven functioneert, mag de MS Internet 
Explorer niet in de “offline” modus staan.    
Als bijv. vanwege een firewall de toegang tot internet beperkt is door een proxy, dan kunnen 
de proxy instellingen zoals adres, gebruikersnaam en code in deze dialoog aangegeven 
worden. 
 Als er in MS Internet Explorer data ingevoerd zijn, dan hebben deze een hogere prioriteit 
en overschrijven ze de instellingen in deze dialoog. 
4.6      Venster 
Als er in het editorbereik meerdere vensters geopend zijn, kunt u via de commando’s in het 
“Venster” menu de editorvensters automatisch laten rangschikken.  
•  Überlappend – de vensters worden boven elkaar gerangschikt, elk venster is daarbij iets 
verder naar rechts verschoven dan het vorige. 
•  Untereinander – de vensters worden verticaal onder elkaar geplaatst 
•  Nebeneinander – ordent de vensters van links naar rechts naast elkaar 
•  Alle Minimieren – verkleint de vensters tot symboolgrootte 
•  Schliessen – sluit het actieve venster 

67 
4.7       Hulp 
Onder het menupunt “Hilfe” (Hulp) kunt u met Inhalt (Inhoud - toets F1) het helpbestand 
oproepen.  
Het menupunt Programmaversie opent het volgende “Versie –informatie” -venster en 
kopieert gelijktijdig de inhoud naar het klembord. 
Als er een support email naar Conrad geschreven moet worden, dan is deze informatie 
belangrijk. Omdat u bij het oproepen van Programmaversie ook gelijk in het klembord bent, 
kunt u deze data makkelijk aan het eind van een email invoegen. 
Als u in het hulpbestand naar een bepaald begrip wilt zoeken, dan kan de Kontexthilfe (Hulp 
bij de context) het zoeken vergemakkelijken. Als u bijv. in de editor met de cursor in het 
woord “AbsDelay” staat en u zoekt naar de juiste parameters, dan kunt u simpelweg de 
Kontexthilfe aanklikken. Deze functie neemt het woord waarop de cursor staat als 
zoekbegrip en toont de resultaten in het Hulpbestand. 
Het commando Kontexthilfe kan eveneens opgeroepen worden door een rechtsklik in het 
editorvenster. 

68 
Hoofdstuk  

69 
5.         Compiler 
5.1         Algemene features 
Dit bereik geeft informatie over compiler- eigenschappen en features die niet afhankelijk zijn 
van de gebruikte programmeertaal. 
5.1.1        Externe RAM 
Op het application board Mega 128 is een externe RAM aanwezig. Dit RAM wordt door de 
interpreter automatisch herkent en gebruikt voor het uit te voeren programma. In plaats van 
ca. 2665 byte zijn dan ca. 63848 byte beschikbaar als programmageheugen. Hiervoor moet 
het programma niet opnieuw gecompileerd worden.  
  Als de SRAM niet gebruikt wordt kan dit met JP7 gedeactiveerd worden en deze poorten 
zijn dan vrij. 
5.1.2       Preprocessor 
 De Gnu Generic preprocessor die hier gebruikt wordt, heeft nog meer functies die onder 
http://nothingisreal.com/gpp/gpp.html gedocumenteerd zijn. Echter, alleen de hier beschreven 
functies, ook in samenhang met de C-Control Pro compiler zijn ook uitvoerig getest. Het 
gebruik van niet hier gedocumenteerde functies geschiedt op eigen risico! 
Het C-Control ontwikkelingssysteem beschikt over een volledige C- preprocessor. De 
preprocessor bewerkt de brontekst voor de compiler gestart wordt. De volgende commando’s 
worden ondersteund: 
Definities 
Men definieert met het commando “#define” tekstconstanten. 
#define symbol tekstconstante 
Omdat de preprocessor voor de compiler loopt, wordt bij elke keer dat symbol in de brontekst 
opduikt, symbol vervangen door tekstconstante. 
Een voorbeeld: 
#define Pl 3.141  
 Als een project uit meerdere bronnen bestaat, dan is er een #define constante voor alle 
bronbestanden vanaf het bestand in welke de constante gedefinieerd werd. Daarom is het 
mogelijk de volgorde van de bronbestanden in een project te wijzigen. 
Voorwaardelijke compilering 
#ifdef  symbol 
… 
#else  //  optie 
… 
#endif    

70 
U kunt controleren welke delen van een brontekst werkelijk gecompileerd worden. Na een 
#ifdef  symbol aanwijzing wordt de volgende tekst alleen gecompileerd als het symbol ook 
gedefinieerd is door #define  symbol. 
Als er een optionele #else aanwijzing aangegeven is, dan wordt de brontekst na #else bewerkt 
wanneer het symbol niet gedefinieerd is. 
Invoegen van tekst 
#include  pad\bestandsnaam 
Met deze aanwijzing kan een tekstbestand in de broncode ingevoegd worden. 
 Vanwege een beperking van de preprocessor mag het pad in een #include aanwijzing geen 
spaties bevatten! 
5.1.2.1      Vooraf gedefinieerde symbolen 
Om de werkzaamheden met de verschillende uitvoeringen van de C-Control Pro serie te 
vergemakkelijken, zijn er een serie van definities die in afhankelijkheid van doelsysteem en 
compiler projectopties gezet worden. Deze constanten kunnen met #ifdef, #ifndef of #if 
opgevraagd worden. 
               Symbool               Betekenis 
MEGA32  Configuratie voor Mega 32 
MEGA128  Configuratie voor Mega 128 
MEGA128CAN  Confguratie voor Mega 128 CAN bus 
__DEBUG__  Debug bestanden worden gemaakt 
__MAPFILE__  Een geheugenlayout wordt berekend 
De onderstaande constanten beïnhouden een string. Zinvol is deze in samenhang met 
tekstuitvoeren te gebruiken. 
               Symbool               Betekenis 
__DATE__  Actuele datum 
__TIME__  Tijd van de compilering 
__LINE__  Actuele regel in de sourcecode 
__FILE__  Naam van het actuele bronbestand 
__FUNCTION__  Actuele functienaam 
Voorbeeld 
Er worden regelnummers, bestandsnaam en functienaam gegeven. Omdat de 
bestandsnaam lang kan zijn, moet de character array vrij groot gedimensioneert worden: 

71 
char txt[60]; 
txt=__LINE__; 
Msg_WriteText(txt); // regelnummer aangeven 
Msg_WriteChar(13); // LF 
txt=__FILE__; 
Msg_WriteText(txt); // bestandsnaam aangeven 
Msg_WriteChar(13); // LF 
txt=__FUNCTION__; 
Msg_WriteText(txt); // functienaam aangeven 
Msg_WriteChar(13); // LF 
5.1.3     Pragma aanwijzingen 
Met de aanwijzing #pragma kan de uitvoer en het verloop van de compiler gestuurd worden. 
Volgende commando’s zijn toegestaan: 
#pragma Error “xyz…”  Een fout wordt gemaakt en de tekst “xyz…” gegeven 
#pragma Warning “xyz…”  Een waarschuwing wordt gemaakt en de tekst …”gegeven 
#pragma Message “xyz…”  De tekst “xyz…” wordt van de compiler gegeven 
Voorbeeld 
Deze #pragma aanwijzingen worden vaak in samenwerking met preprocessor commando’s 
en vooraf gedefinieerde constanten toegepast. Een klassiek voorbeeld is de productie van 
een foutmelding, nadat aan bepaalde hardware- criterias niet voldaan werd: 
#ifdef MEGA128 
#pragma Error "Counter functies niet bij Timer0 en Mega128" 
#endif 
5.1.4    Bestandsmap 
Als bij het compileren een map met bestanden aangemaakt wordt kan men daar de 
geheugengrootte van de gebruikte vaiabelen nakijken. 
Voorbeeld 
Het project CNT0.cprj maakt bij het compileren de volgende bestand: 
Globale Variablen          Lengte     Positie    (RAM begin) 
--------------------------------------------------------------- 
Totale lengte:     0 bytes 
Locale variablen           Lengte     Positie    (Stackrelatief) 
----------------------------------------------------------------- 
Funktie Pulse() 
Count                       2           4 
i                           2           0 

72 
Totale lengte:     4 bytes 
Funktie main() 
count                        2          2 
n                            2          0 
Totale lengte: 4 bytes 
In deze lijst is te zien dat er geen globale variabelen gebruikt worden. 
Verder zijn er twee functies, "Pulse()" en "main()". Elke functie heeft een 
geheugenverbruik van 4 Byte aan lokale variabelen. 
5.2           CompactC 
Voor het programmeren van de C-Control Pro Mega 32 of Mega 128 kan de programmeer-
taal CompactC toegepast worden. De compiler vertaald de programmeertaal CompactC naar 
een bytecode, die van de interpreter van de C-Control Pro verwerkt wordt. De taalomvang 
van CompactC komt ongeveer overeen met ANSI-C maar is op sommige plaatsen 
gereduceeerd, omdat de firmware rescourcen besparend implementeerd moest worden. 
Volgende taalconstructies zijn er niet: 
•  structs / unions 
•  typedef 
•  enum 
•  Constanten (const aanwijzing) 
•  Rekenkundige wijzer 
Uitgebreide programma voorbeelden vindt u in de map “Demoprogramma’s” die met de 
ontwikkelaarsomgeving geinstalleerd werd. Daar zijn op bijna alle takengebieden van de C-
Control Pro module voorbeeldoplossingen. 
5.2.1          Programma    
Een programma bestaat uit een hoeveelheid aanwijzingen (zoals bijv. “a=5;”), die over 
verschillende functies verdeeld zijn. De startfunctie die in elk programma aanwezig moet zijn, 
is de functie “main()”. Een klein programma dat een getal in het uitvoervenster drukt: 
void main (void) 
{ 
  Msg_WriteInt(42);  //  Het antwoord op alles 
} 
Projecten 
Men kan een programma verdelen over meerdere bestanden die in een project (zie 
projectbeheer) samengevat zijn. Naast deze bestanden kunt u bibliotheken aan een project 
toevoegen, die functies ter beschikking stellen die door het programma gebruikt worden. 
73 
5.2.2  Aanwijzingen 
Aanwijzing  
Een aanwijzing bestaat uit meerdere gereserveerde commandowoorden, indicatoren en 
operatoren, die met een puntkomma (‘;’) aan het eind afgesloten wordt. Om verschillende 
elementen van een aanwijzing te scheiden, bestaat tussen de aparte aanwijzingselementen 
een tussenruimte, in het Engels ook “whitespaces” genoemd.  
Onder tussenruimte worden verstaan spaties, tabs en regeldoorvoer (“C/R en LF”). Daarbij 
maakt het niet uit of de tussenruimte wordt gevormd door één of meerdere “whitespaces”.  
Eenvoudige aanwijzing: 
a =   5; 
   Een aanwijzing hoeft niet persé compleet in een regel te staan. Omdat ook 
regeldoorvoeren tot de tussenruimte horen, is het legitiem om een aanwijzing over meerdere 
regels te verdelen. 
If(a==5) // aanwijzing over twee regels 
a=a+10;  
Aanwijzingsblok 
Meerdere aanwijzingen kunnen in een blok gegroepeerd worden. Daarbij wordt het blok met 
een linker accolade (“{“) geopend, daarna volgen de aanwijzingen, en aan het eind wordt het 
blok gesloten met een rechter accolade (“}“). Een blok hoeft niet beëindigd te worden met 
een puntkomma. Dat betekent, dat als een blok het eind van een aanwijzing vormt, het 
laatste teken van de aanwijzing de rechter accolade sluiten is. 
If(a>5) 
{ 
  a=a+1;    // Aanwijzingsblok 
   b=a+2; 
} 
Commentaren 
Er bestaan twee soorten commentaren, éénregelige en commentaren met meerdere regels. 
Daarbij wordt de tekst in de commentaren door de compiler genegeerd.  
•  Eénregelige commentaren beginnen met “//” en stoppen bij het eind van de regel.  
•  Commentaren met meerdere regels beginnen met “/*” en stoppen met “*/”. 
/* Een 
meerregelig 
commentaar */ 
// Een éénregelig commentaar 

74 
Indicatoren 
Indicatoren zijn de namen van functies of variabelen.  
•  Geldige tekens zijn de letters (A-Z, a-z), de cijfers (0 – 9) en de liggende streep (‘ _’ ) 
•  Een indicator begint steeds met een letter 
•  Er wordt verschil gemaakt tussen hoofd – en klein letters 
•  Gereserveerde woorden zijn niet toegestaan als indicator 
•  De lengte van indicatoren is niet beperkt 
Rekenkundige termen 
Een rekenkundige term is een hoeveelheid waarden, die met operatoren verbonden zijn. 
Onder waarden worden in deze context verstaan getallen, variabelen en functies.     
Een eenvoudig voorbeeld: 
2 + 3 
Hierbij worden de getallen 2 en 3 gekoppeld d.m.v. de operator “+”. Een rekenkundige term 
vertegenwoordigt weer een waarde. Hier is de waarde 5.  
Andere voorbeelden:  
a – 3 
b + f(5) 
2 + 3 * 6  
Volgens “punt voor streep” wordt hier eerst 3 x 6 uitgerekend en daarna 2 er bij opgeteld. 
Deze voorrang van operatoren heet bij operatoren precedent. U vindt een opsomming van 
de prioriteiten in de precedent tabel.  
     Ook vergelijkingen zijn wiskundige termen. De vergelijkingsoperatoren geven als 
resultaat een waarheidswaarde van “1”of “0”, afhankelijk van of de vergelijking correct was. 
De term “3 < 5” geeft de waarde “1” (waar; true). 
Constante termen 
Een term of delen van een term kan/kunnen constant zijn. Deze deeltermen kunnen al 
tijdens de compiler –looptijd berekend worden.  
Zo wordt bijv.  
12 + 123 – 15 
door de compiler samengevat tot  
120 
Soms moeten termen constant zijn opdat ze geldig zijn. Zie bijv. declarering van array 
variabelen.  

75 
5.2.3              Datatypes 
Waarden bezitten steeds een bepaalde  datatype. De integerwaarden (gehele getallen 
waarden) hebben in CompactC een 8 of 16 bit breed datatype, getallen met floating point 
zijn altijd 4 byte lang. 
 Datatypee  Voorteken            Waardebereik  Bit 
char  Ja  -128 … +127    8 
unsigned char  Nee  0 … 2555 8    8 
byte  Nee  0 … 2555 8    8 
int  Ja  -32768 … +32767  16 
unsigned int  Nee  0 … 65535  16 
word  Nee  0  … 65535  16 
float  Ja           ±1.175
e
-38 to  
            ±3.402
e
38 
32 
Zoals te zien is, zijn de datatypes “unsigned char” en “byte” identiek, net als “unsigned int” en 
“word”. 
Strings 
Er is geen expliciet “String” datatype. Een string is gebaseerd op een character array. U 
moet de grootte van de array dusdanig kiezen, dat alle tekens van de string in het character 
array passen. Bovendien is er ruimte nodig voor een termineringsteken (decimale nul), om 
het einde van de keten aan te geven. 
Type –convertering 
Bij wiskundige termen gebeurt het heel vaak dat aparte waarden niet van hetzelfde type zijn. 
Zo zijn de datatypes in de volgende term gemengd (a is integer variabele). 
a + 5.5 
In dit geval wordt a eerst geconverteerd naar het datatype float en daarna wordt er 5.5 bij 
opgeteld. Het datatype van het resultaat is eveneens float. Bij de typeconvertering gelden 
de volgende regels: 
•  Als bij de verbinding van twee 8 bit of 16 bit integere waarden één van beide datatypes 
van een voorteken is voorzien (“signed”), dan is ook het resultaat van de term van een 
voorteken voorzien. D.w.z. de operatie wordt “signed” uitgevoerd. 
•  Als één van beide operandi van het type float is, dan is het resultaat eveneens van het 
type float. Als één van de beide operandi een 8 bit of 16 bit datatype heeft, dan wordt 
deze voor de operatie omgevormd tot een float datatype. 
5.2.4         Variabelen 
Variabelen kunnen verschillende waarden aannemen, afhankelijk van het datatype waarmee 
ze gedefinieerd zijn. Een variabele –definitie ziet er als volgt uit:   
Type  
variabelennaam; 
76 
Als u meerdere variabelen van hetzelfde type wilt definiëren, kunt u meerdere 
variabelennamen door een komma gescheiden aangeven: 
Type  naam1, naam2, naam3, …; 
Als type zijn toegestaan: char, unsigned char, byte, int, unsigned int, word, float   
Voorbeelden: 
int  a; 
int  i, j; 
float  xyz; 
Aan integere variabelen kunnen getalwaarden decimaal of als hexgetal toegewezen worden. 
Voor een hexgetal worden voor het getal de letters “0x” gezet. Bij variabelen met een van 
voorteken voorzien datatype kunnen negatieve decimale getallen toegewezen worden door 
een minteken voor het getal te plaatsen. 
Voorbeelden: 
word a; 
int  i,j; 
a=0x3ff; 
i=15;  
j=-22; 
Getallen met zwevende komma (datatype float) mogen een decimale komma en een 
exponent bevatten: 
float  x,y; 
x=5.70; 
y=2.3
e
+2; 
x=-5.33
e
-1; 
sizeof  Operator 
Met de operator sizeof() kan het aantal bytes bepaald worden die een variabele in het 
geheugen inneemt. 
Voorbeeld: 
int  s; 
float  f: 
s=sizeof(f);  //  de waarde van s = 4  
  
Bij arrays wordt ook alleen de bytelengte van het basis –datatype als uitkomst gegeven. 
U moet de waarde met het aantal elementen vermenigvuldigen om het geheugenverbruik 
van de array te berekenen. 
Array variabelen 
Als u achter de naam bij de variabelen –definitie tussen rechte haakjes een getalswaarde 
schrijft, dan heeft u een array gedefinieerd. Een array legt de plaats voor de gedefinieerde  
77 
variabele meervoudig in het geheugen vast. Bij de voorbeelddefinitie: 
int  x[10 ]; 
wordt voor de variabele x de 10-voudige geheugenplaats vastgelegd. De eerste geheugen-
plaats kan aangesproken worden met x[0 ], de tweede met x[1 ], de derde met x[2 ], …tot 
x[9]. U mag bij de definitie natuurlijk ook andere indexgroottes kiezen. De beperking is alleen 
de RAM geheugenplaats van de C-Control Pro. 
U kunt ook meerdimensionale arrays declareren, waarin nog meer rechte haakjes bij de 
variabelen –definitie toegevoegd worden: 
int  x[3] [4];    // array met 3*4 invoeren 
int  y[2] [2] [2];    // array met 2*2*2 invoeren 
 Arrays mogen in Compact-C maximaal 16 indices (dimensies) hebben. De maximale 
waarde voor een index is 65535. De indices van de arrays zijn altijd op nul gebaseerd, 
d.w.z. elke index begint met 0.  
 Er vindt tijdens het lopen van het programma geen controle plaats of de gedefinieerde 
indexgrens van een array is overschreden. Als de index tijdens de programmabewerking te 
groot wordt, neemt het programma zijn toevlucht tot vreemde variabelen en is de kans groot 
dat het programma ‘crasht’.   
Strings 
Er is geen specifieke “String” datatype. Een string is gebaseerd op een array van het 
datatype char. U moet de grootte van de array zo kiezen, dat alle tekens van de string in de 
character array passen. Bovendien is er plaats nodig voor een termineringsteken (decimale 
nul), om het eind van de tekenketen aan te geven.  
Voorbeeld van een tekenketen met maximaal 20 tekens: 
char  str1[21];  
Als uitzondering mag men aan char arrays tekenketens toewijzen. Daarbij wordt de 
tekenketen tussen aanhalingstekens gezet. 
Str1=”Hallo wereld!”; 
  Er kan geen String aan grotere char arrays toegewezen worden. Echter zijn er trucs 
voor ontwikkelaars: 
char str_array[3][40]; 
char single_str[40]; 
single_str="A String"; 
Str_StrCopy(str_array,single_str,40); // kopieert single_str in de tweede 
String 
Dit functioneert omdat met een afstand van 40 tekens achter de string in str_array de ruimte 
voor de tweede string ligt. 
Zichtbaarheid van variabelen 
Als variabelen buiten de functies gedeclareerd worden, hebben ze een globale zichtbaar-
heid. D.w.z., ze zijn vanuit elke functie aanspreekbaar. Declaraties van variabelen binnen 
78 
functies produceren locale variabelen. Locale variabelen kunnen alleen binnen de functie 
bereikt worden. Een voorbeeld: 
int  a,b;  
void   func1 (void) 
{ 
  int  a,x,y; 
   // globale b is toegankelijk 
   // globale a is niet toegankelijk, deze is door locale a afgedekt 
   // locale x,y zijn toegankelijk 
   // u is niet toegankelijk omdat deze lokaal hoort tot functie main 
} 
void   main (void) 
{ 
int u; 
 // globale a, u zijn toegankelijk 
 // locale u is toegankelijk 
//x,y niet toegankelijk omdat deze lokaal hoort  tot functie func1  
} 
Globale variabelen hebben een gedefinieerd geheugenbereik dat tijdens de totale 
programmaduur ter beschikking staat.  
 Bij de start van het programma worden de globale variabelen met nul geïnitialiseerd. 
Locale variabelen worden tijdens de berekening van een functie door de variabelen in het 
stack aangelegd. Dat betekent dat locale variabelen alleen in het geheugen bestaan tijdens 
de tijd dat de functie verwerkt wordt.  
Als bij locale variabelen dezelfde naam gekozen wordt als bij een globale variabele, dan ver-
bergt de locale variabele de globale variabele. Zolang zich het programma dan ophoudt in 
de functie waar de locale variabele met dezelfde naam gedefinieerd is, kan de globale 
variabele niet aangesproken worden.     
Static variabelen 
Bij locale variabelen kan de eigenschap static  voor het datatype gezet worden. 
void func1 (void) 
{ 
static int
  a; 
} 
Static variabelen behouden in tegenstelling tot normale variabelen hun waarde ook als de 
functie verlaten wordt. Bij een volgende oproep van de functie heeft de statische variabele 
dezelfde inhoud als bij het verlaten van de functie. Omdat de inhoud van een static 
variabele bij de eerste toegang gedefinieerd is, worden statische variabelen net als globale 
ook bij de start van het programma met nul geïnitialiseerd. 

79 
5.2.5          Operatoren 
Prioriteit van operatoren 
Operatoren verdelen wiskundige termen in deeltermen. De operatoren worden dan in de 
volgorde van hun prioriteit (precedentie) geëvalueerd. Termen met operatoren van dezelfde 
prioriteit worden van links naar rechts berekend. Voorbeeld: 
i= 2+3*4-5;  // resultaat 9 => eerst 3*4, dan +2, daarna –5 
U kunt de volgorde van de bewerking beïnvloeden door haakjes te plaatsen. Haakjes 
hebben de grootste prioriteit. Als u het laatste voorbeeld strikt van links naar rechts wilt 
evalueren:  
i= (2+3)*4-5; // resultaat 15 => eerst 2+3, dan *4, daarna –5 
Een opstelling van de prioriteiten vindt u in de pecedentietabel. 
5.2.5.1         Rekenkundige operatoren 
Alle rekenkundige operatoren met uitzondering van “modulo” zijn gedefinieerd voor integer 
en zwevende komma datatypes. Alleen modulo is beperkt tot één integer -datatype. 
 U dient er op te letten dat in een term aan het cijfer 7 een integer datatype toegewezen 
wordt. Als u persé een getal van het datatype float wilt maken, dient u een decimale punt 
toe te voegen: 7.0.  
Operator  Uitleg  Voorbeeld       Resultaat 
        +  Optellen           2+1 
       3.2+4             3 
          7.2   
         -  Aftrekken           2 – 3 
     22 - 1.1
e
1            -1 
          11 
         *  Vermenigvuldigen
        5*4           20 
        /   Delen          7 / 2       
       7.0 / 2             3 
         3.5 
       %  Modulo        15%4 
      17%2             3 
           1    
       -  Neg. voorteken        -(2+2)            -4 
5.2.5.2        Bit –operatoren 
Bit –operatoren zijn alleen toegestaan voor integer –datatypes. 
Operator
Verklaring  Voorbeeld  Resultaat 
&  En  0x0f & 3 
0xf0 & 0x0f   3 
0 
I  Of  1 I 3 
0xf0 I 0x0f  3 
0xff 
^  exclusieve of  0xff ^ 0x0f 
0xf0 ^ 0x0f   0xf0 
0xff 
~  Bit -invertering  ~0xff 
~0xf0  0 
0x0f 

80 
5.2.5.3          Bitschuif operatoren 
Bitschuif operatoren zijn alleen toegestaan voor Integer datatypes. Bij een Bit-Shift operatie 
wordt er steeds aan het einde een 0 tussen geschoven. 
Operator
Verklaring       Voorbeeld         Resultaat 
<<  Één bit naar links schuiven  1 << 2 
3 << 3  4 
24 
>>  Één bit naar rechts schuiven
0xff >> 6 
16 >> 2  3 
4 
5.2.5.4          In –Decrement operatoren 
Increment (toename) en decrement (afname) operatoren zijn alleen toegestaan voor 
variabelen met Integer datatypes. 
Operator  Verklaring    Voorbeeld       Resultaat 
variabele++ 
Waarde der variabelen, daarna variabele met 
één verhoogd (post-increment) 
a++  a 
Variabele - - 
Waarde der variabelen, daarna variabele met 
één verlaagd (post-decrement) 
a - -  a 
++variabele 
Waarde der variabelen met één  
verhoogd (pré –increment) 
a++  a+1 
- - variabele 
Waarde der variabelen met één  
verlaagd (pré –decrement) 
a - -  a-1 
5.2.5.5          Vergelijkingsoperatoren 
Vergelijkingsoperatoren zijn toegestaan voor float en integer datatypes.
Operator
Verklaring        Voorbeeld        Resultaat 
<  Kleiner dan  1 < 2 
2 < 1 
2 < 2 
1 
0 
0 
>  Groter dan  -3 > 2 
 3 > 2  0 
1 
<=  Kleiner dan of gelijk  2 <= 2 
3 <= 2  1 
0 
>=  Groter dan of gelijk  2 >= 3 
3 >= 2  0 
1 
==  Gelijk  5 == 5 
1 == 2  1 
0 
!=  Ongelijk  2 != 2 
2 != 5  0 
1 

81 
5.2.5.6              Logische operatoren 
Logische operatoren zijn alleen toegestaan voor Integer datatypes. Elke waarde ongelijk aan 
nul geldt als logisch 1. De nul geldt als logisch 0. 
Operator
Verklaring            Voorbeeld         Resultaat 
&&  Logisch En  1 && 1 
5 && 0  1 
0 
II  Logisch Of   00 
10  0 
1 
!  Logisch Niet  !2 
!0  0 
1 
5.2.6               Controlestructuren 
Controlestructuren laten het toe om het programmaverloop in afhankelijkheid van termen, 
variabelen of invloeden te wijzigen. 
5.2.6.1          Voorwaardelijke evaluatie 
Met een voorwaardelijke evaluatie kunnen termen gemaakt worden die voorwaardelijk 
berekend worden. De formule is: 
(  term1  )   ?  term2 :  term3 
Het resultaat van deze term is term2 als term1 niet gelijk aan 0 berekend is, anders is het 
resultaat term3.  
Voorbeelden:  
a  =  (i>5)  ?  i  : 0; 
a  =  (i>b*2)  ?  i-5  :  b+1; 
while(1>  ((x>y)  ?  x  :  y)  )  i++; 

82 
5.2.6.2               do .. while 
Met een do .. while constructie kunnen, afhankelijk van een voorwaarde, aanwijzingen in 
een lus herhaald worden:  
do aanwijzing while(  term  ); 
De aanwijzing of het aanwijzingsblok wordt uitgevoerd. Aan het eind wordt de term 
geëvalueerd. Als het resultaat niet gelijk is aan 0, leidt dit tot de herhaalde uitvoering van de 
aanwijzing. De hele procedure wordt herhaald tot de term de waarde 0 aanneemt.  
Voorbeelden:  
do 
a=a+2; 
while(a<10);  
do  
{ 
      a=a*;  
      x=a; 
}  while(a);  
  Het wezenlijke verschil tussen de do .. while lus en de normale while lus is de 
omstandigheid dat in de do .. while lus de aanwijzing tenminste éénmaal uitgevoerd wordt. 
break aanwijzing 
Een break aanwijzing verlaat de lus, en de uitvoering van het programma start met de 
volgende aanwijzing na de do .. while lus.  
continue aanwijzing 
Bij de uitvoering van continue binnen een lus volgt er onmiddellijk een nieuwe berekening 
van de term. Afhankelijk van het resultaat wordt bij niet gelijk aan 0 de lus herhaald. Een 
uitkomst 0 breekt de lus af. 
Voorbeeld: 
do 
{ 
      a++; 
      if(a>10)  break;  //  breekt lus af  
} while(1) // eindeloze lus 
5.2.6.3           for 
Een for lus wordt normaalgesproken gebruikt om een bepaald aantal lusdoorlopen te 
programmeren. 

83 
for(aanwijzing1;  term;  aanwijzing2)  aanwijzing3;  
Als eerste wordt aanwijzing1 uitgevoerd, die normaalgesproken een initialisering bevat. 
Daarna volgt de evaluatie van de term. Als de term niet gelijk is aan 0 worden aanwijzing2 
en aanwijzing3 uitgevoerd, en de lus wordt herhaald. Als de term een waarde heeft van 0, 
wordt de lus afgebroken. Net als bij andere lustypes kan bij aanwijzing3 in plaats van een 
aanwijzing ook een aanwijzingsblok gebruikt worden.  
for (i=0;i<10;i++) 
{ 
      if(i>a)  a=i; 
      a - -; 
} 
 U dient er aan te denken dat de variabele i binnen de lus de waarden van 0 tot 9 
doorloopt, en niet van 1 tot 10! 
Als u een lus wilt programmeren die een andere stappenbreedte heeft, dient u aanwijzing2 
overeenkomstig aan te passen: 
for(i=0;i<100;i=i+3);   // de variabele i neemt nu toe in  
                              drievoudige stappen 
{ 
      a=5*i; 
} 
break aanwijzing 
Een break aanwijzing verlaat de lus, en de uitvoering van het programma start met de 
volgende aanwijzing na de for lus. 
continue aanwijzing 
continue zorgt voor de directe nieuwe berekening van de term. Afhankelijk van het resultaat 
wordt bij niet gelijk aan 0 aanwijzing2 uitgevoerd en de lus wordt herhaald. Een resultaat van 
0 breekt de lus af. 
Voorbeeld: 
for(i=0;i<10;i++) 
{ 
      if(i==5)  continue; 
} 
5.2.6.4        goto 
Ook wanneer het binnen een gestructureerde programmeertaal vermeden zal worden is het 
toch mogelijk om binnen een procedure met goto naar een label te springen: 
// for lus met goto realiseert 
void main(void) 
{ 
      int a; 

84 
      a=0, 
label0: 
      a++; 
      if(a<10) goto label0; 
} 
5.2.6.5       if .. else
Een if aanwijzing heeft de volgende syntax: 
if(  term  )  Aanwijzing1; 
else  Aanwijzing2; 
Achter de if aanwijzing volgt tussen haakjes een wiskundige term. Als deze term bepaald als 
niet gelijk aan 0, dan wordt aanwijzing 1 uitgevoerd. U kunt met behulp van het else 
commandowoord een alternatieve aanwijzing2 definiëren, die dan uitgevoerd wordt, als de 
term als 0 berekend is. Het toevoegen van een else aanwijzing is een optie en hoeft niet te 
gebeuren. 
Voorbeelden: 
if(a==2)  b++; 
if(x==y)  a=a+2; 
else  a=a-2; 
In plaats van een enkele aanwijzing kan ook een aanwijzingsblok gedefinieerd worden. 
Voorbeelden: 
if(x<y)     
{ 
      c++; 
      if(c==10)  c=0; 
} 
else  d - -; 
if(x>y) 
{ 
      a=b*5; 
      b - -; 
} 
else  
{ 
      a=b*4; 
      y++; 
} 
5.2.6.6       switch 
Als er, afhankelijk van de waarde van een term, verschillende commando’s uitgevoerd 
moeten worden, dan is een switch aanwijzing zeer elegant: 
Switch(  term  ) 
{ 
85 
      case  constante_1; 
               aanwijzing_1;  
      break; 
      case  constante_2; 
            aanwijzing_2;  
      break; 
      . 
      . 
      case  constante_n; 
            aanwijzing_n; 
      break; 
      default:       //  default is optioneel 
            aanwijzing_0; 
}; 
De waarde van de term wordt berekend. Daarna springt de uitvoering van het programma 
naar de constante die overeenkomt met de waarde van de term en gaat daar verder met het 
programma. Als er geen constante overeenkomt met de waarde van de term, dan wordt de 
switch constructie verlaten. 
Als er in een switch aanwijzing een default gedefinieerd is, dan worden de aanwijzingen na 
default uitgevoerd, als er geen constante is gevonden die met de waarde van de term 
overeenkomt. 
Voorbeeld: 
switch(a+2); 
{ 
   case  1: 
    b=b+2; 
break; 
case  5*5: 
     b=b+2; 
break; 
case  100&0xf: 
     b=b/c; 
break; 
default: 
     b=b+2; 
} 
break aanwijzing 
Een break verlaat de switch aanwijzing. Als u voor case de break weglaat, dan worden de 
aanwijzingen ook uitgevoerd als er naar de vorige case gesprongen wordt: 
switch(a) 
{ 
    case 1: 
        a++; 
    case 2: 
        a++;      
// wordt ook uitgevoerd bij een waarde van a==1

86 
      case 3: 
          a++;      // wordt ook uitgevoerd bij een waarde van a==1 of a==2 
} 
In dit voorbeeld worden alle drie “a++” aanwijzingen uitgevoerd als a gelijk is aan 1. 
5.1.6.2        while  
Met een wile aanwijzing kunnen afhankelijk van een voorwaarde aanwijzingen in een lus 
herhaald worden. 
while(  term )  aanwijzing; 
Eerst wordt de term bepaald. Als het resultaat niet gelijk is aan 0, dan wordt de aanwijzing 
uitgevoerd. Daarna vindt weer de berekening van de term plaats en de hele procedure wordt 
net zo lang herhaald tot de term de waarde 0 aanneemt. In plats van een enkele aanwijzing 
kan ook een aanwijzingsblok gedefinieerd worden. 
Voorbeelden: 
while(a<10)  a=a+2;  
while(a) 
{ 
      a=a*2; 
      x=a; 
} 
break aanwijzing  
Als er binnen de lus een break uitgevoerd wordt, dan wordt de lus verlaten en de uitvoering 
van het programma start met de volgende aanwijzing achter de while lus. 
continue aanwijzing 
Bij uitvoering van continue binnen een lus volgt er onmiddellijk een nieuwe berekening van 
de term. Afhankelijk van het resultaat wordt bij niet gelijk aan 0 de lus herhaald. Een 
uitkomst 0 breekt de lus af. 
Voorbeeld: 
while(1)       // eindeloze lus 
{ 
      a++;  
      if(a>10)  break;  //  breekt lus af  
} 
5.2.7          Functies 
Om grotere programma’s te structureren worden ze in meerdere subfuncties verdeeld. Dit 
verhoogt niet alleen de leesbaarheid, maar maakt het tevens mogelijk programma –
aanwijzingen die meervoudig voorkomen in functies samen te vatten.  
Een programma bestaat steeds uit de functie “main” die als allereerste gestart wordt.  
87 
Daarna kunnen vanuit main andere functies oproepen worden. Een eenvoudig voorbeeld: 
void  (func1 (void) 
{     
//  aanwijzingen in functie func1 
          . 
  . 
} 
void  (main(void) 
{     
//  de functie func1 wordt twee keer opgeroepen 
funct1(); 
funct1(); 
} 
Parameteroverdracht 
Opdat functies flexibel gebruikt kunnen worden, kunt u ze parameteriseren. Hiervoor worden 
in de haakjes na de functienaam de parameters voor de functie gescheiden door komma’s 
doorgegeven. U geeft net als in de variabelendeclaratie eerst het datatype en daarna de 
parameternaam aan. Als u geen parameters wilt doorgeven, dan schrijft u void tussen de 
ronde haakjes. Een voorbeeld: 
void  funct1 (word param1, float  param2) 
{ 
  Msg_WriteHex(param1); // de eerste parameter aangeven  
Msg_WriteFloat(param2);  // de tweede parameter aangeven 
} 
 Net als bij locale variabelen zijn overgenomen parameters alleen in de functie zelf 
zichtbaar. 
Om de functie func1 met de parameters op te roepen schrijft u bij het oproepen de 
parameters in dezelfde volgorde als waarin ze bij func1 gedefinieerd zijn. Als de functie 
geen parameters krijgt, laat u de haakjes leeg. 
void  main (void) 
{ 
         word  a; 
         float  f; 
         funct1(128,12.0);     // u kunt numerieke constanten doorgeven … 
         a=100; 
         f=12.0; 
         func1(a+28,f);  // of ook variabelen en zelfs numerieke termen 
} 
 U moet bij het oproepen van een functie steeds alle parameters aangeven. De volgende 
oproepen zouden ongeldig zijn: 
func1();                          // func1 krijgt 2 parameters! 
func1(128);                    // func1 krijgt 2 parameters! 
Retourparameters 
Het is niet alleen mogelijk parameters door te geven, een functie kan ook een retourwaarde 
hebben. Het datatype van deze waarde wordt bij de functiedefinitie voor de naam van de 

88 
functie aangegeven. Als u geen waarde wilt laten teruglopen, dan gebruikt u void als 
datatype. 
int  func1 (int  a) 
{ 
     return a-10;  
} 
De retourwaarde wordt binnen de functie met de aanwijzing “return term” aangegeven. Als 
u een functie van het type void heeft, kunt u de return aanwijzing ook zonder parameter 
gebruiken om de functie te verlaten. 
Referenties 
Omdat het niet mogelijk is arrays als parameter door te geven, kunt u uw toevlucht nemen 
tot arrays via referenties. Daarvoor schrijft u in de parameterdeclaratie van een functie een 
paar rechte haakjes achter de parameternaam: 
int  Stringlength (char  str[ ])    
{ 
         int  i; 
         i=0; 
         while(str[i])  i++; // herhaal zolang het teken niet nul is 
         return(i); 
} 
void  main(void) 
{ 
        int  len; 
        char  text[15]; 
        text=”hallo wereld”; 
        len=Stringlength(text); 
} 
In main wordt de referentie van tekst als parameter doorgegeven aan de functie 
Stringlength. Als u in een functie een normale parameter verandert, is deze verandering 
buiten deze functie niet zichtbaar. Bij referenties is dat anders. Via de parameter str kunt u in 
Stringlength de inhoud van tekst veranderen, omdat str slechts een referentie (aanwijzer) 
naar de array Variabele tekst is.  
5.2.8            Tabellen 
5.2.8.1        Operator voorrang 
         Rang  Operator 
13  ( ) 
12  ++ -- ! ~  - (negatief voorteken) 
11  *  /  % 
10  +  - 
9  <<  >> 
8  <  <=  >  >= 
7  ==  != 

89 
6  & 
5  ^ 
4  I 
3  && 
2  II 
1  ? : 
5.2.8.2        Operatoren 
  Wiskundige operatoren 
+  Optellen 
 -  Aftrekken  
 *  Vermenigvuldigen 
 /  Delen 
 %  Modulo 
 -  Negatief voorteken 
  Vergelijkende operatoren 
<  Kleiner dan 
 >  Groter dan  
<=  Kleiner dan of gelijk 
>=  Groter dan of gelijk 
==  Gelijk 
!=  Ongelijk 
  Bitschuifoperatoren 
<<  Één bit naar links schuiven 
>>  Eén bit naar rechts schuiven  
  Toename-/Afname -operatoren 
++  Post/Pre -toename 
--  Post/Pre –afname 
  Logische operatoren 
&&  Logisch en 
II  Logisch of 
I  Logisch niet 
  Bitoperatoren 
&  En 
I  Of 
^  Exclusief of 
~  Bit –invertering  

90 
5.2.8.3       Gereserveerde woorden 
De volgende woorden zijn gereserveerd en kunnen niet als naam voor kenmerken gebruikt 
worden: 
break  byte  case  char  continue 
default  do  else  false  float 
for  goto  if  int  return 
signed  static  switch  true  unsigned 
void  while  word     

91 
5.3         BASIC 
De tweede programmeertaal voor de C-Control Pro Mega module is BASIC. De compiler 
vertaald de programmeertaal BASIC commando’s naar een bytecode, die van de interpreter 
van de C-Control Pro verwerkt wordt. De taalomvang, van het hier genomde BASIC dialect, 
komt voor het grootste gedeelte overeen met de industriestandaard van grote anbieders van 
software. Volgende taalconstructies zijn er niet: 
•  Objectorienteerde progrmmering 
•  Structuren 
•  Constanten 
Uitgebreide programma- voorbeelden vindt u in de map “Demoprogramma’s” die met de 
ontwikkelomgeving geinstalleerd werd. Daar zijn op bijna alle takengebieden van de C-
Control Pro module voorbeeldoplossingen. 
De volgende paragrafen bevatten een systematische kennismaking in de syntax en semantik 
van C-Control Pro BASIC. 
5.3.1          Programma    
Een programma bestaat uit een hoeveelheid aanwijzingen (zoals bijv. “a=5;”), die over 
verschillende functies verdeeld zijn. De startfunctie die in elk programma aanwezig moet zijn, 
is de functie “main()”. Een klein programma dat een getal in het uitvoervenster drukt: 
Sub main () 
  Msg_WriteInt(42);  //  Het antwoord op alles 
End Sub 
Projecten 
Men kan een programma verdelen over meerdere bestanden die in een project (zie 
projectbeheer) samengevat zijn. Naast deze bestanden kunt u bibliotheken aan een project 
toevoegen, die functies ter beschikking stellen die door het programma gebruikt worden. 
5.3.2  Aanwijzingen 
Aanwijzing  
Een aanwijzing bestaat uit meerdere gereserveerde commandowoorden, indicatoren en 
operatoren, die door het einde van de regel afgesloten wordt. Om verschillende elementen 
van een aanwijzing te scheiden, bestaat tussen de aparte aanwijzingselementen een 
tussenruimte, in het Engels ook “whitespaces” genoemd.  
Onder tussenruimte worden verstaan spaties, tabs en regeldoorvoer (“C/R en LF”). Daarbij 
maakt het niet uit of de tussenruimte wordt gevormd door één of meerdere “whitespaces”.  

92 
Eenvoudige aanwijzing: 
a =   5; 
   Een aanwijzing hoeft niet persé compleet in een regel te staan. Omdat ook 
regeldoorvoeren tot de tussenruimte horen, is het legitiem om een aanwijzing over meerdere 
regels te verdelen. 
If a=5 _ ' Aanwijzing over 2 regels 
a=a+10 
   Er kunnen ook meer dan één aanwijzing in een regel geplaatst worden. Het teken “:” 
(dubbele punt) scheidt dan de enkele aanwijzingen. Echter, in verband met de leesbaarheid, 
moet men deze optie niet vaak gebruiken.
a=1 : b=2 : c=3 
Commentaren 
Een commentaar wordt met een enkele aanhalingsteken begonnen en met het regeleinde 
afgesloten. De tekst in de commentaren wordt door de compiler genegeerd.
' Een commentaarregel 
Indicatoren 
Indicatoren zijn de namen van functies of variabelen.  
•  Geldige tekens zijn de letters (A-Z, a-z), de cijfers (0 – 9) en de liggende streep (‘ _’ ) 
•  Een indicator begint steeds met een letter 
•  Er wordt verschil gemaakt tussen hoofd – en kleine letters 
•  Gereserveerde woorden zijn niet toegestaan als indicator 
•  De lengte van indicatoren is niet beperkt 
Rekenkundige termen 
Een rekenkundige term is een hoeveelheid waarden, die met operatoren verbonden zijn. 
Waarden betekenen in deze samenhang getallen, variabelen en functies.     
Een eenvoudig voorbeeld: 
2 + 3 
Hierbij worden de getallen 2 en 3 gekoppeld d.m.v. de operator “+”. Een rekenkundige term 
vertegenwoordigt weer een waarde. Hier is de waarde 5.  
Andere voorbeelden:  
a – 3 
b + f(5) 
2 + 3 * 6  
Volgens “punt voor streep” wordt hier eerst 3 x 6 uitgerekend en daarna 2 er bij opgeteld. 
Deze voorrang van operatoren heet bij operatoren precedent. U vindt een opsomming van 
de prioriteiten in de precedent tabel.  

93 
     Ook vergelijkingen zijn wiskundige termen. De vergelijkingsoperatoren geven als 
resultaat een waarheidswaarde van “1”of “0”, afhankelijk van of de vergelijking correct was. 
De term “3 < 5” geeft de waarde “1” (waar; true). 
Constante termen 
Een term of delen van een term kan/kunnen constant zijn. Deze deeltermen kunnen al 
tijdens de compiler –looptijd berekend worden.  
Zo wordt bijv.  
12 + 123 – 15 
door de compiler samengevat tot  
120 
Soms moeten termen constant zijn opdat ze geldig zijn. Zie bijv. declarering van array 
variabelen.  
5.3.3              Datatypes 
Waarden bezitten steeds een bepaald datatype. De integerwaarden (gehele getallen 
waarden) hebben in BASIC een 8 of 16 bit breed datatype, getallen met floating point zijn 
altijd 4 byte lang. 
 Datatypee       Voorteken            Waardebereik      Bit 
Char  Ja  -128 … +127    8 
Byte  Nee  0 … 255 8    8 
Integer  Ja  -32768 … +32767  16 
Word  Nee  0  … 65535  16 
Single  Ja           ±1.175
e
-38 to  
            ±3.402
e
38 
32 
Strings 
Er is geen expliciet “String” datatype. Een string is gebaseerd op een character array. U 
moet de grootte van de array dusdanig kiezen, zodat alle tekens van de string in het 
character array passen. Bovendien is er ruimte nodig voor een termineringsteken (decimale 
nul), om het einde van de tekenketen aan te geven. 
Type –convertering 
Bij wiskundige termen gebeurt het heel vaak dat aparte waarden niet van hetzelfde type zijn. 
Zo zijn de datatypes in de volgende term gemengd (a is integer variabele). 
a + 5.5 
In dit geval wordt a eerst geconverteerd naar het datatype Single en daarna wordt er 5.5 bij 
opgeteld. Het datatype van het resultaat is eveneens Single. Bij de typeconvertering gelden  

94 
de volgende regels: 
•  Als bij de verbinding van twee 8 bit of 16 bit integer- waarden één van beide datatypes 
van een voorteken is voorzien, dan is ook het resultaat van de term van een voorteken 
voorzien.  
•  Als één van beide operandi van het type Single is, dan is het resultaat eveneens van het 
type Single. Als één van de beide operandi een 8 bit of 16 bit datatype heeft, dan wordt 
deze voor de operatie omgevormd tot een single datatype. 
5.3.4         Variabelen 
Variabelen kunnen verschillende waarden aannemen, afhankelijk van het datatype waarmee 
ze gedefinieerd zijn. Een variabele –definitie ziet er als volgt uit:   
Dim variabelennaam As type 
Als u meerdere variabelen van hetzelfde type wilt definiëren, kunt u meerdere variabelen-
namen door een komma gescheiden aangeven: 
Dim naam1, naam2, naam3, A Integer 
Als type zijn toegestaan: Char, Byte, Integer, Word, Single   
Voorbeelden: 
Dim a As Integer 
Dim i,j As Integer 
Dim xyz As Single 
Aan integer- variabelen kunnen getalwaarden decimaal of als hexgetal toegewezen worden. 
Voor een hexgetal worden voor het getal de letters “&H” gezet. Bovendien mag men zoals 
bij C hexadecimale getallen met een prefix “0x” beginnen.Bij variabelen met een van 
voorteken voorzien datatype kunnen negatieve decimale getallen toegewezen worden door 
een minteken voor het getal te plaatsen. 
Voorbeelden: 
Dim a As Word 
Dim i,j As Integer 
a=&H3ff 
i=15 
j=-22 
a=0x3ff 
Getallen met zwevende komma (datatype Single) mogen een decimale punt en een 
exponent bevatten: 
Dim x,y As Single 
x=5.70 
y=2.3e+2 
x=-5.33e-1 
95 
sizeof  Operator 
Met de operator sizeof() kan het aantal bytes bepaald worden die een variabele in het 
geheugen inneemt. 
Voorbeeld: 
Dim s As Integer 
Dim f As Single 
s=SizeOf(f) ' de waarde van s is 4 
  
Bij arrays wordt ook alleen de bytelengte van het basis –datatype als uitkomst gegeven. 
U moet de waarde met het aantal elementen vermenigvuldigen om het geheugenverbruik 
van de array te berekenen. 
Array variabelen 
Als u achter de naam bij de variabelen –definitie tussen ronde haakjes een getalswaarde 
schrijft, dan heeft u een array gedefinieerd. Een array legt de plaats voor de gedefinieerde 
variabele meervoudig in het geheugen vast. Bij de voorbeelddefinitie: 
Dim x(10) As Integer 
wordt voor de variabele x de 10-voudige geheugenplaats vastgelegd. De eerste geheugen-
plaats kan aangesproken worden met x(0)], de tweede met x(1)], de derde met x(2), …tot 
x(9). U mag bij de definitie natuurlijk ook andere indexgroottes kiezen. De beperking is 
alleen de RAM geheugenplaats van de C-Control Pro. 
U kunt ook meerdimensionale arrays declareren, waarin nog meer rechte haakjes bij de 
variabelen –definitie toegevoegd worden: 
Dim x(3,4) As Integer ' Array met 3*4 invoeren 
Dim y(2,2,2) As Integer ' Array met 2*2*2 invoeren 
 Arrays mogen in BASIC maximaal 16 indices (dimensies) hebben. De maximale waarde 
voor een index is 65535. De indices van de arrays zijn altijd op nul gebaseerd, d.w.z. elke 
index begint met 0.  
 Er vindt tijdens het lopen van het programma geen controle plaats of de gedefinieerde 
indexgrens van een array is overschreden. Als de index tijdens de programmabewerking te 
groot wordt, neemt het programma zijn toevlucht tot vreemde variabelen en is de kans groot 
dat het programma ‘crasht’.   
Strings 
Er is geen specifieke “String” datatype. Een string is gebaseerd op een array van het data-
type Char. U moet de grootte van de array zo kiezen, dat alle tekens van de string in de 
character array passen. Bovendien is er plaats nodig voor een termineringsteken (decimale 
nul), om het eind van de tekenketen aan te geven.  
Voorbeeld van een tekenketen met maximaal 20 tekens: 
Dim str1(21) As Char 
Als uitzondering mag men aan Char arrays tekenketens toewijzen. Daarbij wordt de teken-
keten tussen aanhalingstekens gezet. 
96 
str1="Hallo wereld!" 
  Er kan geen String aan grotere Char array toegewezen worden. Echter zijn er trucs voor 
gevorderden: 
Dim str_array(3,40) As Char 
Dim Single_str(40) As Char 
Single_str="A String" 
Str_StrCopy(str_array,Single_str,40); // kopieert Single_str in de 
tweede String 
Dit functioneert omdat met een afstand van 40 tekens achter de string in str_array de ruimte 
voor de tweede string ligt. 
Zichtbaarheid van variabelen 
Als variabelen buiten de functies gedeclareerd worden, hebben ze een globale 
zichtbaarheid. D.w.z., ze zijn vanuit elke functie aanspreekbaar. Declaraties van variabelen 
binnen functies produceren locale variabelen. Locale variabelen kunnen alleen binnen de 
functie bereikt worden. Een voorbeeld: 
Dim a,b As Integer 
Sub func1() 
    Dim a,x,y As Integer 
    // globale b is toegankelijk 
    // globale a is niet toegankelijkbar, deze is door locale a afgedekt 
    // locale x,y zijn toegankelijk  
    // u is niet toegankelijk omdat deze locaal hoort tot functie main 
End Sub 
Sub main() 
    Dim u As Integer 
    // globale a,b zijn toegankelijk  
    // locale u is toegankelijk  
    // x,y niet toegankelijk omdat deze locaal hoort tot func1 
End Sub 
Globale variabelen hebben een gedefinieerd geheugenbereik dat tijdens de totale 
programmaduur ter beschikking staat.  
 Bij de start van het programma worden de globale variabelen met nul geïnitialiseerd. 
Locale variabelen worden tijdens de berekening van een functie door de variabelen in het 
stack aangelegd. Dat betekent dat locale variabelen alleen in het geheugen bestaan tijdens 
de tijd dat de functie verwerkt wordt.  
Als bij locale variabelen dezelfde naam gekozen wordt als bij een globale variabele, dan ver-
bergt de locale variabele de globale variabele. Zolang zich het programma dan ophoudt in 
de functie waar de locale variabele met dezelfde naam gedefinieerd is, kan de globale 
variabele niet aangesproken worden.     
Static variabelen 
Bij locale variabelen kan de eigenschap static  voor het datatype gezet worden. 

97 
Sub func1() 
    Static a As Integer 
End Sub 
Static variabelen behouden in tegenstelling tot normale variabelen hun waarde ook als de 
functie verlaten wordt. Bij een volgende oproep van de functie heeft de statische variabele 
dezelfde inhoud als bij het verlaten van de functie. Omdat de inhoud van een Static 
variabele bij de eerste toegang gedefinieerd is, worden statische variabelen net als globale 
ook bij de start van het programma met nul geïnitialiseerd. 
5.3.5          Operatoren 
Prioriteiten van operatoren 
Operatoren verdelen wiskundige termen in deeltermen. De operatoren worden dan in de 
volgorde van hun prioriteit (precedentie) bepaald. Termen met operatoren van dezelfde 
prioriteit worden van links naar rechts berekend. Voorbeeld: 
i= 2+3*4-5;  // resultaat 9 => eerst 3*4, dan +2, daarna –5 
U kunt de volgorde van de bewerking beïnvloeden door haakjes te plaatsen. Haakjes 
hebben de grootste prioriteit. Als u het laatste voorbeeld strikt van links naar rechts wilt 
evalueren:  
i= (2+3)*4-5; // resultaat 15 => eerst 2+3, dan *4, daarna –5 
Een opstelling van de prioriteiten vindt u in de pecedentietabel. 
5.3.5.1         Rekenkundige operatoren 
Alle rekenkundige operatoren met uitzondering van “modulo” zijn gedefinieerd voor integer 
en zwevende komma datatypes. Alleen modulo is beperkt tot één integer -datatype. 
 U dient er op te letten dat in een term aan het cijfer 7 een integer datatype toegewezen 
wordt. Als u persé een getal van het datatype Single wilt maken, dient u een decimale punt 
toe te voegen: 7.0.  
Operator  Verklaring  Voorbeeld       Resultaat 
        +  Optellen           2+1 
       3.2+4             3 
          7.2   
         -  Aftrekken           2 – 3 
     22 - 1.1
e
1            -1 
          11 
         *  Vermenigvuldigen
        5*4           20 
        /   Delen          7 / 2       
       7.0 / 2             3 
         3.5 
       Mod  Modulo        15 Mod 4 
      17 Mod 2             3 
           1    
       -  Neg. voorteken        -(2+2)            -4 

98 
5.3.5.2        Bit –operatoren 
Bit –operatoren zijn alleen toegestaan voor integer –datatypes. 
Operator
Verklaring         Voorbeeld             Resultaat 
   And  En  &H0f And 3 
&Hf0 And &H0f   3 
0 
   Or  Of  1 Or 3 
&Hf0 Or &H0f  3 
&Hff 
   Xor  exclusieve of  &Hff Xor &H0f 
&Hf0 Xor &H0f   &Hf0 
&Hff 
   Not  Bit -invertering  Not &Hff 
Not &Hf0  0 
&H0f 
5.3.5.3          Bitschuif operatoren 
Bitschuif operatoren zijn alleen toegestaan voor Integer datatypes. Bij een Bit-Shift operatie 
wordt er steeds aan het einde een 0 tussen geschoven. 
Operator
Verklaring       Voorbeeld         Resultaat 
<<  Één bit naar links schuiven  1 << 2 
3 << 3  4 
24 
>>  Één bit naar rechts schuiven
&Hff >> 6 
16 >> 2  3 
4 
5.2.5.5          Vergelijkingsoperatoren 
Vergelijkingsoperatoren zijn toegestaan voor Single en integer datatypes.
Operator
Verklaring        Voorbeeld        Resultaat 
<  Kleiner dan  1 < 2 
2 < 1 
2 < 2 
1 
0 
0 
>  Groter dan  -3 > 2 
 3 > 2  0 
1 
<=  Kleiner dan of gelijk  2 <= 2 
3 <= 2  1 
0 
>=  Groter dan of gelijk  2 >= 3 
3 >= 2  0 
1 
=  Gelijk  5 = 5 
1 = 2  1 
0 
<>  Ongelijk  2 <> 2 
2 <> 5  0 
1 
99 
5.3.6               Controlestructuren 
Controlestructuren laten het toe om het programmaverloop in afhankelijkheid van termen, 
variabelen of invloeden te wijzigen. 
5.3.6.1          Do Loop While 
Met een Do… Loop While constructie kunnen, afhankelijk van een voorwaarde, 
aanwijzingen in een lus herhaald worden: 
Do 
       aanwijzing  
Loop While  term   
De aanwijzing wordt uitgevoerd. Aan het eind wordt de term geëvalueerd. Als het resultaat 
niet gelijk is aan 0, leidt dit tot de herhaalde uitvoering van de aanwijzing. De hele procedure 
wordt herhaald tot de term de waarde 0 aanneemt.  
Voorbeelden:  
Do 
     a=a+2; 
Loop While a<10  
Do  
      a=a*2  
      x=a 
Loop While a  
  Het wezenlijke verschil tussen de Do Loop while lus en de normale Do While lus is de 
omstandigheid dat in de Do Loop While lus de aanwijzing tenminste éénmaal uitgevoerd 
wordt. 
Exit aanwijzing 
Een Exit aanwijzing verlaat de lus, en de uitvoering van het programma start met de 
volgende aanwijzing na de Do Loop While lus.  
Voorbeeld: 
Do 
     a=a+1 
     If a>10  Then 
         Exit   breekt lus af  
     End If 
Loop While 1    eindeloze lus 
100 
5.3.6.2         Do While 
Met een while aanwijzing kunnen, afhankelijk van een voorwaarde, aanwijzingen in een lus 
herhaald worden: 
Do While term 
Aanwijzingen 
End While 
Eerst wordt de term geëvalueerd. Als het resultaat niet gelijk is aan 0, leidt dit tot de 
uitvoering van de aanwijzing. Daarna wordt de berekening van de term opnieuw uitgevoerd 
en de hele procedure wordt herhaald tot de term de waarde 0 aanneemt.  
Voorbeelden:  
Do While a<10 
    a=a+2 
End While 
Do While a 
    a=a*2 
    x=a 
End While 
Exit aanwijzing 
Als er binnen een lus Exit uitgevoerd wordt, dan wordt de lus verlaten en de uitvoering van 
het programma start met de volgende aanwijzing naa de While lus.  
Voorbeeld: 
Do While 1 ' eindeloze lus 
      a=a+1 
      If a>10 Then 
          Exit ' breekt lus af 
      End If 
End While 
5.3.6.3       For Next 
Een For Next lus wordt normaalgesproken gebruikt om een bepaald aantal lusdoorlopen te  
programmeren. 
For Tellervariable=Startwaarde To Eindwaarde Step stapbreedte 
    Aanwijzingen 
Next 
De tellervariabele wordt op de startwaarde gezet en daarna worden de aanwijzingen zo vaak 
herhaald tot de eindwaarde bereikt is. Bij elke lussendoorloop verhoogt zich de waarde van de 
tellervariabele met de stapbreedte, deze mag ook negatief zijn. Het aangeven van de 
stapbreedte achter de eindwaarde is optioneel. Als de stapbreedte niet wordt aangegeven dan 
heeft deze de waarde 1. 
101 
 Omdat bij de For Next lus de extreme waarde bepaald wordt moet de tellervariabele van 
het type integer zijn. 
Voorbeelden 
For i=1 To 10 
If i>a Then 
a=i 
End If 
a=a-1 
Next 
For i=1 To 10 Step 3 ' verhoog i in 3-voudige stappen 
If i>3 Then 
a=i 
End If 
a=a-1 
Next 
 Op deze plaats nogmaals de opmerking, arrays zijn steeds op nul gebaseerd. Een For 
Next lus moet daarom bij een array toegang eerst van 0 to 9 lopen. 
Exit aanwijzing 
Een Exit aanwijzing verlaat de lus, en de uitvoering van het programma start met de 
volgende aanwijzing na de For lus. 
Voorbeeld: 
For i=1 To 10 
If i=6 Then 
Exit 
End If 
Next 
5.3.6.4        Goto 
Ook wanneer het binnen een gestructureerde programmeertaal vermeden zal worden is het 
toch mogelijk om binnen een procedure met Goto naar een label te springen. Om een label 
te kenmerken wordt het commando Lab voor de labelnaam gezet. 
' For lus met Goto maakt 
Sub main() 
Dim a As Integer 
a=0 
Lab label1 
a=a+1 
If a<10 Then 
Goto label1 
End If 
End Sub 

102 
5.3.6.5       If .. Else
Een If aanwijzing heeft de volgende syntax: 
If term1 Then 
aanwijzingen1 
ElseIf term2 Then 
aanwijzingen2 
Else 
Aanwijzingen3 
End If 
Achter de if aanwijzing volgt een rekenkundige term. Als deze term bepaald wordt als niet 
gelijk aan 0, dan wordt aanwijzingen1 uitgevoerd. U kunt met behulp van het Else 
commandowoord een alternatieve aanwijzingen2 definiëren, die dan uitgevoerd wordt, als 
de term als 0 berekend is. Het toevoegen van een Else aanwijzing is een optie en hoeft niet 
te gebeuren. 
Als in de Else- tak direct weer een If- aanwijzing staat is het mogelijk met Elself direct weer 
een If te activeren. Hierbij hoeft de nieuwe If niet in de Else- blok staan, en de brontekst blijft 
overzichtelijk. 
Voorbeelden: 
If a=2 Then 
b=b+1 
End If 
If x=y Then 
a=a+2 
Else 
a=a-2 
End If 
If a<5 Then 
a=a-2 
ElseIf a<10 Then 
a=a-1 
Else 
a=a+1 
End If 
103 
5.3.6.6       Select Case 
Als afhankelijk van de waarde van een term verschillende commando’s uitgevoerd moeten 
worden is een Select Case aanwijzing heel geschikt: 
Select Case term 
Case constante_1 
Aanwijzingen_1 
Case constante_2 
Aanwijzingen_2 
. 
. 
Case constante_n 
Aanwijzingen_n 
Else ' Else is optioneel 
Aanwijzingen 
End Case 
De waarde van term wordt berekend. Daarna sprint de programmauitvoering naar constante, 
die overeenkomt met de waarde van de term, en laat het programma daar verder lopen. Als er 
geen constante overeenkomt met de termwaarde, dan wordt de Select Case constructie 
verlaten. 
Als in een Select Case aanwijzing een Else gedefinieerd is, dan worden de aanwijzingen na 
Else uitgevoerd, wanneer geen constante gevonden wordt, die overeenkomt met de waarde 
van de term. 
Voorbeeld: 
Select Case a+2 
Case 1 
b=b*2 
Case 5*5 
b=b+2 
Case 100 And &Hf 
b=b/c 
Else 
b=b+2 
End Case 
  In CompactC worden de aanwijzingen na de case- aanwijzing verder uitgevoerd tot er een 
break komt of de switch aanwijzing verlaten wordt. Dit is in BASIC anders: hier wordt de 
verwerking van de commando’s na Case afgebroken zodra een Case aanwijzing bereikt wordt. 
5.3.7        Functies 
Om grotere programma’s te structureren worden ze in meerdere subfuncties verdeeld. Dit 
verhoogt niet alleen de leesbaarheid, maar maakt het tevens mogelijk programma –
aanwijzingen die meervoudig voorkomen in functies samen te vatten.  
Een programma bestaat steeds uit de functie “main” die als allereerste gestart wordt. 
Daarna kunt u vanuit main andere functies oproepen. Een eenvoudig voorbeeld: 
Sub func1() 
' Aanwijzingen in functie func1 
104 
End Sub 
Sub main() 
' de functie func1 wordttwee keer opgeroepen 
func1() 
func1() 
End Sub 
Parameteroverdracht 
Opdat functies flexibel gebruikt kunnen worden, kunt u ze parameteriseren. Hiervoor worden 
in de haakjes na de functienaam de parameters voor de functie gescheiden door komma’s 
doorgegeven. U geeft net als in de variabelendeclaratie eerst de parameternaam aan en 
daarna het datatype. Als u geen parameters wilt doorgeven, dan blijven de haakjes leeg. 
Een voorbeeld: 
Sub func1(param1 As Word, param2 As Single) 
Msg_WriteHex(param1) ' de eerste parameter aangeven 
Msg_WriteFloat(param2) ' de tweede parameter aangeven 
End Sub 
 Net als bij locale variabelen zijn ingevoerde parameters alleen in de functie zelf zichtbaar. 
Om de functie func1 met de parameters op te roepen schrijft u bij het oproepen de 
parameters in dezelfde volgorde zoals deze bij func1 gedefinieerd zijn. Als de functie geen 
parameters krijgt, laat u de haakjes leeg. 
Sub main() 
Dim a As Word 
Dim f As Single 
func1(128,12.0) ' men kan numerieke constanten doorgeven ... 
a=100 
f=12.0 
func1(a+28,f) ' of ook variablen en zelfs numerieke termen 
End Sub 
 U moet bij het oproepen van een functie steeds alle parameters aangeven. De volgende 
oproepen zouden ongeldig zijn: 
func1()     ' func1 krijgt 2 parameter! 
func1(128)   ' func1 krijgt 2 parameter! 
Return parameters 
Het is niet alleen mogelijk parameters door te geven, een functie kan ook een retourwaarde 
hebben. Het datatype van deze waarde wordt bij de functiedefinitie na de parameterlijst van 
de functie aangegeven.  
Sub func1(a As Integer) As Integer 
Return a-10 
End Sub 
De retourwaarde wordt binnen de functie met de aanwijzing “Return term” aangegeven. Als 
een functie geen retourwaarde heeft, kunt u de Return aanwijzing ook zonder parameter 
gebruiken om de functie te verlaten. 

105 
Referenties 
Omdat het niet mogelijk is, arrays als parameter door te geven, kunt u uw toevlucht nemen 
tot arrays via referenties. Daarvoor schrijft u in de parameterdeclaratie van een functie 
“ByRef” voor de parameternaam: 
Sub StringLength(ByRef str As Char) As Integer 
Dim i As Integer 
i=0 
Do While str(i) 
i=i+1 ' herhaal zolang het teken nu is 
End While 
Return i 
End Sub 
Sub main() 
Dim Len As Integer 
Dim Text(15) As Char 
Text="hallo wereld" 
Len=StringLength(Text) 
End Sub 
In main wordt de referentie van tekst als parameter doorgegeven aan de functie 
Stringlength. Als u in een functie een normale parameter verandert, is deze verandering 
buiten deze functie niet zichtbaar. Bij referenties is dit anders. Via de parameter str kunt u in 
Stringlength de inhoud van text veranderen, omdat str slechts een referentie (aanwijzer) 
naar de Array Variabele text is.  
5.3.8         Tabellen 
5.3.8.1      Operator precedentie (voorrang) 
               Rang  Operator 
10  ( ) 
9  -  (
negatief voorteken
) 
8  *  /   
                   7 
Mod 
6  +   - 
5  <<    >> 
4  =   <>   <   <=   >   >= 
3 
Not 
2 
And 
1 
Or   Xor 

106 
5.3.8.2        Operatoren 
  Wiskundige operatoren 
           +  Optellen 
           -  Aftrekken  
           *  Vermenigvuldigen 
           /  Delen 
Mod 
Modulo 
           -  Negatief voorteken 
  Vergelijkende operatoren 
          <  Kleiner dan 
          >  Groter dan  
          <=  Kleiner dan of gelijk 
          >=  Groter dan of gelijk 
           =  Gelijk 
          <>  Ongelijk 
  Bitschuifoperatoren 
          <<  Één bit naar links schuiven 
          >>  Eén bit naar rechts schuiven  
  Bitoperatoren 
         And  En 
         Or  Of 
         Xor  Exclusieve of 
         Not  Bit –invertering  
5.3.8.3       Gereserveerde woorden 
De volgende woorden zijn gereserveerd en kunnen niet als naam voor kenmerken gebruikt 
worden: 

107 
5.4          Bibliotheken 
In dit gedeelte van het handboek worden alle bijgeleverde hulpfuncties beschreven, waarmee 
het voor de gebruiker mogelijk is om toegang te krijgen op de harware. In het begin wordt voor 
elke functie de syntax voor CompactC en BASIC getoond. Daarna volgt de beschrijving van de 
functie en de gebruikte parameters. 
5.4.1          Interne functies 
Opdat de compiler de interne functies die in de interpreter aanwezig zijn kan herkennen, 
moeten deze functies in de bibliotheek “IntFunc_Lib.cc” gedefinieerd zijn. Als deze bibliotheek 
niet ingepakt is, dan kunnen er geen uitvoeren van het programma gedaan worden. Een 
typische invoer in “IntFunc_Lib.cc” ziet er bijv. zo uit: 
void  Msg_WriteHex$Opc(0x23) (Word  val); 
Deze definitie zegt, dat de functie (“Msg_WriteHex”) in de interpreter met een sprongvector van 
0x23 opgeroepen wordt, en er als parameter een word naar de stack doorgegeven moet 
worden. 
 Veranderingen in de bibliotheek “IntFunc_Lib.cc” kunnen er toe leiden, dat de daar 
gedeclareerde functies niet meer correct uitgevoerd kunnen worden! 
5.4.2          AbsDelay 
Algemene functies                                                                                                                               . 
Syntax 
void AbsDelay(word ms); 
Sub AbsDelay(ms As Word); 
Beschrijving 
De functie AbsDelay() wacht een bepaald aantal milliseconden. 
  De functie werkt weliswaar heel nauwkeurig, maar onderbreekt niet alleen de bewerking 
van de actuele thread, maar laat de Bytecode interpreter in zijn geheel wachten. Interrupts 
worden weliswaar geregistreerd, maar de interruptroutines worden in deze tijd niet verwerkt, 
omdat ook daarvoor de Bytecode interpreter nodig is.  
 Bij het werken met threads moet steeds Thread Delay en niet AbsDelay gebruikt worden. 
Als er toch bijv. een AbsDelay(1000) gebruikt wordt, leidt dit tot het volgende effect: opdat de 
thread pas na 5000 cycli (default waarde) naar de volgende thread wisselt, zou de thread 
5000*1000ms (5000sec.) lopen tot de volgende thread zou kunnen werken. 
Parameter 
ms    Wachttijd in ms 

108 
5.4.3           Analoge comparator 
De analoge comparator maakt het mogelijk twee signalen te vergelijken. Het resultaat van 
dieze vergelijking wordt of als “0” of “1” teruggegeven. 
5.4.3.1        Acomp 
Acomp Functies  Voorbeeld 
Syntax 
void AComp(byte mode); 
Sub AComp(mode As Byte); 
Beschrijving 
De analoge comparator maakt het mogelijk twee analoge signalen te vergelijken. Het resultaat 
van deze vergelijking wordt of als “0” of als “1” teruggegeven (uitgang van de comparator). De 
negatieve ingang is Mega32: AIN1 (Poort B.3), Mega128: AIN1 (PoortE.3).. De positieve 
ingang kan of Mega32: AIN0 (Poort B.22, Mega128: AIN0 (PoortE.2) zijn, of een interne 
referentie-spanning van 1,22V.  
Parameter
mode  Werkmodus 
Moduswaarden: 
 0x00  Externe ingangen (+)AIN0 en (-)AIN1 worden toegepast 
 0x40  Externe ingang (-)AIN1 en interne referentiespanning worden toegepast 
 0x80  Analoge comparator wordt uitgeschakeld 
109 
5.4.3.2        AComp voorbeeld 
Voorbeeld: gebruik van de analoge comparator 
// AComp: analoge comparator 
// Mega32:  ingang (+) PB2 (PortB.2) resp. band gap reference 1,22V 
//     ingang (-) PB3 (PortB.3) 
// Mega128: ingang (+) PE2 (PortE.2) resp. band gap reference 1,22V 
//     ingang (-) PE3 (PortE.3) 
// noodzakelijke Library: IntFunc_Lib.cc 
// De functie AComp geeft de waarde van de comparator terug. 
// Is de spanning op de ingang PB2/PE2 groter dan op de ingang PB3/PE3  
// heeft de functie AComp de waarde 1. 
// Mode: 
// 0x00 externe ingangen (+)AIN0 en (-)AIN1 worden toegepast 
// 0x40 externe ingang (-)AIN1 en interne Referentiespanning worden  
// toegepast 
// 0x80 analoge comparator wordt uitgeschakeld 
// De oproep kan met de parameter 0 (beide ingangen worden toegepast) 
// of 0x40 (interne referentiepanning op (+) ingang, externe ingang  
// PB3/PE3) gebeuren. 
//------------------------------------------------------------------------- 
// Hoofdprogramma 
// 
void main(void) 
{ 
while (true) 
{ 
if (AComp(0x40)==1)   // ingang (+) band gap reference 1,22V 
{ 
Msg_WriteChar('1'); // uitvoer: 1 
} 
else 
{ 
Msg_WriteChar('0'); // uitvoer: 0 
} 
// De comparator wordt alle 500ms gelezen en uitgegeven 
AbsDelay(500); 
       } 
} 
5.4.4          Analoge- digitale- omvormer 
De microcontroller beschikt over een analoog-digitaal-omvormer met een resolutie van 10 
bit. Dat betekent dat gemeten spanningen als gehele getallen van 0 tot 1023 weergegeven 
worden. De referentiespanning voor de ondergrens is het GND-niveau, dus 0V. De 
referentiespanning voor de bovengrens kan gekozen worden. 
•  externe referentiespanning 
•  AVCC met condensator op AREF 
•  Interne spanningsreferentie 2,56V met condensator op AREF 

110 
Analoge ingangen ADC0 … ADC7, ADC, BG, ADC GND 
Als ingangen voor de ADC staan de ingangen ADC0 … ADC7 (poort A.0 tot A.7 bij de 
Mega32, poort F.0 tot F.7 bij de Mega128),  een interne band gap (1,22V) of GND (0V) ter 
beschikking. ADC_BG en ADC_GND kunnen gebruikt worden voor het controleren van de 
ADC. 
Als x een digitale meetwaarde is, dan wordt de desbetreffende spanningswaarde u als volgt 
berekend: 
u = x * referentiespanning / 1024 
Als de externe referentiespanning 4,096V bedraagt, bijv. opgewekt door een 
referentiespanning –IC, dan komt een verschil van één bit van de gedigitaliseerde meetwaarde 
overeen met een spanningsverschil van 4mV of: 
u = x * 0,004V  
Verschil -ingangen 
ADC22x10   Verschil –ingangen ADC2, ADC2, versterking 10     ; offsetmeting 
ADC23x10    Verschil –ingangen ADC2, ADC3, versterking 10     
ADC22x200  Verschil –ingangen ADC2, ADC2, versterking 200   ; offsetmeting 
ADC23x200  Verschil –ingangen ADC2, ADC3, versterking 200 
ADC20x1      Verschil –ingangen ADC2, ADC0, versterking 1 
ADC21x1      Verschil –ingangen ADC2, ADC1, versterking 1 
ADC22x1      Verschil –ingangen ADC2, ADC2, versterking 1       ; offsetmeting 
ADC23x1      Verschil –ingangen ADC2, ADC3, versterking 1 
ADC24x1      Verschil –ingangen ADC2, ADC4, versterking 1 
ADC25x1      Verschil –ingangen ADC2, ADC5, versterking 1 
ADC2 is de negatieve ingang. 
De ADC kan ook verschilmetingen uitvoeren. Het resultaat kan positief of negatief zijn. De 
resolutie bedraagt bij differentiemetingen +/- 9 bit en wordt weergegeven als two’s 
complement. Bij de verschilwerking staat een versterker ter beschikking met de versterkingen 
V: x1, x10, x200. Als x een digitale meetwaarde is, dan wordt de desbetreffende spannings-
waarde als volgt berekend:   
u = x * referentiespanning / 512 / V 
5.4.4.1           ADC_Disable 
ADC functies 
Syntax 
void ADC_Disable(void); 
Sub ADC_Disable() 
Beschrijving: 
De functie ADC_Disable schakelt de A/D –omvormer uit om het stroomverbruik te 
verminderen.  

111 
Parameters 
Geen 
5.4.4.2            ADC_Read 
ADC functies 
Syntax 
word ADC_Read(void); 
Sub ADC_Read() As Word 
Beschrijving:  
De functie ADC_Read levert de gedigitaliseerde meetwaarde van één van de 8 ADC-poorten. 
Het nummer van de poort (0 …7) werd bij het oproepen van ADC Set() als parameter 
doorgegeven. Het resultaat ligt binnen het bereik van 0 tot 1023 – hetgeen overeenkomt met 
de 10-bit resolutie van de A/D –omvormer. Er kunnen de analoge ingangen ADC0 tot ADC7 
tegen GND gemeten worden of verschilmetingen met de versterkingsfactoren 1/10/200. 
Returnwaarde   
gemeten waarde van de ADC –poort . 
5.4.4.3              ADC_ReadInt 
ADC –functies 
Syntax 
word ADC_ReadInt(void); 
Sub ADC_ReadInt() As Word
Beschrijving 
Deze functie wordt toegepast om na een ADC-interrupt de meetwaarde te lezen. De ADC-
interrupt wordt geactiveerd nadat de AD_omvorming afgesloten is en hiermede een nieuwe 
meting beschikbaar is. Zie ook ADC  SetInt en ADC  StartInt. De functie ADC_Read levert de 
gedigitaliseerde meetwaarde van één van de 8 ADC poorten. Het nummer van de poort (0 … 
7) werd bij het oproepen van ADC  SetInt als parameter doorgegeven. Het resultaat ligt binnen 
het bereik van 0 tot 1023 – hetgeen overeenkomt met de 10-bit resolutie van de A/D –
omvormer. U kunt de analoge ingangen ADC0 tot ADC7 tegen GND meten of verschilmetingen 
met de versterkingsfactoren 1/10/200. 
Returnwaarde   
gemeten waarde van de ADC –poort . 

112 
5.4.4.            ADC_Set 
ADC –functies 
Syntax 
word ADC_Set(byte v_ref,byte channel); 
Sub ADC_Set(v_ref As Byte,channel As Byte) As Word 
Beschrijving 
De functie ADC_Set initialiseert de analoge- digitale-_omvormer. De referentiespanning en het 
meetkanaal worden gekozen en de A/D omvormer wordt voorbereid voor de metingen. De 
meetwaarde wordt daarna met ADC Read() uitgelezen. 
Parameter
channel  Poortnummer (0 … 7) van de ADC (poort A.0 tot A.7 bij de Mega32, poort F.0 tot F.7 bij de  
 Mega128) 
v_ref  Referentiespanning (zie tabel)
         Naam           Waarde  Beschrijving 
    ADC_VREF_BG          0xC0  2,56V interne referentiespanning 
    ADC_VREF_VCC         0x40  Voedingsspanning (5V) 
    ADC_VREF_EXT         0x00  Externe referentiespanning op PAD3
5.4.4.5           ADC_SetInt 
ADC functies 
Syntax 
word  ADC_SetInt(byte  v_ref,byte  channel ); 
Sub  ADC_SetInt(v_ref, As Byte,  channel  As Byte) As Word 
Beschrijving 
De functie ADC_SetInt initialiseert de analoog-digitaal_omvormer voor de interrupt -functie. De 
referentiespanning en het meetkanaal worden gekozen en de A/D omvormer wordt voorbereid 
voor de metingen. De interrupt-service-routine voor de ADC moet gedefinieerd zijn. Nadat de 
interrupt heeft plaatsgevonden kan de meetwaarde ADC ReadInt() uitgelezen worden. 
Parameter
channel Poortnummer (0..7) van de ADC 
(poort A.0 tot A.7 bij de Mega32, poort F.0 tot F.7 bij 
de Mega128) 
v_ref Referentiespanning (zie tabel) 

113 
Naam  Waarde   Beschrijving 
ADC_VREF_BG        0xC0  2,56V interne referentiespanning 
ADC_VREF_VCC       0x40  Voedingsspanning (5V) 
ADC_VREF_EXT       0x00  Externe referentiespanning op PAD3 
Voor de positie van PAD3 zie jumper Application board M32 of M128. 
5.4.4.6        ADC_StartInt 
ADC functies 
Syntax
void ADC_StartInt(void); 
Sub ADC_StartInt() 
Beschrijving 
De meting wordt gestart, als eerst de A/D omvormer met behulp van ADC SetInt() op interrupt 
geïnitialiseerd is. Als het meetresultaat klaarligt, wordt er een ADC_Interrupt geactiveerd. 
Parameters 
Geen 
5.4.5             DCF 77 
Alle DCF –routines zijn in de bibliotheek “LCD_Lib.cc” gerealiseerd. Voor het gebruik van deze 
functies dient u de bibliotheek “DCF_Lib.cc” in het project te integreren.  
RTC met DCF77 tijdsynchronisatie 
Het DCF77 signaal 
De logische informatie (de tijdinformatie) wordt samen met de normale frequentie (de draag-
frequentie van de zender, dus 77,5 kHz) verzonden. Dit gebeurt door negatieve modulatie van 
het signaal (verlaging van de draagamplitude tot 25%). Het begin van de verlaging ligt steeds 
op het begin van de seconden 0 … 58 binnen een minuut. In de 59
e
 seconde vindt er geen 
verlaging plaats, waardoor het volgende secondekenmerk het begin van een minuut aangeeft, 
en de ontvanger gesynchroniseerd kan worden. De logische waarde van de tekens volgt uit de 
duur ervan: 100ms is de “0”, 200ms is de “1”. Daardoor staat er binnen een minuut 59 bit voor 
infor-matie ter beschikking. Daarvan worden de secondekenmerken 1 tot 14 gebruikt voor 
gebruiks-informatie, die niet voor de DCF77 –gebruiker bedoeld zijn. De secondekenmerken 
15 tot 19 kenmerken de zendantenne, de tijdzone en kondigen tijdomschakelingen aan: 
Van de 20
e
 tot de 58
e
 seconde wordt de tijdinformatie voor de daaropvolgende minuut serieel 
in de vorm van BCD –getallen overgedragen, waarbij steeds begonnen wordt met de bit met 
de laagste waarde: 

114 
Bits  Betekenis 
20  Startbit (is altijd “1”) 
21-27  Minuut 
28  Pariteit minuut 
29-34  Uur 
35  Pariteit uur 
36-41  Dag van de maand 
42-44  Dag van de week 
45-49  Maand 
50-57  Jaar 
58  Pariteit datum 
Dit betekent, dat de ontvangst minimaal een volle minuut moet lopen, voor de tijdinformatie ter 
beschikking kan staan. De binnen deze minuut gedecodeerde informatie is slechts beveiligd 
door drie pariteitbits, daardoor leiden al twee foutief ontvangen bits tot een op deze manier niet 
te herkennen overdrachtfout. Bij hogere eisen kunnen extra testmechanismen gebruikt worden, 
b.v. plausibiliteitcontrole (bevindt de ontvangen tijd zich binnen de toelaatbare grenzen), of 
meerdere keren lezen van de DCF77- tijdinformatie en vergelijking van de data. Een andere 
mogelijkheid zou zijn de DCF-tijd te vergelijken met de actuele tijd van de RTC en alleen een 
bepaalde afwijking toe te staan. Deze procedure geldt niet dan nadat het programma gestart 
is, omdat de RTC eerst ingesteld moet worden.   
Beschrijving van het voorbeeldprogramma “DCF_RTC.cc” 
Het programma “DCF_RTC.cc” is een klok, die via DCF77 gesynchroniseerd wordt. De tijd en 
de datum worden op een LCD –display getoond. De synchronisatie vindt plaats na het starten 
van het programma en dan dagelijks op een in het programma vastgelegde tijd (Update_uren, 
Update_minuten). Er worden twee bibliotheken gebruikt: DCF77_Lib.cc en LCD_Lib.cc. Voor 
de zendontvangst van het tijdsignaal is een DCF77 –ontvanger noodzakelijk. De uitgang van 
de DCF77 –ontvanger wordt aangesloten op de ingangspoort (Mega32: poortD.7 – M128: 
poortF.0). Eerst moet het begin van een tijdinformatie gevonden worden. Er wordt 
gesynchroniseerd op het puls –hiaat (59
e
 bit). Daarna worden de bits in het ritme per seconde 
opgenomen. Er vindt een pariteitcontrole plaats na de informatie betreffende minuten en 
seconden en eveneens aan het eind van de overdracht. Het resultaat van de pariteitcontrole 
wordt opgeslagen in de DCF_ARRAY[6]. Voor de overdracht van de tijdinformatie wordt de 
DCF_ARRAY[0..6] gebruikt. Na de ontvangst van de tijdinformatie wordt de RTC ingesteld met 
de nieuwe tijd en loopt daarna zelfstandig verder. Zowel de RTC als de DCF77 –decodering 
worden via een 10ms interrupt gestuurd. Deze tijdbasis is afgeleid van de kwartsfrequentie van 
de controller. DCF_mode stuurt het verloop voor de DCF77 –tijdopname. 
Tabel DCF -modi 
                     DCF-Mode  Beschrijving 
0  Geen DCF77 –functie 
1  Puls zoeken 
2  Synchroniseren op begin frame 
3  Data decoderen en opslaan, pariteitcontrole  

115 
RTC (Real Time Clock) 
De RTC wordt via een 10ms interrupt gestuurd en loopt op de achtergrond onafhankelijk van 
het gebruikersprogramma. Elke seconde wordt de weergave op het LC-display getoond. Het 
weergave -formaat  is 
1
e
 regel: uur : minuut : seconde 
2
e
 regel: dag . maand . jaar 
LED1 knippert éénmaal per seconde. 
Na het starten van het programma begint de RTC met de vastgelegde tijd. De datum is op nul 
gezet en geeft aan dat er nog geen DCF –tijdcompensatie heeft plaatsgevonden. Na de 
ontvangst van de DCF –tijd wordt de RTC geactualiseerd met de actuele data. De RTC is niet 
gebufferd met een batterij, d.w.z. de tijd loopt niet door zonder spanningsvoeding van de 
controller. 
5.4.5.1              DCF_FRAME 
DCF -functies 
Syntax 
void DCF_FRAME(void); 
Sub DCF_FRAME() 
Beschrijving 
Schakel de DCF Mode op 3 (“Data decoderen en opslaan, pariteitcontrole”). 
Parameter 
Geen 
5.4.5.2                 DCF_INIT 
DCF -functies 
Syntax 
void DCF_INIT(void); 
Sub DCF_INIT() 
Beschrijving 
DCF_INIT bereidt de DCF -functie voor. De ingang voor het DCF –signaal wordt ingesteld.  
DCF Mode = 0.  
Parameter 
Geen 

116 
5.4.5.3            DCF_PULS 
DCF -functies 
Syntax 
void DCF_PULS(void); 
Sub DCF_PULS() 
Beschrijving 
DCF Mode op 1 schakelen (“Puls zoeken”). 
Parameter
Geen 
5.4.5.4           DCF_START 
DCF -functies 
Syntax 
void DCF_START(void); 
Sub DCF_START() 
Beschrijving 
DCF_START initialiseert alle gebruikte variabelen en zet DCF Mode op 1. De DCF –
tijdregistratie loopt nu automatisch.  
Parameter
Geen 
5.4.5.5         DCF_SYNC 
DCF -functies 
Syntax 
void DCF_SYNC(void); 
Sub DCF_SYNC() 
Beschrijving 
DCF Mode op 2 schakelen (“synchronisatie op begin frame”).  
Parameter
Geen 

117 
5.4.6           Debug 
De Debug Message functies maken het mogelijk een geformatteerde tekst naar het uitvoer-venster van 
de IDE te zenden. Deze functies worden interrupt –aangestuurd met een buffer van maximaal 128 Byte. 
D.w.z. er kunnen maximaal 128 Bytes via de debug afgezet worden zonder dat de Mega32 of Mega128 
module moet wachten op de voltooiing van de uitvoer. De overdracht van de aparte tekens gebeurt op 
de achtergrond. Als er geprobeerd wordt meer dan 128 te verzenden, dan moet de Mega Risc CPU 
wachten tot alle tekens die niet meer in de buffer passen verzonden zijn.  
5.4.6.1         Msg_WriteChar 
Debug Message functies 
Syntax 
void Msg_WriteChar(char c); 
Sub Msg_WriteChar(c As Char); 
Beschrijving 
Er wordt een teken naar het uitvoervenster gestuurd. Een C/R (Carriage Return – waarde 13) activeert 
een sprong naar het begin van de volgende regel. 
Parameter 
c    het uit te voeren teken  
5.4.6.2          Msg_WriteFloat 
Debug Message functies 
Syntax 
void Msg_WriteFloat(float val); 
Sub Msg_WriteFloat(val As Single) 
Beschrijving 
Het doorgegeven floating point getal wordt met voorteken weergegeven in het uitvoervenster. 
Parameter 
val      float waarde 
5.4.6.3            Msg_WriteHex 
Debug Message functies 

118 
Syntax 
void Msg_WriteHex(word val); 
Sub Msg_WriteHex(val As Word) 
Beschrijving 
De doorgegeven 16bit waarde wordt weergegeven in het uitvoervenster. De uitvoer wordt als 
hexgetal met 4 cijfers geformatteerd. Als het getal kleiner is dan vier cijfers, worden de eerste 
posities opgevuld met nullen.   
Parameter 
val      16bit waarde 
5.4.6.4            Msg_WriteInt 
Debug Message functies 
Syntax 
void Msg_WriteInt(int val); 
Sub Msg_WriteInt(val As Integer) 
Beschrijving 
De doorgegeven integere wordt weergegeven in het uitvoervenster. Bij negatieve waarden 
wordt er een minteken voor geplaatst. 
Parameter 
val    16bit integer waarde 
5.4.6.5             Msg_WriteText 
Debug Message functies 
Syntax 
void Msg_WriteText(char text[]); 
Sub Msg_WriteText(ByRef text As Char) 
Beschrijving 
Alle tekens van de char array worden uitgevoerd tot aan de nul aan het eind. 
Parameter 
text     cursor op char array 

119 
5.4.6.6            Msg_WriteWord 
Debug Message functies 
Syntax 
void Msg_WriteWord(word val); 
Sub Msg_WriteWord(val As Word) 
Beschrijving 
De parameter val wordt als getal zonder voorteken in het uitvoervenster geschreven. 
Parameter 
val      16bit unsigned integer waarde 
5.4.7           EEPROM 
Op de C-Control Por module zijn M32: 1KB M128: 4KB EEPROM geintegreerd. Deze 
bibliotheeksfuncties maakt de toegang tzot de EEPROM van de integer mogelijk. 32 byte van 
het EEPROM bereik worden voor interne doelen gebruikt, en zijn daarom niet toegankelijk. 
5.4.7.1          EEPROM_Read 
EEPROM functies 
Syntax 
byte EEPROM_Read(word pos); 
Sub EEPROM_Read(pos As Word) As Byte 
Beschrijving 
Leest een byte van positie pos uit de EEPROM. De eerste 32 bytes zijn gereserveerd voor 
de C-Control Pro OS. Een waarde voor pos van 0 en groter heeft daarom betrekking op byte 
32 en hoger in de EEPROM. 
Parameter 
pos  positie in de EEPROM 
Returnwaarde 
De waarde van de byte op positie pos in de EEPROM.  
5.4.7.2            EEPROM_WriteWord 
EEPROM functies 
Syntax 

120 
word EEPROM_ReadWord(word pos); 
Sub EEPROM_ReadWord(pos As Word) As Word 
Beschrijving 
Leest een byte van positie pos uit de EEPROM. De eerste 32 bytes zijn gereserveerd voor 
de C-Control Pro OS. Een waarde voor pos van 0 en groter gaat daarom naar de byte 32 en 
hoger in de EEPROM. De waarde van pos is een byte positie in de EEPROM. Hierop moet 
gelet worden bij word- en zwevende komma-toegang. 
Parameter 
pos     Byte positie in de EEPROM 
Returnwaarde 
De waarde van word op positie pos in de EEPROM.  
5.4.7.3            EEPROM_ReadFloat 
EEPROM functies 
Syntax 
float EEPROM_ReadFloat(word pos); 
Sub EEPROM_ReadFloat(pos As Word) As Single 
Beschrijving 
Leest een zwevende komma-waarde van positie pos uit de EEPROM. De eerste 32 bytes 
zijn gereserveerd voor de C-Control Pro OS. Een waarde voor pos van 0 en groter grijpt 
daarom naar byte 32 en hoger in de EEPROM. De waarde van pos is een byte positie in de 
EEPROM. Hierop moet gelet worden bij word- en zwevende komma-toegang. 
Parameter 
pos     Byte positie in de EEPROM 
Returnwaarde 
De zwevende kommawaarde op positie pos in de EEPROM.  
5.4.7.4            EEPROM_Write 
EEPROM functies 
Syntax 
void EEPROM_Write(word pos,byte val); 
Sub EEPROM_Write(pos As Word,val As Byte) 

121 
Beschrijving 
Schrijft een byte op positie pos in de EEPROM. De eerste 32 bytes zijn gereserveerd voor de 
C-Control Pro OS. Een waarde voor pos van 0 en groter grijpt daarom naar byte 32 en hoger 
in de EEPROM. 
Parameter 
pos      positie in de EEPROM 
val       de in de EEPROM te schrijven waarde 
5.4.7.5            EEPROM_WriteWord 
EEPROM functies 
Syntax 
void EEPROM_WriteWord(word pos,word val); 
Sub EEPROM_WriteWord(pos As Word,val As Word) 
Beschrijving 
Schrijft een word op positie pos in de EEPROM. De eerste 32 bytes zijn gereserveerd voor 
de C-Control Pro OS. Een waarde voor pos van 0 en groter grijpt daarom naar byte 32 en 
hoger in de EEPROM. De waarde van pos is een byte positie in de EEPROM. Hierop moet 
gelet worden bij word- en zwevende komma-toegang. 
Parameter 
pos      byte positie in de EEPROM 
val       de in de EEPROM te schrijven waarde 
5.4.7.6            EEPROM_WriteFloat 
EEPROM functies 
Syntax 
void EEPROM_WriteFloat(word pos,float val); 
Sub EEPROM_WriteFloat(pos As Word,val As Single) 
Beschrijving 
Schrijft een zwevende komma waarde op positie pos in de EEPROM. De eerste 32 bytes zijn 
gereserveerd voor de C-Control Pro OS. Een waarde voor pos van 0 en groter grijpt daarom 
naar byte 32 en hoger in de EEPROM. De waarde van pos is een byte positie in de 
EEPROM. Hierop moet gelet worden bij word- en zwevende komma-toegang. 
Parameter 
pos      byte positie in de EEPROM 
val       de in de EEPROM te schrijven waarde

122 
5.4.8              I2C 
De Controller beschikt over een I2C logica, die een effectieve communicatie mogelijk maakt. 
De Controller werkt als I2C –Master (single master systeem). Werking als Slave is mogelijk, 
maar in de huidige versie niet geïmplementeerd. 
5.4.8.1         
I2C_Init 
I2C functies  Voorbeeld 
Syntax 
void I2C_Init(byte I2C_BR); 
Sub I2C_Init(I2C_BR As Byte) 
Beschrijving 
Deze functie initialiseert de I2C –interface. 
Parameters 
I2C_BR geeft de bitrate aan. De volgende waarden zijn al vooraf gedefinieerd: 
I2C_100kHz 
I2C_400kHz 
5.4.8.2            I2C_Read_ACK 
I2C functies   
Syntax 
byte I2C_Read_ACK(void); 
Sub I2C_Read_ACK() As Byte 
Beschrijving 
Deze functie ontvangt een byte en bevestigt met ACK. Daarna kan met  I2C_Status de 
status van de interface opgevraagd worden. 
Returnwaarde 
Gelezen waarde van de I2C bus 

123 
5.4.8.3        I2C_Read_NACK 
I2C functies  Voorbeeld 
Syntax 
byte I2C_Read_NACK(void); 
Sub I2C_Read_NACK() As Byte 
Beschrijving 
Deze functie ontvangt een byte en bevestigt met NACK. Daarna kan met  I2C_Status de 
status van de interface opgevraagd worden. 
Returnwaarde 
Gelezen waarde van de I2C bus 
5.4.8.4          I2C_Start 
I2C functies  Voorbeeld 
Syntax 
void I2C_Start(void); 
Sub I2C_Start() 
Beschrijving 
Deze functie start de communicatie met een startsequentie. Daarna kan met  I2C_Status de 
status van de interface opgevraagd worden. 
Parameter 
Geen  
5.4.8.5          I2C_Status 
I
2C functies
Syntax 
byte I2C_Status(void); 
Sub I2C_Status() 
Beschrijving 
Met I2C_Status kan de status van de interface opgevraagd worden. De betekenis van de 
statusinformatie is weergegeven in de tabel. 

124 
Returnwaarde 
actuele I2C status 
5.4.8.6          
I2C_Stop 
I2C functies  Voorbeeld 
Syntax 
void I2C_Stop(void); 
Sub I2C_Stop() 
Beschrijving 
Deze functie beëindigt de communicatie met een stopsequentie. Daarna kan met  
I2C_Status de status van de interface opgevraagd worden. 
Parameters 
Geen  
5.4.8.7         I2C_Write 
I2C functies  Voorbeeld 
Syntax 
void I2C_Write(byte data); 
Sub I2C_Write(data As Byte) 
Beschrijving 
Deze functie zendt een byte. Daarna kan met  I2C_Status de status van de interface 
opgevraagd worden. 
Parameter 
data  databyte
5.4.8.8             I2C Status Codes 
Tabel: Status Codes Master Transmitter Mode 
Status Code
Beschrijving 
0x08  Er is een START sequentie verzonden 
0x10  Er is een “repeated” START sequentie verzonden 
0x18  Er is SLA+W verzonden, er werd ACK ontvangen 

125 
0x20  Er is SLA+W verzonden, er werd NACK ontvangen 
0x28  Er is een data byte verzonden, er werd ACK ontvangen 
0x30  Er is een data byte verzonden, er werd NACK ontvangen
0x38  Conflict in SLA+W of data bytes 
Tabel: Status Codes Master Receiver Mode 
Status Code
Beschrijving 
0x08  Er is een START sequentie verzonden 
0x10  Er is een “repeated” START sequentie verzonden 
0x38  Conflict in SLA+R of data bytes 
0x40  Er is SLA+R verzonden, er werd ACK ontvangen 
0x48  Er is een SLA+R verzonden, er werd NACK ontvangen 
0x50  Er is een data byte ontvangen, er werd ACK verzonden 
0x58  Er is een data byte ontvangen, er werd NACK verzonden

126 
5.4.8.9          I2C voorbeeld 
Voorbeeld: EEPROM 24C64 lezen en schrijven zonder I2C_status opvragen 
// I2C Initialization, Bit Rate 100kHz 
main(void) 
{ 
word address; 
byte data,EEPROM_data; 
address=0x20; 
data=0x42; 
I2C_Init(I2C_100kHz ); 
// write data to 24C64 (8k x 8) EEPROM 
I2C_Start(); 
I2C_Write(0xA0);         // DEVICE ADDRESS : A0 
I2C_Write(address>>8);       // HIGH WORD ADDRESS 
I2C_Write(address);       // LOW WORD ADDRESS 
I2C_Write(data);         // write Data 
I2C_Stop(); 
AbsDelay(5);          // delay for EEPROM Write Cycle 
// read data from 24C64 (8k x 8) EEPROM 
I2C_Start(); 
I2C_Write(0xA0);         // DEVICE ADDRESS : A0 
I2C_Write(address>>8);       // HIGH WORD ADDRESS 
I2C_Write(address);       // LOW WORD ADDRESS 
I2C_Start();          // RESTART 
I2C_Write(0xA1);         // DEVICE ADDRESS : A1 
EEPROM_data=I2C_Read_NACK(); 
I2C_Stop(); 
Msg_WriteHex(EEPROM_data); 
} 
5.4.9 Interrupt
De Controller stelt een veelvoud aan interrupts ter beschikking. Sommige daarvan worden 
gebruikt voor systeemfuncties en staan niet ter beschikking van de gebruiker. De volgende 
interrupts kunnen door de gebruiker benut worden: 
Tabel interrupts 
         Interrupt naam  Beschrijving 
INT_0  Externe interrupt0 
INT_1  Externe interrupt1 
INT_2  Externe interrupt2 
INT_3  Externe interrupt3 (alleen Mega128) 
INT_4  Externe interrupt4 (alleen Mega128) 
INT_5  Externe interrupt5 (alleen Mega128) 
INT_6  Externe interrupt6 (alleen Mega128) 
INT_7  Externe interrupt7 (alleen Mega128) 
INT_TIM1CAPT  Timer1 Capture 
INT_TIM1CMPA  Timer1 CompareA 
INT_TIM1CMPB  Timer1 CompareB 

127 
INT_TIM1OVF  Timer1 Overflow 
INT_TIM0COMP  Timer0 Compare 
INT_TIM0OVF  Timer0 Overflow 
INT_ANA_COMP  Analoge comparator 
INT_ADC  ADC 
INT_TIM2COMP  Timer2 Compare 
INT_TIM2OVF  Timer2 Overflow 
INT_TIM3CAPT  Timer3 Capture (alleen Mega128) 
INT_TIM3CMPA  Timer3 CompareA (alleen Mega128) 
INT_TIM3CMPB  Timer3 CompareB (alleen Mega128) 
INT_TIM3CMPC  Timer3 CompareC (alleen Mega128) 
INT_TIM3OVF  Timer3 Overflow (alleen Mega128) 
De desbetreffende interrupt moet in een Interrupt Service Routine (ISR) de overeenkomende 
aanwijzingen ontvangen en de interrupt moet vrijgegeven zijn. Zie Voorbeeld. Tijdens de 
bewerking van een interrupt –routine wordt de Multithreading uitgezet. 
[Afb.] Een signaal op INT_0 bij het inschakelen van de C-Control Pro module kan de 
autostartprocedure storen. Volgens de pintoewijzing van M32 en M128 ligt de INT_0 op 
dezelfde pin als SW1. Als de SW1 bij het inschakelen van de module ingedrukt wordt, leidt 
dit tot activering van de seriële bootloader modus en het programma wordt niet automatisch 
gestart.  
5.4.9.1           Ext_IntEnable  
Interrupt functies 
Syntax 
void Ext_Int0(byte IRQ,byte Mode); 
Sub Ext_Int0(IRQ As Byte,Mode As Byte) 
Beschrijving 
Deze functie schakelt de externe interrupt 0 vrij. De parameter Mode legt vast, wanneer een 
interrupt gemaakt moet worden. Een signaal op INT_0 kan leiden tot Autostart problemen. 
Parameter 
IRQ  Nummer van de te blokkeren interrupt 
Mode   Parameter: 
1:   een low niveau activeert een interrupt 
2:  elke flankwisseling activeert een interrupt 
3:   een vallende flank activeert een interrupt 
4:  een stijgende flank activeert een interrupt 

128 
5.4.9.2           Ext_IntDisable 
Interrupt functies 
Syntax 
void Ext_Int0Disable(byte IRQ); 
Sub Ext_Int0Disable(IRQ As Byte) 
Beschrijving 
De externe interrupt IRQ wordt geblokkeerd. 
Parameter 
Geen 
5.4.9.3   Irq_GetCount 
Interrupt functies  Voorbeeld 
Syntax 
byte Irq_GetCount(void); 
Sub Irq_GetCount() As Byte 
Beschrijving 
Signaleert dat de interrupt verwerkt is (interrupt acknowledge). Als de functie niet aan het 
eind van een interrupt routine wordt opgeroepen, wordt er ononderbroken in de interrupt 
gesprongen. 
Returnwaarde 
Geeft aan, hoe vaak de interrupt vanaf de hardware tot aan het oproepen van 
Irq_GetCount() geactiveerd werd. Een waarde groter dan 1 kan optreden als de hardware 
sneller interrupts genereert dan de interpreter de interruptroutine kan verwerken. 
5.4.9.4    Irq_SetVect 
Interrupt functies  Voorbeeld 
Syntax 
void Irq_SetVect(byte irqnr,float vect); 
Sub Irq_SetVect(irqnr As Byte,vect As Single) 
Beschrijving 
Zet de op te roepen interrupt functie voor een bepaalde interrupt. Aan het eind van de 
interrupt routine moet de functie Irq  GetCount() opgeroepen worden, anders wordt er 
ononderbroken in de interrupt functie gesprongen. 

129 
Parameter 
irqnr specificeert het type van de interrupt (zie tabel) 
vect is de naam van de op te roepen interrupt functie 
Opmerking 
De zwevende komma- datatype mag ongepast verschijnen maar hij wordt intern als 4 byte waarde 
behandeld. Een functie- aanwijzer moet sinds de Mega128 ondersteuning meer dan 18 bit lang zijn. 
Tabel interrupt vectoren: 
       Nr           Interrupt naam  Beschrijving 
0  INT_0  Externe interrupt0 
        1  INT_1  Externe interrupt1 
        2  INT_2  Externe interrupt2 
        3  INT_TIM1CAPT  Timer1 Capture 
        4  INT_TIM1CMPA  Timer1 CompareA 
        5  INT_TIM1CMPB  Timer1 CompareB 
        6  INT_TIM1OVF  Timer1 Overflow 
        7  INT_TIM0COMP  Timer0 Compare 
        8  INT_TIM0OVF  Timer0 Overflow 
        9  INT_ANA_COMP  Analoge comparator 
      10  INT_ADC  ADC 
      11  INT_TIM2COMP  Timer2 Compare 
      12  INT_TIM2OVF  Timer2 Overflow 
5.4.9.5         IRQ voorbeeld 
Voorbeeld: gebruik van interrupt routines 
//  Timer 2 loopt normaalgesproken in de 10msa maat. In dit 
//  voorbeeld wordt daarom de variabele cnt elke 10ms met 1 verhoogd  
int cnt; 
void ISR(void) 
{ 
int irqcnt; 
cnt=cnt+1; 
irqcnt=Irq_GetCount(INT_TIM2COMP); 
} 
void main(void) 
{ 
cnt=0; 
Irq_SetVect(INT_TIM2COMP,ISR); 
while(true); // Eondeloze lus 
} 

130 
5.4.10
Keyboard 
Een deel van deze routines is in de interpreter geïmplementeerd, een ander deel wordt 
opgeroepen door het toevoegen van de bibliotheek “Key_Lib.cc”. Omdat de functies in 
“Key_Lib.cc” door bytecodes gerealiseerd worden, zijn ze langzamer in de verwerking. 
Bibliotheekfuncties hebben echter het voordeel dat als u ze niet gebruikt, deze functies door 
weglaten van de bibliotheek uit het project gehaald worden. Directe interpreter –functies zijn 
steeds aanwezig, maar kosten flashgeheugen. 
5.4.10.1          Key_Init 
Keyboard functies   (bibliotheek ”Key_Lib.cc”) 
Syntax 
void Key_Init(void); 
Sub Key_Init() 
Beschrijving 
De globale array keymap wordt geïnitialiseerd met de ASCII waarden van het toetsenbord. 
Parameter 
Geen 
5.4.10.2           Key_Scan 
Keyboard functies    
Syntax 
word Key_Scan(void); 
Sub Key_Scan() As Word 
Beschrijving 
Key_Scan zoekt op volgorde de invoerpinnen van het aangesloten toetsenbord door en geeft 
het resultaat retour als bitveld. De “1” bits vertegenwoordigen de toetsen die tot aan het 
tijdstip van de scan ingedrukt zijn. 
Returnwaarde 
16 bits die de aparte invoerleidingen van het toetsenbord vertegenwoordigen. 
5.4.10.3              Key_TranslateKey 
Keyboard functies   (bibliotheek ”Key_Lib.cc”) 
Syntax 
char Key_TranslateKey(word keys); 
Sub Key_TranslateKey(keys As Word) As Char 

131 
Beschrijving 
Deze hulpfunctie levert het teken terug dat overeenkomt met het eerste opduiken van een “1” 
in het bitveld van de invoerparameter. 
Parameter 
keys   bitveld dat door Key  Scan() teruggeleverd wordt. 
Returnwaarde 
ASCII waarde van de herkende toets 
-1 als er geen toets ingedrukt is 
5.4.11             LCD 
Een deel van deze routines is geïmplementeerd in de interpreter, een ander deel kan opge-
roepen worden door het toevoegen van de bibliotheek “LCD_Lib.cc”. Omdat de functies in 
“LCD_Lib.cc” gerealiseerd worden door bytecodes, zijn ze langzamer in de verwerking. 
Bibliotheekfuncties hebben echter het voordeel dat als u ze niet gebruikt, deze functies door 
weglaten van de bibliotheek uit het project gehaald worden. Directe interpreter –functies zijn 
steeds aanwezig, maar kosten flashgeheugen. 
5.4.11.1           LCD_ClearLCD 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_ClearLCD(void); 
Sub LCD_ClearLCD() 
Beschrijving 
Wist het display en schakelt de cursor in. 
Parameter 
Geen 
5.4.11.2          LCD_CursorOff 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_CursorOff(void); 
Sub LCD_CursorOff() 
Beschrijving 
Schakelt de cursor van het display uit.  
Parameter 
Geen 

132 
5.4.11.3            LCD_CursorOn 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_CursorOn(void); 
Sub LCD_CursorOn() 
Beschrijving 
Schakelt de cursor van het display in.  
Parameter 
Geen 
5.4.11.4              LCD_CursorPos 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_CursorPos(byte pos); 
Sub LCD_CursorPos(pos As Byte) 
Beschrijving 
Plaatst de cursor in de positie pos.  
Parameter 
pos   cursorpositie 
Waarde van pos  Positie op het display 
0x00-0x07  0 – 7 in de 1
e
 regel 
0x40-0x47  0 – 7 in de 2
e
 regel 
Bij een display met meer dan 2 regels en max. 32 tekens per regel geldt het volgende schema: 
Waarde van pos  Positie op het display 
    0x00-0x1f  0 – 31 in de 1
e
 regel 
    0x40-0x5f  0 – 31 in de 2
e
 regel 
    0x20-0x3f  0 – 31 in de 3
e
 regel 
    0x60-0x6f  0 – 31 in de 4
e
 regel 

133 
5.4.11.5          LCD_Init 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_Init(void); 
Sub LCD_Init() 
Beschrijving 
“High Level” initialisering van het LC- display. Roept als eerste LCD InitDisplay() op. 
Parameter 
Geen 
5.4.11.6         LCD_SubInit 
LCD functies    
Syntax 
void LCD_SubInit(void); 
Sub LCD_SubInit() 
Beschrijving 
Initialiseert de poort s voor de displaybesturing op assembler –niveau. Moet als eerste routine voor 
alle andere LCD uitvoerfuncties opgeroepen worden. Wordt gebruikt als eerste commando van  
LCD  Init() gebruikt. 
Parameter 
Geen 
5.4.11.7           LCD_TestBusy 
LCD functies   
Syntax 
void LCD_TestBusy(void); 
Sub LCD_TestBusy() 

134 
Beschrijving 
De functie wacht tot de display controller niet meer “busy” is. Als u eerst naar de controller 
gaat, wordt de data –opbouw op het display gestoord.  
Parameter 
Geen 
5.4.11.8           LCD_WriteChar 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_WriteChar(char c); 
Sub LCD_WriteChar(c As Char) 
Beschrijving 
Schrijft een teken bij de cursorpositie op het LC- display. 
Parameter 
c  ASCII waarde van het teken
5.4.11.9           LCD_WriteCTRRegister 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_WriteCTRRegister(byte cmd); 
Sub LCD_WriteCTRRegister(cmd As Byte) 
Beschrijving 
Stuurt een commando naar de display controller. 
Parameter 
cmd    Commando in byte –vorm 
5.4.11.10             LCD_WriteDataRegister 
LCD functies   (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_WriteDataRegister(char x); 
Sub LCD_WriteDataRegister(x As Char) 

135 
Beschrijving 
Stuurt een databyte naar de display controller. 
Parameter 
x    databyte 
5.4.11.11             LCD_WriteRegister 
LCD functies  (bibliotheek ”LCD_Lib.cc”)
Syntax 
void LCD_WriteRegister(byte y,byte x); 
Sub LCD_WriteRegister(y As Byte,x As Byte) 
Beschrijving
LCD_WriteRegister splitst databyte y in twee nibbles en stuurt ze naar de display controller. 
Parameter 
y    databyte 
x    commandonibble 
5.4.11.12              
LCD_WriteText 
LCD functies  (bibliotheek ”LCD_Lib.cc”) 
Syntax 
void LCD_WriteText(char text[]); 
Sub LCD_WriteText(ByRef Text As Char) 
Beschrijving
Alle tekens van de char array tot aan een bepaalde nul worden uitgegeven. 
Parameter 
text    char array 

136 
5.4.12              Poort  
De Atmel Mega 32 heeft 4 in - /uitgangspoorten van elk 8 bit. De Atmel Mega 128 heeft 6 in - 
/uitgangspoorten van elk 8 bit en 1 in-/ uitgangspoort van 5 bit. Elke bit van een afzonderlijke 
poort kan als ingang of als uitgang geconfigureerd worden. Omdat echter het aantal pinnen 
van de Mega 32 Risc CPU beperkt is, zijn extra functies aan aparte poorten toegewezen. U 
vindt een tabel van de pintoewijzing in de documentatie van de M32 en M128..  
 Het is belangrijk om de pintoewijzing te bestuderen voor u met de programmering begint, 
omdat belangrijke functies van de programma –ontwikkeling (bijv. de USB interface van het 
Application Board) op bepaalde poorten liggen. Als deze poorten omgeprogrammeerd 
worden of de bijbehorende jumpers op het Application Board zijn niet meer geplaatst, kan 
het gebeuren dat de ontwikkelingsomgeving geen programma’s meer naar de C-Control Pro 
kan overbrengen. 
 De datarichting (ingang/uitgang) kan met de functie Port _DataDir of Port _DataDirBit 
vastgelegd worden. Als een pin als ingang geconfigureerd is, dan kan deze pin of hoogohmig 
(“floatend”) of met een interne pull-up gebruikt worden. Als met Port  Write of Port  WriteBit 
een “1” schrijft op een ingang, dan wordt de pull-up weerstand (referentieniveau VCC) 
geactiveerd en de ingang is gedefinieerd. 
5.4.12.1         Port _DataDir 
Poort  functies  voorbeeld  
Syntax 
void Port_DataDir(byte port,byte val); 
Sub Port_DataDir(port As Byte,val As Byte) 
Beschrijving 
De functie Port _DataDir configureert de bits van de poort voor in - of uitvoer. Als de bit “1” is, 
dan wordt de pin van de desbetreffende bitpositie op uitgang geschakeld. Een voorbeeld: als 
port =PortB en val = 0x02, dan wordt pin 2 van de Atmel Mega (komt overeen met Poort 
B.1 – zie pintoewijzing van M32 en M128) op uitgang geconfigureerd.  
Parameter 
port    poort nummer (zie tabel) 
val     uitvoer byte  
Tabel poortnummers 
Definitie                Waarde 
Port A  0 
Port B  1 
Port C  2 
Port D  3 
PortE (Mega128)  4 
PortF (Mega128)  5 
PortG (Mega128)  6 

137 
5.4.12.2              Port _DataDirBit 
Poortfuncties   
Syntax 
void Port_DataDirBit(byte portbit,byte val); 
Sub Port_DataDirBit(portbit As Byte,val As Byte) 
Beschrijving 
De functie Port _DataDirBit configureert een bit (pin) van een poort voor in - of uitvoer. Als de 
bit “1” is, dan wordt de pin op uitgang geschakeld. Een voorbeeld: als 
port bit 
= 9 en val = 0, 
dan wordt pin 2 van de Atmel Mega (komt overeen met PortB.1 – zie pintoewijzing) op 
ingang geconfigureerd.  
Parameters 
port bit   bitnummer van de poort (zie tabel) 
val     0- = ingang,  1 = uitgang  
Tabel poort bits 
 Definitie                        Poort bit 
PortA.0  0 
…  … 
PortA.7  7 
PortB.0  8 
…  … 
PortB.7  15 
PortC.0  16 
…  … 
PortC.7  23 
PortD.0  24 
…  … 
PortD.7  31 
Vanaf hier alleen Mega128   
PortE.0  32 
…  … 
PortE.7  39 
PortF.0  40 
…  … 
PortF.7  47 
PortG.0  48 
…  … 
PortG.4  52 

138 
5.4.12.3           Port _Read 
Poortfuncties   
Syntax 
byte Port_Read(byte port); 
Sub Port_Read(port As Byte) As Byte 
Beschrijving 
Leest een byte van een specifieke poort . Alleen de pinnen van de poort die geschakeld zijn 
op ingang, leveren een geldige waarde op de desbetreffende bitpositie in de gelezen byte 
terug. (Voor de afbeelding tussen poortbits en de pinnen van de Atmel Mega chips zie 
pintoewijzing van M32 en M128). 
Parameter 
port   poortnummer (zie tabel) 
Returnwaarde 
Waarde van de poort  
Tabel poortnummers 
 Definitie                    Waarde 
PortA  0 
PortB  1 
PortC  2 
PortD  3 
PortE (Mega128)  4 
PortF (Mega128)  5 
PortG (Mega128)  6 
5.4.12.4         Port _ReadBit 
Poortfuncties   
Syntax 
byte Port_ReadBit(byte port); 
Sub Port_ReadBit(port As Byte) As Byte 
Beschrijving 
Leest een bitwaarde van de gespecificeerde poort. De desbetreffende pin van de poort moet 
op ingang zijn geschakeld. (Voor de afbeelding tussen poortbits en de pinnen van de Atmel 
Mega Chips zie pintoewijzing van M32 en M128). 

139 
Parameter 
portbit  bitnummer van de poort (zie tabel) 
Returnwaarde 
Bitwaarde van de poort (0 of 1) 
Poortbits tabel 
 Definitie                 Poortbit 
PortA.0  0 
…  … 
PortA.7  7 
PortB.0  8 
…  … 
PortB.7  15 
PortC.0  16 
…  … 
PortC.7  23 
PortD.0  24 
…  … 
PortD.7  31 
Vanaf hier alleen Mega128   
PortE.0  32 
…  … 
PortE.7  39 
PortF.0  40 
…  … 
PortF.7  47 
PortG.0  48 
…  … 
PortG.4  52 
5.4.12.5  Port _Write 
Poortfuncties  Voorbeeld 
Syntax 
void Port_Write(byte port,byte val); 
Sub Port_Write(port As Byte,val As Byte) 
Beschrijving 
Schrijft een byte op de gespecificeerde poort . Alleen de pinnen van de poort die op uitgang 
geschakeld zijn, nemen de bitwaarden van de doorgegeven parameters over. 
Als een pin op ingang geschakeld is, kan de interne pull-up weerstand ingeschakeld (1) of 
uitgeschakeld (0) worden. (Voor de afbeelding tussen poortbits en de pinnen van de Atmel 
Mega chips zie pintoewijzing van M32 en M128). 

140 
Parameters 
port    poortnummer (zie tabel) 
val     uitvoerbyte 
Tabel poortnummers 
 Definitie                    Waarde 
PortA  0 
PortB  1 
PortC  2 
PortD  3 
PortE (Mega128)  4 
PortF (Mega128)  5 
PortG (Mega128)  6 
5.4.12.6             
Port _WriteBit 
Poortfuncties   
Syntax 
void Port_WriteBit(byte portbit,byte val); 
Sub Port_WriteBit(portbit As Byte,val As Byte) 
Beschrijving 
De functie Port_WriteBit zet de waarde van een pin die op uitgang geschakeld is. Als een pin 
op ingang geschakeld is, dan kan de interne pull-up weerstand ingeschakeld (1) of 
uitgeschakeld (0) worden.  
(Voor de afbeelding tussen portbits en de pins van de Atmel Mega chips zie pintoewijzing 
van M32 en M128). 
Parameter 
portbit   bitnummer van de poort (zie tabel) 
val         mag 0 of 1 zijn 
Poortbits tabel 
 Definitie                 Poortbit 
PortA.0  0 
…  … 
PortA.7  7 
PortB.0  8 
…  … 
PortB.7  15 
PortC.0  16 
…  … 
PortC.7  23 

141 
PortD.0  24 
…  … 
PortD.7  31 
Vanaf hier alleen Mega128   
PortE.0  32 
…  … 
PortE.7  39 
PortF.0  40 
…  … 
PortF.7  47 
PortG.0  48 
…  … 
PortG.4  52 
5.4.12.7           Poort  voorbeeld 
//  Programma laat afwisselend de beide LED’s op het  
// Application Board knipperen in een 1 seconde – ritme 
void main(void) 
{ 
Port_DataDirBit(PORT_LED1,PORT_OUT); 
Port_DataDirBit(PORT_LED2,PORT_OUT); 
while(true)   // Eindelozw lus 
{ 
Port_WriteBit(PORT_LED1,PORT_ON); 
Port_WriteBit(PORT_LED2,PORT_OFF); 
AbsDelay(1000); 
Port_WriteBit(PORT_LED1,PORT_OFF); 
Port_WriteBit(PORT_LED2,PORT_ON); 
AbsDelay(1000); 
} 
} 
5.4.13           Math 
Hieronder volgen de wiskundige functies die de C-Control Pro 128 in eenvoudige zwevende 
komma precisie (32 bit) beheerst. Deze functies zijn niet in de bibliotheek van de C-Control 
Pro 32, anders is er te weinig flash-geheugen voor de gebruikerprogramma’s. 
5.4.13.1       acos 
Wiskundige functies   
Syntax 
float acos(float val); 
Sub acos(val As Single) As Single 

142 
Beschrijving 
De arcus cosinus wordt berekend. De hoek wordt in radiant aangegeven. In- en 
uitvoerwaarden liggen tussen –pi en +pi. 
Parameter 
val  Waarde van welke de functie berekend wordt 
Returnwaarde 
Arcus cosinus van de invoerwaarde 
5.4.13.2       asin 
Wiskundige functies   
Syntax 
float asin(float val); 
Sub asin(val As Single) As Single 
Beschrijving 
De arcus sinus wordt berekend. De hoek wordt in radiant aangegeven. In- en uitvoerwaarden 
liggen tussen –pi en +pi. 
Parameter 
val    Waarde van welke de functie berekend wordt 
Returnwaarde 
Arcus sinus van de invoerwaarde 
5.4.13.3       atan 
Wiskundige functies   
Syntax 
float atan(float val); 
Sub atan(val As Single) As Single 
Beschrijving 
De arcus tangens wordt berekend. De hoek wordt in radiant aangegeven. In- en 
uitvoerwaarden liggen tussen –pi en +pi. 
Parameter 
val    Waarde van welke de functie berekend wordt 
Returnwaarde 
Arcus tangens van de invoerwaarde 

143 
5.4.13.4       ceil 
Wiskundige functies   
Syntax 
float ceil(float val); 
Sub ceil(val As Single) As Single 
Beschrijving 
Het eerst volgende grotere integergetal met betrekking tot het zwevende-kommagetal val 
wordt berekend. De hoek wordt in radiant aangegeven. In- en uitvoerwaarden liggen tussen 
–pi en +pi. 
Parameter 
val    Waarde van welke de integer berekend wordt 
Returnwaarde 
Het resultaat van de functie 
5.4.13.5       cos 
Wiskundige functies   
Syntax 
float cos(float val); 
Sub cos(val As Single) As Single 
Beschrijving 
De cosinus wordt berekend. De hoek wordt in radiant aangegeven. In- en uitvoerwaarden 
liggen tussen –pi en +pi. 
Parameter 
val    Waarde van welke de functie berekend wordt 
Returnwaarde 
Cosinus van de invoerwaarde 
5.4.13.6       exp 
Wiskundige functies   
Syntax 
float exp(float val); 
Sub exp(val As Single) As Single 

144 
Beschrijving 
De functie e ^ val wordt berekend. 
Parameter 
val    Exponent 
Returnwaarde 
Resultaat van de functie 
5.4.13.7           fabs 
Wiskundige functies   
Syntax 
float fabs(float val); 
Sub fabs(val As Single) As Single 
Beschrijving 
De absolute waarde van het zwevende kommagetal wordt berekend.  
Parameter 
val    invoerwaarde 
Returnwaarde 
Resultaat van de functie
5.4.13.8           floor 
Wiskundige functies   
Syntax 
float floor(float val); 
Sub floor(val As Single) As Single 
Beschrijving 
Het eerst volgende kleinere integergetal met betrekking tot het zwevende-kommagetal val 
wordt berekend.  
Parameter 
val    waarde waarvan de integer berekend wordt 
Returnwaarde 
Resultaat van de functie

145 
5.4.13.9           floor 
Wiskundige functies   
Syntax 
float ldexp(float val,int expn); 
Sub ldexp(val As Single,expn As Integer) As Single 
Beschrijving 
De functie val *2^ expn wordt berekend 
Parameter 
val       Multiplicator 
expn    Exponent 
Returnwaarde 
Resultaat van de functie 
5.4.13.10           In 
Wiskundige functies   
Syntax 
float ln(float val); 
Sub ln(val As Single) As Single 
Beschrijving 
De natuurlijke logaritme wordt berekend 
Parameter 
val       Invoerwaarde 
Returnwaarde 
Resultaat van de functie 
5.4.13.11           log 
Wiskundige functies   
Syntax 
float log(float val); 
Sub log(val As Single) As Single 

146 
Beschrijving 
De logaritme voor basis 10 wordt berekend 
Parameter 
val       Invoerwaarde 
Returnwaarde 
Resultaat van de functie 
5.4.13.12           pow 
Wiskundige functies   
Syntax 
float pow(float x,float y); 
Sub pow(x As Single,y As Single) As Single 
Beschrijving 
Machtfunctie. De functie x ^ y  wordt berekend 
Parameter 
x      Basis 
y     Exponent 
Returnwaarde 
Resultaat van de functie 
5.4.13.13       sin 
Wiskundige functies   
Syntax 
float sin(float val); 
Sub sin(val As Single) As Single 
Beschrijving 
De sinus wordt berekend. De hoek wordt in radiant aangegeven. In- en uitvoerwaarden 
liggen tussen –pi en +pi. 
Parameter 
val    Waarde van welke de functie berekend wordt 
Returnwaarde 
sinus van de invoerwaarde 

147 
5.4.13.14       sqrt 
Wiskundige functies   
Syntax 
float sqrt(float val); 
Sub sqrt(val As Single) As Single 
Beschrijving 
De vierkantswortel wordt berekend.  
Parameter 
val    Waarde qaarvan de vierkantswortel wordt berekend 
5.4.13.15       tan 
Wiskundige functies   
Syntax 
float tan(float val); 
Sub tan(val As Single) As Single 
Beschrijving 
De tangens wordt berekend. De hoek wordt in radiant aangegeven. In- en uitvoerwaarden 
liggen tussen –pi en +pi. 
Parameter 
val    Waarde van welke de functie berekend wordt 
Returnwaarde 
Tangens van de invoerwaarde 
5.4.14           
RS232 
In tegenstelling tot de Debug Message functies werken alle seriële routines niet met interrupt 
maar “pollend”. Dit betekent dat de functies pas terugkeren als het teken of de tekst 
geschreven of gelezen is. De seriële interface kan met snelheden tot 230.4 kbaud gebruikt 
worden. Bij de functies voor de seriële interface geedt de eerste parameter het poortnummer 
aan (0 of 1). Bij de Mega32 staat alleen één seriële interface ter beschikking (0), voor de 
Mega128 twee (0, 1). 
5.4.14.1           Serial_Disable    
Seriële functies
Syntax 

148 
void Serial_Disable(byte serport); 
Sub Serial_Disable(serport As Byte) 
Beschrijving 
De seriële interface wordt uitgeschakeld en de bijhorende poorten kunnen anders toegepast 
worden. 
Parameter 
serport    interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
5.4.14.2              Serial_Init 
Seriële functies  Voorbeeld 
Syntax 
void Serial_Init(byte serport,byte par,byte divider); 
Sub Serial_Init(serport As Byte,par As Byte,divider As Byte) 
Beschrijving 
De seriële interface wordt geïnitialiseerd. De waarde par wordt door optellen van de vooraf 
gedefinieerde bitwaarden samengesteld. Men telt eerst de tekenlengte, dan het aantal 
stopbits en dan de pariteit, bijv. “SR_7BITSR_2STOP  SR_EVEN_PAR” voor 7 bits per 
teken, 2 stopbits en even pariteit (zie ook voorbeeld). Deze waarden zouden in BASIC 
Syntax als volgt uitzien: “SR_7BIT Or SR_2STOP Or SR_EVEN_PAR” De baudrate wordt 
als verdelerwaarde, zoals ook in de tabel gespecificeerd wordt. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
par   Interface –parameter (zie tabel)  
divider   Baudrate –initialisering d.m.v. verdeler (zie tabel) 
Tabel par definities: 
 Definitie  Functie 
SR_5BIT  5 bit tekenlengte 
SR_6BIT  6 bit tekenlengte 
SR_7BIT  7 bit tekenlengte 
SR_8BIT  8 bit tekenlengte 
SR_1STOP  1 stop bit 
SR_2STOP  2 stop bit 
SR_NO_PAR  no parity 
SR_EVEN_PAR  even parity 
SR_ODD_PAR  odd parity 

149 
Tabel divider definities 
 Divider  Definitie  Baudrate 
383  SR_BD2400  2400bps 
191  SR_BD4800  4800bps 
95  SR_BD9600  9600bps 
63  SR_BD14400  14400bps 
47  SR_BD19200  19200bps 
31  SR_BD28800  28800bps 
23  SR_BD38400  38400bps 
15  SR_BD57600  57600bps 
11  SR_BD76800  76800bps 
7  SR_BD115200  115200bps 
3  SR_BD230400  230400bps 
5.4.14.3              Serial_Init_IRQ 
Seriële functies  Voorbeeld 
Syntax 
void Serial_Init_IRQ(byte serport,byte ramaddr[],byte recvlen,byte 
sendlen,byte par, 
Sub Serial_Init_IRQ(serport As Byte,ByRef ramaddr As Byte,recvlen As 
Byte,sendlen As par As Byte,div As Byte) 
Beschrijving 
De seriële interface wordt voor de toepassing in de interrupt mode geïnitialiseerd. De 
gebruiker moet een globale variabele als buffer beschikbaar stellen. In deze buffer worden 
de ontvangen data alsook de te versturen data bewaard. De grootte van de buffer moet de 
grootte van de ontvangstbuffer plus de grootte van de zendbuffer plus 6 zijn (zie ook 
voorbeeld). De zend- en de ontvangstbuffer kan maximaal 255 tekens opnemen. 
Voor de waarde par wordt door optellen van de vooraf gedefinieerde bitwaarden 
samengesteld. Men telt eerst de tekenlengte, dan het aantal stopbits en dan de pariteit, bijv. 
“SR_7BITSR_2STOP  SR_EVEN_PAR” voor 7 bits per teken, 2 stopbits en even pariteit. 
Deze waarden zouden in BASIC Syntax als volgt uitzien: “SR_7BIT Or SR_2STOP Or 
SR_EVEN_PAR” De baudrate wordt als verdelerwaarde, zoals ook in de tabel 
gespecificeerd wordt. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
ramadr Adres van de buffer 
recvlen Grootte van de ontvangstbuffer 
senlen  Grootte van de zendbuffer  
par   Interface –parameter (zie tabel)  
div  Baudrate –initialisering d.m.v. verdeler (zie tabel) 

150 
Tabel par definities: 
 Definitie  Functie 
SR_5BIT  5 bit tekenlengte 
SR_6BIT  6 bit tekenlengte 
SR_7BIT  7 bit tekenlengte 
SR_8BIT  8 bit tekenlengte 
SR_1STOP  1 stop bit 
SR_2STOP  2 stop bit 
SR_NO_PAR  no parity 
SR_EVEN_PAR  even parity 
SR_ODD_PAR  odd parity 
Tabel divider definities 
Divider  Definitie  Baudrate 
383  SR_BD2400  2400bps 
191  SR_BD4800  4800bps 
95  SR_BD9600  9600bps 
63  SR_BD14400  14400bps 
47  SR_BD19200  19200bps 
31  SR_BD28800  28800bps 
23  SR_BD38400  38400bps 
15  SR_BD57600  57600bps 
11  SR_BD76800  76800bps 
7  SR_BD115200  115200bps 
3  SR_BD230400  230400bps 
5.4.14.4          Serial_IRQ_Info 
Seriële functies 
Syntax 
byte Serial_IRQ_Info(byte serport, byte info); 
Sub Serial_IRQ_Info(serport As Byte, info As Byte) As Byte 
Beschrijving 
Afhankelijk van de parameter info wordt teruggegeven hoeveel bytes in de zend- of 
ontvangstbuffer nog plaats hebben. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
Info waarden: 
RS232_FIFO_RECV (0)   Plaats in de ontvangstbuffer
RS232_FIFO_Send (1)   Plaats in de zendbuffer

151 
Returnwaarde 
Plaats in de buffer van de seriële interface in bytes 
5.4.14.5               Serial_Read 
Seriële functies 
Syntax 
byte Serial_Read(byte serport); 
Sub Serial_Read(serport As Byte) As Byte 
Beschrijving 
Een byte wordt door de seriële interface gelezen. Als er zich geen byte in de seriële buffer 
bevindt, keert de functie pas terug als er een teken ontvangen is. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
Returnwaarde 
Ontvangen byte uit de seriële interface  
5.4.14.6             Serial_ReadExt 
Seriële functies 
Syntax 
word Serial_ReadExt(byte serport); 
Sub Serial_ReadExt(serport As Byte) As Word 
Beschrijving 
Een byte wordt door de seriële interface gelezen. In tegenstelling tot Serial Read(), keert de 
functie ook dan direct terug als er zich geen teken in de seriële interface bevindt. In dit geval 
wordt dan de waarde 256(0x100) geretourneerd. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
Returnwaarde 
ontvangen byte uit de seriële interface 
5.4.14.7              Serial_Write 
Seriële functies  voorbeeld 
Syntax 

152 
void Serial_Write(byte val); 
Sub Serial_Write(val As Byte) 
Beschrijving 
Een byte wordt naar de seriële interface gestuurd. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
val        de uit te voeren byte waarde 
5.4.14.8             Serial_WriteText 
Seriële functies 
Syntax 
void Serial_WriteText(byte serport,char text[]); 
Sub Serial_WriteText(serport As Byte,ByRef Text As Char) 
Beschrijving 
Alle tekens van de char array tot aan de laatste nul worden doorgegeven naar de seriële interface. 
Parameter 
serport  Interfacenummer (0 = 1
e
 seriële, 1 = 2
e
  seriële enz.) 
Text      char array 
5.4.14.9            Serial voorbeeld 
// Stringuitvoer op de seriële interface 
void main(void) 
{ 
int i; 
char str[10]; 
str="test"; 
i=0; 
// Initialiseer interface met 19200baud, 8 bit, 1 stopbit, geen 
pariteit 
Serial_Init(0,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD19200); 
while(str[i]) Serial_Write(0,str[i++]); // Geef de string aan 
} 

153 
5.4.1410         Serial voorbeeld (IRQ) 
// 35 byte zend + ontvangstbuffer + 6 byte interne FIFO beheer 
byte buffer[41]; // Array gedeclareerd 
// Stringuitvoer op de seriële interface 
void main(void) 
{ 
int i; 
char str[10]; 
str="test"; 
i=0; 
// Initialiseer interface met 19200baud, 8 bit, 1 stopbit, geen 
pariteit 
// 20 byte ontvangstbuffer - 15 byte zendbuffer 
Serial_Init_IRQ(0,buffer,20,15,SR_8BIT|SR_1STOP|SR_NO_PAR, 
SR_BD19200); 
while(str[i]) Serial_Write(0,str[i++]); // Geef de string aan 
} 
5.4.15             SPI
De SPI interface wordt momenteel alleen gebruikt om op het Application board de USB 
gegevens van de Mega8 controller te ontvangen. In de toekomst worden meer functies de 
communicatie met andere apparaten via SPI ondersteunen. 
5.4.15.1          SPI_Disable 
SPI functies 
Syntax 
void SPI_Disable(void); 
Sub SPI_Disable() 
Beschrijving 
De SPI interface wordt uitgeschakeld en de bijhorende poorten kunnen anders toegepast worden. 
Parameter 
Geen 
5.4.16             Strings 
Een deel van deze stringroutines is in de interpreter geïmplementeerd, een ander deel kan 
door toevoegen van de bibliotheek “String_Lib.cc” opgeroepen worden. Omdat de functies in 
“String_Lib.cc” door bytecodes gerealiseerd worden, zijn ze langzamer in de verwerking. 
Bibliotheekfuncties hebben echter als voordeel, wanneer de functies niet gebruikt worden 
door het weglaten van de bibliotheek deze uit het project neemt. Directe interpreter –functies 
zijn steeds aanwezig maar kosten flash –geheugen. 

154 
Er bestaat geen expliciet “String”-datatype. Een string is gebaseerd op een character array. 
U dient de grootte van de array zo kiezen dat alle tekens van de string in de character array 
passen. Bovendien is er ruimte nodig voor een eindteken (decimale nul), om het einde van 
de tekenketen (char array) aan te geven. 
5.4.16.1              Str_Comp 
String functies 
Syntax 
char Str_Comp(char str1[],char str2[]); 
Sub Str_Comp(ByRef str1 As Char,ByRef str2 As Char) As Char 
Beschrijving 
Twee strings worden met elkaar vergeleken. 
Parameters 
str1  Cursor op char array 1 
str2  Cursor op char array 2 
Returnwaarde 
0  als beide strings gelijk zijn 
<0  als op het onderscheidingspunt de 1
e
 string kleiner is 
>0  als op het onderscheidingspunt de 1
e
 string groter is 
5.4.16.2               Str_Copy 
String functies 
Syntax 
void Str_Copy(char destination[],char source[],word offset); 
Sub Str_Copy(ByRef destination As Char,ByRef source As Char,offset As 
Word) 
Beschrijving 
De bronstring (source) wordt gekopieerd naar de doelstring (destination). Bij de kopieeractie 
wordt echter in elk geval het string –eindteken van de brontekensketen (char array) mee 
gekopieerd.   
Parameters 
destination   cursor op de doelstring   
source              cursor op de bronstring 
offset             aantal tekens waarmee de bronstring verschoven naar de doelstring gekopieerd 
wordt.  
Als offset de waarde STR_APPEND(0xffff) heeft, dan wordt als offset de lengte van de 
doelstring aangenomen. In dit geval wordt de bronstring achter de doelstring gekopieerd. 

155 
5.4.16.3              Str_Fill 
String functies            (bibliotheek “String_Lib.cc” ) 
Syntax 
void Str_Fill(char dest[],char c,word len); 
Sub Str_Fill(ByRef dest As Char,c As Char,len As Word) 
Beschrijving 
De string dest wordt opgevuld met het teken c. 
Parameters 
dest  cursor op de doelstring 
c  het teken dat herhaald in de string gekopieerd wordt 
len  aantal keren hoe vaak c in de doelstring geschreven wordt 
5.4.16.4              Str_Isalnum 
String functies   (bibliotheek “String_Lib.cc” ) 
Syntax 
byte Str_Isalnum(char c); 
Sub Str_Isalnum(c As Char) As Byte 
Beschrijving 
Een teken c wordt er op gecontroleerd, of het uit het alfabet stamt of een cijfer is. 
Parameter 
c   het te controleren teken  
Returnwaarde 
1   als het teken numeriek of alfabetisch is (zowel hoofd – als kleine letters) 
0  overig 
5.4.16.5             Str_Isalpha 
String functies    (bibliotheek “String_Lib.cc” ) 
Syntax 
byte Str_Isalpha(char c); 
Sub Str_Isalpha(c As Char) As Byte 
Beschrijving 
Een teken c wordt er op gecontroleerd, of het uit het alfabet stamt. 

156 
Parameters 
c   het te controleren teken  
Returnwaarde 
1   als het teken alfabetisch is (zowel hoofd – als kleine letters) 
0  overig 
5.4.16.6            Str_Len 
String functies 
Syntax 
word Str_Len(char str[]); 
Sub Str_Len(ByRef str As Char) As Word 
Beschrijving 
De lengte van de tekenketen (van de character array) wordt teruggegeven. 
Parameters 
str    cursor op string   
Returnwaarde 
Aantal tekens in string (zonder de nul aan het eind).
5.4.16.7            Str_Substr 
String functies    (bibliotheek “String_Lib.cc” ) 
Syntax 
int Str_SubStr(char source[],char search[]); 
Sub Str_SubStr(ByRef source As Char,ByRef search As Char) As Integer 
Beschrijving 
Een string search wordt gezocht in de string source. Als de gezochte tekenketen gevonden 
wordt, dan wordt de positie ervan teruggegeven. 
Parameters 
source   string die doorzocht wordt  
search   tekenketen die gezocht wordt 
Returnwaarde 
Positie van de gezochte string in de onderzochte tekenketen. 
-1   overig 

157 
5.4.16.8           Str_WriteFloat
String functies        
Syntax 
void Str_WriteFloat(float n, byte decimal, char text[], word offset); 
Sub Str_WriteFloat(n As Single,decimal As Byte,ByRef text As Char,offset 
As Word) 
Beschrijving 
Het float getal n wordt in een ASCII String met decimal decimale posities geconverteerd. Het 
resultaat wordt in de string text met een opvulling van offset opgeslagen. 
Parameters 
n  float getal 
decimal  aantal decimale posities waarin n geconverteerd wordt 
text    cursor op de doelstring 
offset  aantal tekens waarmee de ASCII weergave van het float getal verschoven in de string 
gekopieerd wordt. 
Als offset de waarde STR_APPEND(0xffff) heeft, dan wordt als offset de lengte van de 
doelstring aangenomen. In dit geval wordt het float getal aan de textstring gehangen. 
5.4.16.9         Str_WriteInt 
String functies        
Syntax 
void Str_WriteInt(int n, char text[], word offset); 
Sub Str_WriteInt(n As Integer,ByRef text As Char,offset As Word) 
Beschrijving 
Het integere getal n wordt geconverteerd in een ASCII string met voorteken. Het resultaat 
wordt opgeslagen in de string text met een opvulling van offset. 
Parameters 
n  integer getal 
text  cursor op de doelstring 
offset  aantal tekens waarmee de ASCII weergave van het getal verschoven in de tekststring 
gekopieerd wordt  
Als offset de waarde STR_APPEND(0xffff) heeft, dan wordt als offset de lengte van de 
doelstring aangenomen. In dit geval wordt het integere getal aan de textstring gehangen. 

158 
5.4.16.10              S
tr_WriteWord 
String functies        
Syntax 
void Str_WriteWord(word n,byte base,char text[],word offset,byte 
minwidth); 
Sub Str_WriteWord(n As Word,base As Byte,ByRef text As Char,offset As 
Word, minwidth As Byte) 
Beschrijving 
Het woord n wordt geconverteerd naar een ASCII string. Het resultaat wordt opgeslagen in 
de string text met een opvulling van offset. U kunt voor de uitvoer een willekeurige basis 
aangeven. Met een basis van 2 krijgt u binaire getallen, met 8 achttallige getallen en bij 16 
worden er hexgetallen uitgegeven, etc. Als de basis groter is dan 16, dan worden er letters 
van het alfabet toegevoegd. Als bijv. de basis 18 is, dan heeft het getal de cijfers 0 – 9, en ‘A’ 
– ‘H’. Als de ASCII string korter is dan minwidth, dan wordt het begin van de string opgevuld 
met nullen.  
Parameters 
n  16 Bit woord 
base  Basis van het talstelsel 
text    Cursor op de doelstring 
offset    Aantal tekens waarmee de ASCII weergave het getal verschoven in de tekststring  
                 gekopieerd wordt 
minwidth  minimale breedte van de string 
Als offset de waarde STR_APPEND(0xffff) heeft, dan wordt als offset de lengte van de 
doelstring aangenomen. In dit geval wordt het integere getal aan de textstring gehangen. 
5.4.17              Threads 
Multithreading 
Onder multithreading verstaat men het quasi parallel verwerken van meerdere processen in 
een programma. Eén van deze procedures wordt thread (= draad) genoemd. Bij 
multithreading wordt in snelle afstanden tussen de verschillende threads gewisseld, zodat bij 
de gebruiker de indruk van gelijktijdigheid ontstaat. 
De C-Control Pro firmware ondersteunt behalve het hoofdprogramma (thread “0”) maximaal 
13 extra threads. Bij multithreading wordt na een bepaald aantal verwerkte byte instructies 
de actuele thread in de status “Inactief” gezet en wordt de volgende uitvoerbare thread 
gezocht. Daarna start de bewerking van de nieuwe thread. De nieuwe thread kan weer 
dezelfde als de vorige zijn, afhankelijk van hoeveel threads er geactiveerd zijn of voor een 
uitvoering klaar zijn. Het hoofdprogramma geldt als eerste thread. Daarom is thread “0” 
steeds actief, ook als er expliciet geen threads gestart zijn.  
De prioriteit van een thread kan beïnvloed worden als u verandert hoeveel bytecodes een 
thread tot aan de volgende thread wisseling uit mag voeren (zie threadopties). Hoe kleiner 
het aantal cycli tot aan de wisseling, hoe geringer de prioriteit van de thread. De 
uitvoeringstijd van een bytecode is gemiddeld  

159 
7 – 9 µsec. Bij enkele bytecode commando’s duurt het echter langer, bijv. Floating Point 
operaties. 
 Ook interne interpreter –functies gelden als een cyclus. Omdat b.v. Serial Read wacht tot 
een teken van de seriële interface aankomt, kan in uitzonderingsgevallen een cyclus zeer 
lang duren. 
Een thread krijgt voor zijn locale variabelen zoveel plaats als hem in de threadopties van het 
project toegewezen is. Een uitzondering is thread “0” (het hoofdprogramma). Deze thread 
krijgt de overige geheugenruimte, die de andere threads overlaten. U moet daarom vooraf 
plannen hoeveel geheugenruimte elke extra thread werkelijk nodig heeft.  
 Opdat extra threads gestart kunnen worden, moet “multithreading” in de projectopties 
ingeschakeld worden, en moeten de parameters voor de andere threads in de threadopties 
op de correcte waarde gezet worden. 
 Bij het werken met threads moet steeds Thread Delay en niet AbsDelay gebruikt worden. 
Als er toch bijv. een AbsDelay(1000) gebruikt wordt, leidt dit tot het volgende effect: opdat de 
thread pas na 5000 cycli (default waarde) naar de volgende thread wisselt, zou de thread 
5000*1000ms (5000sec.) lopen tot de volgende thread zou kunnen werken. 
Thread synchronisatie 
Soms is het nodig dat een thread op de andere wacht. Dit kan bijv. een gemeenschappelijke 
hardware bron zijn, die alleen één thread kan bewerken. Of soms definieert men een kritisch 
programmabereik, dat slechts één thread mag betreden. Deze functies worden gerealiseerd 
door de aanwijzingen Thread Wait en Thread Signal.  
Een thread die moet wachten, voert de aanwijzing Thread_Wait uit met een signaalnummer. 
De toestand van de thread wordt op wachtend gezet. Dit betekent dat deze thread bij een 
mogelijke wisseling van thread overgeslagen wordt. Als de andere thread zijn kritische werk 
beëindigd heeft, geeft hij het commando Thread_Signal met hetzelfde signaalnummer dat de 
andere thread voor Thread_Wait gebruikt heeft. De thread –toestand van de wachtende 
thread verandert dan van wachtend in inactief. Nu wordt hij bij een mogelijke thread 
wisseling weer “meegenomen”.  
Deadlocks 
Als alle threads zich in een wachttoestand begeven met Thread Wait, dan is er geen thread 
meer die de andere threads uit de wachtende toestand zou kunnen bevrijden. Deze 
constellaties dient u bij de programmering te vermijden.  
Tabel thread –toestanden 
 Toestand  Betekenis 
actief  De thread wordt op dit moment bewerkt 
inactief  Kan na een thread wisseling weer geactiveerd worden 
slapend  Wordt na een aantal ticks weer op “inactief” gezet 
wachtend  De thread wacht op een signaal 

160 
5.4.17.1              Thread_Cycles 
Thread functies          
Syntax 
void Thread_Cycles(byte thread,word cycles); 
Sub Thread_Cycles(thread As Byte,cycles As Word) 
Beschrijving 
Zet het aantal bytecode instructies tot aan de volgende thread -wisseling op cycles. 
  Als een thread opnieuw gestart wordt, krijgt hij steeds het aantal cycli toegewezen die in 
de projectopties gedefinieerd zijn. Het heeft dus alleen maar zin om Thread_Cycles() op te 
roepen nadat een thread gestart is.  
Parameters 
thread  (0-13) nummer van de thread waarvan de cyclus veranderd moet worden 
cycles  aantal cycli tot aan het wisselen van de thread
5.4.17.2               Thread_Delay 
Thread functies  Voorbeeld 
Syntax 
void Thread_Delay(word delay); 
Sub Thread_Delay(delay As Word) 
Beschrijving 
Hiermee wordt een thread voor een bepaalde tijd op “slapend” geschakeld. Na de 
aangegeven periode is hij weer klaar voor de verwerking. De periode wordt aangegeven in 
ticks, die door timer 2 geproduceerd worden. Als timer 2 uitgeschakeld wordt of voor een 
ander doel wordt gebruikt, is de functiewijze van Thread_Delay() ongedefinieerd. 
 Ook als Thread_Delay() normaalgesproken als een wachtfunctie werkt, moet u er toch 
aan denken dat na de wachttijd de thread niet steeds automatisch weer uitgevoerd wordt. Hij 
is dan weliswaar klaar voor gebruik, maar moet eerst door een wisseling van thread weer tijd 
voor uitvoering krijgen. 
Parameters 
delay  aantal van 10ms ticks dat gewacht moet worden  
5.4.17.3              Thread_Info 
Thread functies        
Syntax 

161 
word Thread_Info(byte info); 
Sub Thread_Info(info As Byte) As Word 
Beschreibung 
Levert informatie over de thread,  die de functie Thread_Info oproept. De info parameter 
bepaald welke informatie teruggegeven wordt, 
Parameter 
info  waarden: 
TI_THREADNUM    Nummer van de op te roepen thread 
TI_STACKSIZE       Gedefinieerde stackgrootte 
TI_CYCLES             Aantal van de uit te voeren cycli voor een threadwisseling 
Returnwaarde 
Aangevraagde parameter 
5.4.17.4              Thread_Kill 
Thread functies        
Syntax 
void Thread_Kill(byte thread); 
Sub Thread_Kill(thread As Byte) 
Beschrijving 
Beëindigt de verwerking van een thread. Wanneer als threadnummer 0 wordt doorgegeven, 
dan wordt het hoofdprogramma en daarmee de gehele interpreter -loop gestopt. 
Parameter 
thread     (0-13) nummer van de thread 
5.4.17.5               Thread_Lock 
Thread functies        
Syntax 
void Thread_Lock(byte lock); 
Sub Thread_Lock(lock As Byte) 
Beschrijving 
Met deze functie kan een thread zijn thread -wisseling verhinderen. Dit is zinvol als bij een 
serie poort - uitvoeren of andere hardware commando’s de tijdelijke scheiding door een 
thread -wisseling vermeden moet worden. 

162 
 Als er vergeten wordt het “Lock” (de vergrendeling) weer uit te schakelen, vindt er geen 
multithreading meer plaats.  
Parameter 
lock  bij 1 wordt de thread -wisseling verhinderd, bij 0 weer toegelaten.
5.4.17.6           Thread_MemFree 
Thread functies        
Syntax 
word Thread_MemFree(void); 
Sub Thread_MemFree() As Word 
Beschrijving 
Geeft het vrije geheugen aan die voor de thread nog beschikbaar is. 
Parameter 
Geen 
Returnwaarde 
Vrij geheugen in bytes 
5.4.17.7          Thread_Resume 
Thread functies        
Syntax 
void Thread_Resume(byte thread); 
Sub Thread_Resume(thread As Byte) 
Beschrijving 
Als een thread zich in de toestand “wachtend” bevindt, kan hij hiermee weer op ”inactief” 
gezet worden. De status “inactief” betekent, dat de thread klaar is om bij een thread –
wisseling weer geactiveerd te worden. 
Parameter 
thread  (0-13) nummer van de thread

163 
5.4.17.8              Thread_Signal 
Thread functies        
Syntax 
void Thread_Signal(byte signal); 
Sub Thread_Signal(signal As Byte) 
Beschrijving 
Als een thread d.m.v. Thread Wait() op “wachtend” is gezet, dan kan de toestand met behulp 
van Thread_Signal weer in “inactief” veranderd worden. De parameter signal moet dezelfde 
waarde hebben die bij Thread Wait() gebruikt is. 
Parameter 
signal   waarde van het signaal
5.4.17.9            Thread_Start 
Thread functies       Voorbeeld 
Syntax 
void Thread_Start(byte thread,float func); 
Sub Thread_Start(Byte thread As Byte,func As Single) 
Beschrijving 
Er wordt een nieuwe thread gestart. Als startfunctie voor de thread kan een willekeurige 
functie gebruikt worden. 
 Als er een functie uitgezocht wordt die overdracht –parameters bevat, dan is bij de start 
van de thread de inhoud van deze parameters niet gedefinieerd! 
Parameters  
thread  (0-13) nummer van de thread die gestart moet worden 
func   naam van de functie waarin de nieuwe thread gestart wordt
Opmerking 
De zwevende komma- datatype kan niet gepast verschijnen, maar hij wordt intern als 4 byte waarde 
behandelt. Een functie- aanwijzer moet vanaf de Mega128 ondersteuning meer zijn dan 16 bit. 
5.4.17.10             Thread_Wait 
Thread functies 
Syntax 
void Thread_Wait(byte signal); 
Sub Thread_Wait(signal As Byte) 

164 
Beschrijving 
De thread krijgt de status “wachtend”. D.m.v. Thread Resume() of Thread Signal() kan de 
thread weer in een inactieve toestand terechtkomen. 
Parameter 
signal   waarde van het signaal
5.4.17.11         Thread voorbeeld 
/ /  Demoprogramma voor multithreading  
/ /  het programma is niet gedempt, het kort indrukken van een toets leidt daarom tot  
/ / meervoudige invoer van de string 
void thread1(void) 
{ 
while(true) // eindeloze lus 
{ 
if(!Port_ReadBit(PORT_SW2)) Msg_WriteText(str2); // SW2 werd 
ingedrukt 
} 
} 
char str1[12],str2[12]; 
void main(void) 
{ 
str1="Taster 1"; 
str2="Taster 2"; 
Port_DataDirBit(PORT_SW1, PORT_IN); // Pin op ingang 
Port_DataDirBit(PORT_SW2, PORT_IN); // Pin op ingang 
Port_WriteBit(PORT_SW1, 1); // Pullup zetten 
Port_WriteBit(PORT_SW1, 1); // Pullup zetten 
Thread_Start(1,thread1); // Thread 1 starten 
while(true) // eindeloze lus 
{ 
if(!Port_ReadBit(PORT_SW1)) Msg_WriteText(str1); // SW1 werd 
ingedrukt 
} 
} 

165 
5.4.17.12
Thread voorbeeld 2 
// multithread2: Multithreading met Thread_Delay 
// benodigde Library: IntFunc_Lib.cc 
void thread1(void) 
{ 
while(true) 
{ 
Msg_WriteText(str2); Thread_Delay(200); 
}           // "Thread2" wordt gegeven. 
}           // Daarna “slaapt”de thread 
 // voor 200ms. 
char str1[12],str2[12];      // globale variablendeclaratie 
//------------------------------------------------------------------------- 
// Hoofdprogramma 
// 
void main(void) 
{ 
str1="Thread1";       // Variablendeclaratie 
str2="Thread2";       // Variablendeclaratie 
Thread_Start(1,thread1);   // Functie- oproep met aangeven van de  
// threadnummer. 
while(true)        // Eindeloze lus 
{ 
Thread_Delay(100); Msg_WriteText(str1); 
}           // De thread os “slapend” voor 100ms. 
}             // Daarna wordt "Thread1" uitgevoerd. 
5.4.18         Timer
Er staan in de C-Control Pro Mega 32 twee , Mega128 drie onafhankelijke Timer-Counters 
ter beschikking: Timer_0 met 8 bit en Timer_1 met 16 Bit en Timer_3 met 16 Bit (alleen 
Mega128). Timer_2 wordt door de firmware als interne tijdbasis gebruikt, en is vast ingesteld 
op een 10ms interrupt. U kunt de interne timers voor veelvuldige opgaven inzetten:
•  Teller van gebeurtenissen 
•  Produceren van frequenties 
•  Pulsbreedte -modulatie 
•  Timerfuncties  
•  Puls - & periodemeting 
•  Frequentiemeting 
5.4.18.1         Teller van gebeurtenissen
Hier twee voorbeelden hoe de timer als teller van gebeurtenissen gebruikt worden: 
Timer0 (8 Bit) 
/ /   Voorbeeld: pulstelling met CNT0 
Timer  T0CNT();   

166 
pulse(n);                          / /    n pulsen genereren 
count=Timer  T0GetCNT(); 
  Bij de Mega128 kan vanwege de hardware Timer_0 niet als teller gebruikt worden. 
Timer1(16 Bit) 
/ /   Voorbeeld: pulstelling met CNT1 
Timer  T1CNT();   
pulse(n);                          / /    n pulsen genereren 
count=Timer  T1GetCNT(); 
5.4.18.2        Produceren van frequenties 
Voor het produceren van frequenties kunnen Timer_0  en Timer_1 als volgt gebruikt worden:
Timer0 (8 Bit) 
1
e
 voorbeeld:  
Timer_T0FRQ(10,  ps_8)         / / Rechthoeksignaal met 10*1,085  
µ
s = 10,85 
µ
s periodeduur 
2
e
 voorbeeld: gepulste frequentieblokken
 (project FRQ0) 
void main(void) 
{ 
int delval;       // Variable v.d. in-/uitschakeltijd 
delval=200;       // Waarde toewijzing variablen delval 
Timer_T0FRQ(100,PS0_1024);   // De timer wordt op de frequentie 
// Periode=138,9 µs*100=13,9 ms,   
Frequenz= 72Hz 
while (1) 
{ 
AbsDelay(delval);   // tijdvertraging 200ms 
Timer_T0Stop();     // De timer wordt gestopt. 
AbsDelay(delval);   // Tijdvertraging 200ms 
Timer_T0Start(PS0_1024);// De timer wordt met de timer  
// Prescaler PS0_1024 eingeschaltet. 
} 
} 
 Het programma kan op de Mega128 niet in de USB- modus werken omdat de uitgang 
PB4 in samenhang met de USB interface op het apllication board gebruikt wordt. 
Timer1 (16 Bit)  
1
e
 voorbeeld:  produceren van frequenties met 125*4,34µ
µµ
µs = 1085µ
µµ
µs periode 
Timer_T1FRQ(125,ps_64); 
2
e
 voorbeeld: produceren van frequenties met 10*1,085 µ
µµ
µs = 10,85 µ
µµ
µs periode en  
2*1,085µ
µµ
µs = 2,17 µ
µµ
µs faseverschuiving 
Timer_T1FRQX(10,2,ps_8);

167 
5.4.18.3        Frequentiemeting 
Voor het direct meten van een frequentie kan de Timer1(16Bit) gebruikt worden. De pulsen 
binnen een seconde worden geteld en het resultaat is dan in Hertz. De maximale 
meetfrequentie is 64kHz en wordt geleverd door de 16Bit teller. Een voorbeeld van deze 
manier van frequentiemeting vindt u onder “Demo programma’s/Frequentiemeting”. Door het 
verkorten van de meettijd kunnen ook hogere frequenties gemeten worden. Het resultaat 
moet dan dienovereenkomstig omgerekend worden.  
5.4.18.4       Pulsbreedte –modulatie 
Er staan voor de pulsbreedte –modulatie twee timers tot uw beschikking: Timer_0 met 8 bit 
en Timer_1 met 16 Bit. Met een pulsbreedte –modulatie kunt u heel gemakkelijk een digitaal 
–analoog –omvormer realiseren. 
Timer0 (8 Bit) 
Voorbeeld: Pulsbreedte –modulatie met 138,9 µ
µµ
µs periode en 5,42 µ
µµ
µs pulsbreedte, veranderd 
naar 10,84 µ
µµ
µs pulsbreedte 
Timer_T0PWM(10,2);      / /  Puls: 10*542,5 ns  =  5,42 
µ
s,  periode: 256*542,5  ns  = 138,9 
µ
s 
Timer_T0PW(20);      / /  Puls: 20*542,5 ns  = 10,84 
µ
s 
Timer1 (16 Bit) 
Voorbeeld: pulsbreedte –modulatie met 6,4 ms periode en 1,28 ms pulsbreedte kanaal A en  
640 µ
µµ
µs pulsbreedte kanaal B 
Timer_T0PWMX(10,20,10,ps_1024);    / /  Periode:  100*69,44 
µ
s  =  6,94  ms 
                                                              / /  PulsA: 20*69,44 
µ
s  =  1,389  ms 
                                                             / /  PulsB: 10*69,44 
µ
s  =  694,4  
µ
s  
5.4.18.5        Puls & periodemeting 
Met Timer_1 kunnen pulsbreedtes of signaalperiodes gemeten worden. Met behulp van de 
Input Capture functie (speciaal register van de Controller) wordt de tijd tussen twee flanken 
gemeten. Deze functie gebruikt de Capture -Interrupt (INT_TIM1CAPT). De puls wordt 
gemeten tussen een stijgende en de volgende vallende flank. De periode wordt gemeten 
tussen twee stijgende flanken. Door de Input Capture functie worden programma –looptijden 
niet als onnauwkeurigheid in het meetresultaat ingevoegd. Met de programmeerbare 
voordeler kan de resolutie van de Timer_1 vastgelegd worden. Voordeler zie Tabel. 
Voorbeeld: pulsbreedtemeting (Project Pmeting) 434 µ
µµ
µs (100*4,34 µ
µµ
µs, zie Tabel) inschakelen 
word  PM_waarde; 
void  Timer1_ISR(void) 
{ 
       int  irqcnt; 
       PM_waarde=Timer_T1GetPM(0);                / / Pulsbreedte meten 
       irqcnt=Irq_GetCount(INT_TIM1CAPT); 
} 

168 
void  main(void) 
{  byte n; 
Irq_SetVect(INT_TIM1CAPT,Timwer1_ISR);    / /  Interrupt Service routine definiëren 
Timer_T0PWM(100,ps_64);  / / pulsgenerator starten 
/ /  De meting begint hier 
/ /  Output timer0 OC0(Port B.3) verbinden met ICP (Input Capture Pin) (Port D.6) 
 PM_waarde=0; 
Timer_T1PM(ps_64);  / /  Voordeler voor meting vastleggen 
while(PM_waarde==0);  / /  Pulsbreedte of periode meten 
Mag_WriteHex(PM_waarde);  / /  Meetwaarde afgeven 
} 
Vanwege de overzichtelijkheid is hier een eenvoudige versie aangegeven. Bij de Mega128 
wordt vanwege een conflict op pin B4 de Timer_0 voor de pulsproductie gebruikt. Het 
volledige programma vindt u in de map PW_Messung. 
5.4.18.6           Timerfuncties 
Er staan twee onafhankelijke timers tot uw beschikking: Timer_0 met 8 bit en Timer_1 met 
16 Bit. De timers beschikken over een programmeerbare voordeler, zie tabel. Met de timer 
kunt u een tijd vastleggen, nadat een interrupt getriggerd is. In de interrupt -routine kunnen 
dan verschillende bewerkingsstappen uitgevoerd worden.  
Timer  T0Time (8 Bit) 
Voorbeeld: Timer0: uitgang met een vertraging van 6,94 ms (100x69,44 µ
µµ
µs, zie tabel) 
inschakelen 
Void  Timer0_ISR(void)  
{ 
          int  irqcnt; 
          Port _WriteBit(0,1);  
          Timer T0Stop();                  //  Timer0 stoppen 
          irqcnt=Irq_GetCount(INT_TIM0COMP); 
}  
void  main(void) 
{ 
Port _DataDirBit(0,0); // PortA.0  uitgang 
 Port _WriteBit(0,0);  // PortA.0  uitgang = 0 
Irq_SetVect(INT_TIM0MP,Timer0_ISR);  // Interrupt service routine  
    definiëren 
TimerT0Time(100,ps_1024);  // Tijd vastleggen en timer0  
    starten   
//  verdere verloop programma … 
} 

169 
5.4.18.7         Timer_Disable 
Timer functies 
Syntax 
void Timer_Disable(byte timer); 
Sub Timer_Disable(timer As Byte) 
Beschrijving
Deze functie schakelt  de geselecteerde timer uit. Timerfuncties bezetten I/O poorten. Als 
een timer niet meer nodig is en de poorten moeten als normale I/Os gebruikt worden, dan 
moet de timerfunctie uitgeschakeld worden. 
Parameters 
0 = Timer_0 
1 = Timer_1 
3 = Timer_3 (alleen Mega128)
5.4.18.8         Timer_T0CNT 
Timer functies 
Syntax 
void Timer_T0CNT(void); 
Sub Timer_T0CNT() 
Beschrijving 
Deze functie initialiseert de Counter0. De Counter0 wordt bij een positieve signaalflank op de 
ingang  Mega32:T0 (PIN1) opgehoogd. 
Bij de Mega128 kan vanwege de hardware Timer_0 niet als teller gebruikt worden. 
Parameters 
Geen 
5.4.18.9         Timer_T0FRQ 
Timer functies 
Syntax 
void Timer_T0FRQ(byte period,byte PS); 
Sub Timer_T0FRQ(period As Byte,PS As Byte) 

170 
Beschrijving 
Deze functie initialiseert de Timer0 met de aangegeven voordeler en periodeduur, zie tabel. 
Het uitgangssignaal verschijnt op Port B.3 (PIN4) = Mega32, PortB.4 (X1_4) = Mega128.. 
Het produceren van de frequentie wordt automatisch gestart. De Mega128 beschikt over 
uitgebreide voordeler- definities, zie tabel. 
Parameters 
period  periodeduur 
PS       voordeler 
Tabel prescaler:  Mega 32 
Voordeler (prescaler
)
Tijdbasis (duur van een tick)
PS0_1 (1)  135,6 ns 
PS0_8 (2)  1,085 µs 
PS0_64 (3)  8,681 µs 
PS0_256 (4)  34,72 µs 
PS0_1024 (5)  138,9 µs 
Mega128 
Voordeler (prescaler
)
Tijdbasis (duur van een tick)
PS0_1 (1)  135,6 ns 
PS0_8 (2)  1,085 µs 
PS0_32(3)  4,340 µs 
PS0_64 (4)  8,681 µs 
PS0_128 (5)  17,36 µs 
PS0_256 (6)  34,72 µs 
PS0_1024 (7)  138,9 µs 
5.4.18.10         Timer_T0GetCNT 
Timer functies 
Syntax 
byte Timer_T0GetCNT(void); 
Sub Timer_T0GetCNT() As Byte 
Beschrijving 
De waarde van Counter0 wordt gelezen. Als er een overflow plaats vindt, dan wordt de waarde 0xFF 
doorgegeven. 
Bij de Mega128 kan vanwege de hardware Timer_0 niet als teller gebruikt worden. 
Returnwaarde 
De gemeten waarde van de teller 

171 
5.4.18.11            TimerT0PW 
Timer functies 
Syntax 
void Timer_T0PW(byte PW); 
Sub Timer_T0PW(PW As Byte) 
Beschrijving 
Deze functie stelt een nieuwe pulsbreedte voor Timer0 in, zonder de voordeler te 
veranderen. 
Parameters 
PW   pulsbreedte 
5.4.18.12              TimerT0PWM 
Timer functies 
Syntax 
void Timer_T0PWM(byte PW,byte PS); 
Sub Timer_T0PWM(PW As Byte,PS As Byte) 
Beschrijving 
Deze functie initialiseert deTimer0 met de aangegeven voordeler en pulsbreedte, zie tabel. 
Het uitgangssignaal verschijnt bij de Mega32:op Port B.3 (PIN4) Mega128: PortB.4 (X1_4). 
De Mega128 beschikt over uitgebreide voordeler- definities, zie tabel. 
Parameters 
PW      pulsbreedte 
PS       voordeler 
Tabel prescaler:  Mega32 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 

172 
Mega128 
Voordeler (prescaler
)
Tijdbasis (duur van een tick)
PS0_1 (1)  135,6 ns 
PS0_8 (2)  542,5 ns 
PS0_32(3)  2,17 µs 
PS0_64 (3)  4,34 µs 
PS0_128 (5)  8,68 µs 
PS0_256 (6)  17,36 µs 
PS0_1024 (5)  69,44 µs 
5.4.18.13         Timer_T0Start 
Timer functies 
Syntax 
void Timer_T0Start(byte prescaler); 
Sub Timer_T0Start(prescaler As Byte) 
Beschrijving 
Het produceren van de frequentie wordt met de bovenstaande instelling gestart. De 
voordeler moet nieuw aangegeven worden. 
Parameters 
Prescaler  voordeler (tabel prescaler) 
5.4.18.14        Timer_T0Stop
Timer functies 
Syntax 
void Timer_T0Stop(void); 
Sub Timer_T0Stop() 
Beschrijving 
Het produceren van de frequentie wordt gestopt. Het uitgangssignaal kan 0 of 1 zijn, 
afhankelijk van de laatste toestand. Alleen de klokpuls voor de timer wordt gestopt. De 
overige instellingen blijven behouden. 
Parameters 
Geen 
5.4.18.15        Timer_T0Time 
Timer functies 

173 
Syntax 
void Timer_T0Time(byte Time,byte PS); 
Sub Timer_T0Time(Time As Byte,PS As Byte) 
Beschrijving 
Deze functie initialiseert de Timer0 met de aangegeven voordeler en de waarde (8Bit) voor 
de tijd, zie tabel. Als deze waarde bereikt is, dan wordt de Timer0 Interrupt 
(INT_TIM0COMP) geactiveerd. De Mega128 beschikt over uitgebreide voordeler- definities, 
zie tabel. 
Parameters 
Time   tijdwaarde waarbij de interrupt geactiveerd wordt 
PS      voordeler  
Tabel prescaler:    Mega32 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
Mega128 
Voordeler (prescaler
)
Tijdbasis (duur van een tick)
PS0_1 (1)  67,8 ns 
PS0_8 (2)  542,5 ns 
PS0_32(3)  2,17 µs 
PS0_64 (3)  4,34 µs 
PS0_128 (5)  8,68 µs 
PS0_256 (6)  17,36 µs 
PS0_1024 (5)  69,44 µs 
5.4.18.16          Timer_T1CNT 
Timer functies 
Syntax 
void Timer_T1CNT(void); 
Sub Timer_T1CNT() 
Beschrijving 
Deze functie initialiseert de Counter1. De Counter1 wordt bij een positieve signaalflank op de 
ingang bij de Mega32:op Port B.1 (PIN2) Mega128: PortD.6 (X2_15)  opgehoogd. 
Parameters 
Geen 

174 
5.4.18.17            Timer_T1CNT_Int 
Timer functies 
Syntax 
void Timer_T1CNT_Int(word limit); 
Sub Timer_T1CNT_Int(limit As Word) 
Beschrijving 
Deze functie initialiseert de Counter1. De Counter1 wordt bij een positieve signaalflank op de 
ingang bij de Mega32:op Port B.1 (PIN2) Mega128: PortD.6 (X2_15)  opgehoogd. Als de 
limiet bereikt is, wordt een interrupt geactiveerd. De desbetreffende 
interrupt_Service_Routine moet vooraf gedefinieerd zijn. 
Parameters 
limit 
5.4.18.18              Timer_T1FRQ 
Timer functies 
Syntax 
void Timer_T1FRQ(word period,byte PS); 
Sub Timer_T1FRQ(period As Word,PS As Byte) 
Beschrijving 
Deze functie initialiseert de Timer1 met de aangegeven voordeler en periodeduur, zie tabel. 
Het uitgangssignaal verschijnt bij de Mega32:op Port D.5 (PIN19) Mega128: PortB.5 (X1_3)  
Het produceren van de frequentie wordt automatisch gestart.  
Parameters 
period  periodeduur 
PS       voordeler
Tabel prescaler:  
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  135,6 ns 
PS_8 (2)  1,085 µs 
PS_64 (3)  8,681 µs 
PS_256 (4)  34,72 µs 
PS_1024 (5)  138,9 µs 

175 
5.4.18.19            Timer_T1FRQX 
Timer functies 
Syntax 
void Timer_T1FRQX(word period,word skew,byte PS); 
Sub Timer_T1FRQX(period As Word,skew As Word,PS As Byte) 
Beschrijving 
Deze functie initialiseert de Timer1 met de aangegeven voordeler periodeduur en fase-
verschuiving van de beide uitgangssignalen, zie tabel. De uitgangssignalen verschijnen op 
Mega 32: PortD.4 (PIN18) en PortD.5(PIN19). Mega128: PortB.5(X1_3) en PortB.6 (X1_2). 
Het produceren van de frequentie wordt automatisch gestart. De waarde voor de 
faseverschuiving moet kleiner zijn dan de halve periode.  
Parameters 
period   periodeduur 
skew    faseverschuiving 
PS        voordeler (tabel prescaler) 
5.4.18.20            Timer_T1GetCNT 
Timer functies 
Syntax 
word Timer_T1GetCNT(void); 
Sub Timer_T1GetCNT() As Word 
Beschrijving 
De waarde van Counter1 wordt gelezen. Als er een overflow plaats vindt, dan wordt de 
waarde 0xFFFF doorgegeven. 
Returnwaarde 
De gemeten waarde van de teller 
5.4.18.21             Timer_T1GetPM 
Timer functies 
Syntax 
word Timer_T1GetPM(byte Mode); 
Sub Timer_T1GetPM(Mode As Byte) As Word 
Beschrijving 
Deze functie legt vast of er een pulsbreedte – of periodemeting moet worden uitgevoerd, en 
levert het meetresultaat op. 

176 
Parameter 
Mode 
0 pulsbreedte -meting 
1 periodemeting 
Returnwaarde:  
Resultaat van de meting 
 Om het meetresultaat te berekenen wordt de geretourneerde 16bit waarde met de waarde uit de 
tabel prescaler tabel gemultipliceert, die bij het oproepen van Timer_T1PM aangegeven werd (zie ook 
voorbeeld). 
5.4.18.22               Timer_T1PWA
Timer functies 
Syntax 
void Timer_T1PWA(word PW0); 
Sub Timer_T1PWA(PW0 As Word) 
Beschrijving:  
Deze functie stelt een nieuwe pulsbreedte (kanaal_A) in voor Timer1, zonder de voordeler te 
veranderen. 
Parameter 
PW0  pulsbreedte 
5.4.18.23           Timer_T1PM 
Timer functies 
Syntax 
void Timer_T1PM(byte PS); 
void Timer_T1PM(PS As Byte) 
Beschrijving 
Deze functie initialiseert Timer_1 voor de meting en stelt de voordeler in.   
Parameter 
PS  voordeler 

177 
Tabel prescaler: 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
5.4.18.24           Timer_T1PWB 
Timer functies
Syntax 
void Timer_T1PWB(word PW1); 
Sub Timer_T1PWB(PW1 As Word) 
Beschrijving:  
Deze functie stelt een nieuwe pulsbreedte (kanaal_B) in voor Timer1, zonder de voordeler te 
veranderen. 
Parameter 
PW1  pulsbreedte 
5.4.18.25         Timer_T1PWM 
Timer functies
Syntax 
void Timer_T1PWM(word period,word PW0,byte PS); 
Sub Timer_T1PWM(period As Word,PW0 As Word,PS As Byte) 
Beschrijving:  
Deze functie initialiseert Timer1 met de aangegeven voordeler, periodeduur en 
faseverschuiving van beide uitgangssignalen.
Mega32: PortD.4 (PIN18) en PortD.5 (PIN19). 
Mega128: PortB.5 (X1_3) en PortB.6 (X1_2). Het produceren van de frequentie wordt 
automatisch gestart. De waarde voor de faseverschuiving moet kleiner zijn dan de halve 
periode.  
Parameters 
period  periodeduur 
PW0    pulsbreedte 
PS       voordeler  

178 
Tabel prescaler: 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
5.4.18.26        Timer_T1PWMX 
Timer functies
Syntax 
void Timer_T1PWMX(word period,word PW0,word PW1,byte PS); 
Sub Timer_T1PWMX(period As Word,PW0 As Word,PW1 As Word,PS As Byte) 
Beschrijving:  
Deze functie initialiseert Timer1 met de aangegeven voordeler, pulsbreedte voor kanaal A en 
B en periodeduur, zie tabel. Het uitgangssignaal verschijnt op Mega32: PortD.4 (PIN18) en 
PortD.5(PIN19). Mega128: PortB.5 (X1_3) en PortB.6 (X1_2). 
Parameters 
period  periodeduur 
PW0    pulsbreedte kanaal A 
PW1    pulsbreedte kanaal B 
PS       voordeler (tabel prescaler)   
5.4.18.27        Timer_T1PWMY
Timer functies
Syntax 
void Timer_T1PWMY(word period,word PW0,word PW1,word PW2,byte PS); 
Sub Timer_T1PWMY(period As Word,PW0 As Word,PW1 As Word,PW2 As Word,PS As 
Byte) 
Beschrijving:  
Deze functie initialiseert Timer1 met de aangegeven voordeler, pulsbreedte voor kanaal A en 
B, C en periodeduur, zie tabel. De uitgangssignalen verschijnen op PortB.5 (X1_3), PortB.6 
(X1_2) en PortB.7 (X_1). 
Parameters 
period  periodeduur 
PW0    pulsbreedte kanaal A 
PW1    pulsbreedte kanaal B 
PW2    pulsbreedte kanaal C 
PS       voordeler (tabel prescaler)   

179 
5.4.18.28          Timer_T1Start 
Timer functies 
Syntax 
void Timer_T1Start(byte prescaler); 
Sub Timer_T1Start(prescaler As Byte) 
Beschrijving 
Het produceren van frequenties wordt met bovenstaande instelling gestart. De voordeler 
moet nieuw aangegeven worden. 
Parameters 
prescaler  voordeler (tabel prescaler) 
5.4.18.29             Timer_T1Stop 
Timer functies 
Syntax 
void Timer_T1Stop(void); 
Sub Timer_T1Stop() 
Beschrijving 
Het produceren van frequenties wordt gestopt. Het uitgangssignaal kan 0 of 1 zijn, 
afhankelijk van de laatste toestand. Alleen de puls voor de timer wordt gestopt. De overige 
instellingen blijven behouden. 
Parameters 
Geen 
5.4.18.30             Timer_T1Time 
Timer functies 
Syntax 
void Timer_T1Time(word Time,byte PS); 
Sub Timer_T1Time(Time As Word,PS As Byte) 
Beschrijving 
Deze functie initialiseert Timer1 met de aangegeven voordeler en de waarde (16Bit) voor de 
tijd, zie tabel. Als deze waarde wordt bereikt, dan wordt de Timer1-interrupt 
(INT_TIM1COMP) geactiveerd. 

180 
Parameters 
Time  tijdswaarde waarbij de interrupt getriggerd wordt 
PS     voordeler 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
5.4.18.31          Timer_T3CNT 
Timer functies 
Syntax 
void Timer_T3CNT(void); 
Sub Timer_T3CNT() 
Beschrijving 
Deze functie initialiseert de Counter3. De Counter3 wordt bij een positieve signaalflank op de 
ingang  PortE.6 (X2_10) opgehoogd. 
Parameters 
Geen 
5.4.18.32            Timer_T3CNT_Int 
Timer functies 
Syntax 
void Timer_T3CNT_Int(word limit); 
Sub Timer_T3CNT_Int(limit As Word) 
Beschrijving 
Deze functie initialiseert de Counter3. De Counter3 wordt bij een positieve signaalflank op de 
ingang  PortE.6 (X2_10) opgehoogd. Als de limiet bereikt is, wordt een interrupt geactiveerd. 
De desbetreffende interrupt_Service_Routine moet vooraf gedefinieerd zijn. 
Parameters 
limit 

181 
5.4.18.33              Timer_T3FRQ 
Timer functies 
Syntax 
void Timer_T3FRQ(word period,byte PS); 
Sub Timer_T3FRQ(period As Word,PS As Byte) 
Beschrijving 
Deze functie initialiseert de Timer3 met de aangegeven voordeler en periodeduur, zie tabel. 
Het uitgangssignaal verschijnt  PortE.3 (X1_13)  Het produceren van de frequentie wordt 
automatisch gestart.  
Parameters 
period  periodeduur 
PS       voordeler
Tabel prescaler:  
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  135,6 ns 
PS_8 (2)  1,085 µs 
PS_64 (3)  8,681 µs 
PS_256 (4)  34,72 µs 
PS_1024 (5)  138,9 µs 
5.4.18.34            Timer_T3FRQX 
Timer functies 
Syntax 
void Timer_T3FRQX(word period,word skew,byte PS); 
Sub Timer_T3FRQX(period As Word,skew As Word,PS As Byte) 
Beschrijving 
Deze functie initialiseert de Timer3 met de aangegeven voordeler periodeduur en fase-
verschuiving van de beide uitgangssignalen, zie tabel. De uitgangssignalen verschijnen op 
PortE.3 (X1_13) en PortE.4 (X1_12).. Het produceren van de frequentie wordt automatisch 
gestart. De waarde voor de faseverschuiving moet kleiner zijn dan de halve periode.  
Parameters 
period   periodeduur 
skew    faseverschuiving 
PS        voordeler (tabel prescaler) 

182 
5.4.18.35            Timer_T3GetCNT 
Timer functies 
Syntax 
word Timer_T3GetCNT(void); 
Sub Timer_T3GetCNT() As Word 
Beschrijving 
De waarde van Counter3 wordt gelezen. Als er een overflow plaats vindt, dan wordt de 
waarde 0xFFFF doorgegeven. 
Returnwaarde 
De gemeten waarde van de teller 
5.4.18.36             Timer_T3GetPM 
Timer functies 
Syntax 
word Timer_T3GetPM(byte Mode); 
Sub Timer_T3GetPM(Mode As Byte) As Word 
Beschrijving 
Deze functie legt vast of er een pulsbreedte – of periodemeting moet worden uitgevoerd, en 
levert het meetresultaat op. 
Parameters 
Mode 
0 pulsbreedte -meting 
1 periodemeting 
Returnwaarde:  
Resultaat van de meting 
 Om het meetresultaat te berekenen wordt de geretourneerde 16bit waarde met de waarde uit de 
tabel prescaler tabel gemultipliceert, die bij het oproepen van Timer_T3PM aangegeven werd (zie ook 
voorbeeld). 
5.4.18.37               Timer_T3PWA
Timer functies 
Syntax 
void Timer_T3PWA(word PW0); 
Sub Timer_T3PWA(PW0 As Word) 

183 
Beschrijving:  
Deze functie stelt een nieuwe pulsbreedte (kanaal_A) in voor Timer3, zonder de voordeler te 
veranderen. 
Parameter 
PW0  pulsbreedte 
5.4.18.38           Timer_T3PM 
Timer functies 
Syntax 
void Timer_T3PM(byte PS); 
void Timer_T3PM(PS As Byte) 
Beschrijving 
Deze functie initialiseert Timer_3 voor de meting en stelt de voordeler in.   
Parameter 
PS  voordeler 
Tabel prescaler: 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
5.4.18.39           Timer_T3PWB 
Timer functies
Syntax 
void Timer_T3PWB(word PW1); 
Sub Timer_T3PWB(PW1 As Word) 
Beschrijving:  
Deze functie stelt een nieuwe pulsbreedte (kanaal_B) in voor Timer3, zonder de voordeler te 
veranderen. 
Parameter 
PW1  pulsbreedte 

184 
5.4.18.40         Timer_T3PWM 
Timer functies
Syntax 
void Timer_T3PWM(word period,word PW0,byte PS); 
Sub Timer_T3PWM(period As Word,PW0 As Word,PS As Byte) 
Beschrijving:  
Deze functie initialiseert Timer3 met de aangegeven voordeler, pulsbreedte en periodeduur, 
Het uitgangssignaal verschijnt PortE.3 (X1_13.  
Parameters 
period  periodeduur 
PW0    pulsbreedte 
PS       voordeler  
Tabel prescaler: 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
5.4.18.41        Timer_T3PWMX 
Timer functies
Syntax 
void Timer_T3PWMX(word period,word PW0,word PW1,byte PS); 
Sub Timer_T3PWMX(period As Word,PW0 As Word,PW1 As Word,PS As Byte) 
Beschrijving:  
Deze functie initialiseert Timer3 met de aangegeven voordeler, pulsbreedte voor kanaal A en 
B en periodeduur, zie tabel. Het uitgangssignaal verschijnt op PortE.3 (X1_13) en PortE.4 
(X1_12). 
Parameters 
period  periodeduur 
PW0    pulsbreedte kanaal A 
PW1    pulsbreedte kanaal B 
PS       voordeler (tabel prescaler)   

185 
5.4.18.42        Timer_T3PWMY
Timer functies
Syntax 
void Timer_T3PWMY(word period,word PW0,word PW1,word PW2,byte PS); 
Sub Timer_T3PWMY(period As Word,PW0 As Word,PW1 As Word,PW2 As Word,PS As 
Byte) 
Beschrijving:  
Deze functie initialiseert Timer3 met de aangegeven voordeler, pulsbreedte voor kanaal A, B 
en C en periodeduur, zie tabel. De uitgangssignalen verschijnen op PortE.3 (X1_13), PortE.4 
(X1_12) en PortE.5 (X_11). 
Parameters 
period  periodeduur 
PW0    pulsbreedte kanaal A 
PW1    pulsbreedte kanaal B 
PW2    pulsbreedte kanaal C 
PS       voordeler (tabel prescaler)   
5.4.18.43          Timer_T3Start 
Timer functies 
Syntax 
void Timer_T3Start(byte prescaler); 
Sub Timer_T3Start(prescaler As Byte 
Beschrijving 
Het produceren van frequenties wordt met de vorige instelling gestart. De voordeler moet 
nieuw aangegeven worden. 
Parameters 
prescaler  voordeler (tabel prescaler) 
5.4.18.44             Timer_T3Stop 
Timer functies 
Syntax 
void Timer_T3Stop(void); 
Sub Timer_T3Stop() 

186 
Beschrijving 
Het produceren van frequenties wordt gestopt. Het uitgangssignaal kan 0 of 1 zijn, 
afhankelijk van de laatste toestand. Alleen de puls voor de timer wordt gestopt. De overige 
instellingen blijven behouden. 
Parameters 
Geen 
5.4.18.45             Timer_T3Time 
Timer functies 
Syntax 
void Timer_T3Time(word Time,byte PS); 
Sub Timer_T3Time(Time As Word,PS As Byte) 
Beschrijving 
Deze functie initialiseert Timer3 met de aangegeven voordeler en de waarde (16Bit) voor de 
tijd, zie tabel. Als deze waarde wordt bereikt, dan wordt de Timer3-interrupt 
(INT_TIM3COMP) geactiveerd. 
Parameters 
Time  tijdswaarde waarbij de interrupt getriggerd wordt 
PS     voordeler 
Voordeler (prescaler)
Tijdbasis (duur van een tick)
PS_1 (1)  67,8 ns 
PS_8 (2)  542,5 ns 
PS_64 (3)  4,34 µs 
PS_256 (4)  17,36 µs 
PS_1024 (5)  69,44 µs 
5.4.18.46          Timer_TickCount 
Timer functies 
Syntax 
word Timer_TickCount(void); 
Sub Timer_TickCount() As Word 
Beschreibung 
Meet de tijd in 10ms Ticks tussen twee oproepen van Timer_TickCount() en geeft de waarde bij de 
tweede oproep van Timer_TickCount() terug. De returnwaarde bij de eerste oproep kan geignoreert 
worden. 
187 
Parameter 
Geen 
Returnwaarde 
Tijdverschil tussen twee oproepen 
Voorbeeld: 
void main(void) 
{ 
word time; 
Timer_TickCount(); 
AbsDelay(500); // 500 ms wachten 
time=Timer_TickCount(); // de waarde van time moet 50 zijn 
} 

188 
                                           Hoofdstuk  

189 
6
FAQ (vaak gestelde vragen) 
Problemen 
1.  Er bestaat geen USB –verbinding met het Application Board. 
•  Is de FTDI USB driver op de PC geladen? Of verschijnt er misschien bij het insteken van 
de USB –stekker een “onbekend apparaat” in de Hardware Manager? 
•  Is in Opties->IDE->Interfaces de juiste communicatiepoort  ingesteld? 
•  Wordt er een Windowsversie van voor Windows 98 SE (“Second Edition”) gebruikt? De 
USB drivers van Microsoft functioneren pas vanaf Win98SE betrouwbaar met USB 
apparatuur. 
•  Worden de poorten Mega32: B.4-B.7, A.6-A.7 resp. Mega128: B.0-B.4, E.5 per ongeluk 
in de software gebruikt? (Zie pintoewijzing van Mega32 en Mega128). Zijn de jumpers op 
het Application board bij deze poorten ook gezet?  
•  Een signaal op M32:PortD.2 M128:PortE.4 (SW1) activeert bij het starten de seriële 
Bootloader. 
•  (alleen Mega128) Is misschien Port.G4 (LED2) bij de Reset op low? Zie SPI 
uitschakeling in hoofdstuk "Firmware". 
2.  De seriële interface geeft geen tekens af of ontvangt geen tekens. 
•  Worden de poorten D.0-D.1 per ongeluk in de software gebruikt? (Zie pintoewijzing van 
Mega32 en Mega128). Zijn de jumpers op het Application board bij deze poorten ook 
gezet? 
3.  Het Application Board reageert niet op commando”s als het serieel aangesloten is. 
•  Om de bootloader in de seriële modus te krijgen moet bij het inschakelen van het 
Application Board de toets SW1 ingedrukt worden. (Let op de jumpers voor SW1). Voor 
de seriële modus kan M32:PortD.2 Mega128: PortE.4 (SW1) ook vast op GND gelegd 
worden. 
4.  De hardware applicatie start niet automatisch (autostart functie
) 
•  Een signaal op de SPI interface tijdens het starten kan de USB- communicatie activeren 
•  Een signaal op M32:PortD.2 M128:PortE.4 (SW1) bij het starten activeert de seriële 
Bootloader. 
5.  De toetsbezetting van de editor “xyz” is ingesteld, maar sommige toetsenbord-
commando”s functioneren niet. 
•  De mogelijkheid om de toetsbezetting van een bepaalde editor in de IDE in te schakelen 
is slechts een benadering. Soms kost het te veel moeite de desbetreffende functies van 
de “vreemde” editor te ondersteunen, een andere keer kunnen toetsenbordcommando’s 
met de Keybord Shortcuts in de IDE botsen. 
6.  De spellingcontrole functioneert niet. 
•  Is de spellingcontrole in Opties->Editor ingeschakeld? 
•  De spellingcontrole toont alleen schrijffouten in de commentaren. Het controleren van 
andere bereiken zou zinloos zijn. 

190 
7.  Waar wordt bepaald of het nieuwe project een BASIC of een C project is? 
Er wordt geen verschil gemaakt in het type project. De brontekst- bestanden in een project 
bepalen welke programmeertaal gebruikt wordt. Bestanden met de extentie *.cc lopen in een 
nieuwe context, bestanden met de extentie *.cbas worden met BASIC vertaald. Eveneen kan 
een project ook gemengd zijn met C en BASIC. 
8.  Ik gebruik een andere LC-display dan de meegeleverde maar met dezelfde 
controller. De cursorpositie functioneert niet juist. 
•  De controller kan 4 regels met 32 teken weergeven. Het begin van een regel is in het 
geheugen volgens het volgende schema: 
Waarde van pos  Positie op het display 
    0x00-0x1f  0 – 31 in de 1
e
 regel 
    0x40-0x5f  0 – 31 in de 2
e
 regel 
    0x20-0x3f  0 – 31 in de 3
e
 regel 
    0x60-0x6f  0 – 31 in de 4
e
 regel 
9.  Ik heb onder Optie->Compiler->Bibliotheek configuratie een nieuwe bibliotheek 
ingevoerd, echter wordt deze niet door het actuele project gebruikt. 
•  Deze instelling verandert alleen de standaardinstelling voor nieuwe projecten. Reeds 
bestaande projecten moeten in de Projectopties->Bibliotheek configuratie gewijzigd 
worden. 
10.  Waar vindt ik op het Mega128 Application board de 2
e
 seriële interface? 
•  Zie J4 in hoofdstuk Jumper Application board M128.