Voor twee soorten micro-controllers Door Hans Lugtigheid Avr versie
VOORWOORD Ik heb gehoord dat er op internet een BASCOM cursus is te vinden, en omdat er kortgeleden een workshop over was op de newbrain gg heb ik het op mij genomen om een presentatie te maken. Er werd mij verzocht die cursus te als leidraad te nemen en er niet te diep op in te gaan, maar dat is niet gelukt. IK zal beginnen met een inleiding, ik zal dan vertellen over microcontrollers en micro-processors, en hoe U die dingen kunt toepassen. Ik zal ook de statements behandelen voordat ze gebruikt worden. Ik zal ook het interfacen behandelen dat is de tussenschakeling. We gebruiken dit om andere apparaten aan/uit te schakelen. Veel plaatjes zijn geleend uit een CONRAD catalogus, dus als U deze dingen nodig heeft, ga dan eens langs (bij Conrad).
De spanning De eigenlijke naam is spannings verschil en hiermee bedoelen we een electronendruk verschil, het lijkt wel wat op een luchtband daar is de spanning op de band, het verschil tussen de druk in de band en de druk erbuiten. En zo wordt het dan gemeten, en de spanning drukken we uit in VOLT.
De stroomsterkte Hiermee bedoelen we eigenlijk de mate waarin de elektronendrukverschillen worden verminderd.
En zo wordt het gemeten, de stroomsterkte wordt uitgedrukt in AMPERE. Net zoals luchtdrukverschillen wind kunnen veroorzaken, zo kunnen elektronendrukverschillen elektrische stroom veroorzaken. Er is nog iets vreemds, elektrische stroom veroorzaakt een magnetisch veld, en het omgekeerde blijkt ook te kloppen !!! Magnetische veldveranderingen wekken in een spoel een spanning op !!!
De WEERSTAND Weerstand wordt uitgedrukt in Ohm, en ze bedoelen ermee de mate waarin weerstand wordt geboden aan de doorgang van elektrische stroom. Het wordt uitgedrukt in Ohm Zo wordt het gemeten, en om U een idee te geven wat er wordt be doe l d, “ t us s e ndeb ome nwa a i t he tmi nde rha r d” .
VERMOGEN Hiermee wordt het elektronendrukverschil vermenigvuldigt met de stroomsterkte. Het aantal electronen dat toegevoegd moet worden om een bepaald electronendrukverschil in stand te houden Vermogen wordt gemeten in WAT en het is het product van de spanning en de stroom. Denk eraan: niet benut vermogen gaat verloren.
energie Energie is het vermogen gedurende een bepaalde tijd
Nadat U set-up heeft uitgevoerd moet U nog de juiste programmer selecteren en het adres. Het adres kunt U vinden in het configuratiescherm => systeem=>poorten (COM & LPT )=>ECP Printerpoort=> Bronnen of als U een seriële programmer heeft dan moet U bij de COM poort kijken
Wat is digitaal???? Digitaal is alles waarin we twee duidelijk verschillende toestanden kunnen waarnemen. B.v. een kaars is aan of uit, een lamp is aan of ui te n z …a l se rb e l a ngs t e l l i ngvoo ri sda nka ni kn oge e nbe g i n ners presentatie geven over digitale techniek. Analoge signalen kunnen waarden aannemen tussen 0 en 100%, terwijl bij digitale signalen alles onder 30% een 0 is en alles boven 70% een 1. Het gebied tussen 30% en 70% is niet gedefinieerd en moet vermeden worden. Nu zult U zeggen tussen 0 en 100% waarvan??? Van de voedingsspanning!!! Want elektronische schakelingen hebben voedingsspanning nodig om te kunnen werken.
Dit is een overzicht van vaak gebruikte logische bouwstenen, de zg poorten en de bijbehorende waarheidstabel. De waarheidstabel beschrijft de uitgangstoestand bij alle ingangscombinaties.
Een TTL NAND poort Dit is een vereenvoudigt schema van een poort, uitgevoerd in TTL. Als beide logic ingangen hoog zijn (en enable ) dan geleidt Q2. Q2 levert de stuurstroom voor Q5. Q3 staat gesperd, hij geleidt niet. Q5 trekt de uitgang laag
De and poort Met hulp van een simulatie programma kan men veel verduidelijken.
00 = 00000000
10 = 00001010
20 = 00010100
01 = 00000001
11 = 00001011
21 = 00010101
02 = 00000010
12 = 00001100
22 = 00010110
03 = 00000011
13 = 00001101
23 = 00010111
04 = 00000100
14 = 00001110
24 = 00011000
05 = 00000101
15 = 00001111
25 = 00011001
06 = 00000110
16 = 00010000
26 = 00011010
07 = 00000111
17 = 00010001
27 = 00011011
08 = 00001000
18 = 00010010
28 = 00011100
09 = 00001001
19 = 00010011
29 = 00011101
Deze bestaan uit wat registers, wat tellers en een ALU. Er is een speciaal register, genaamd Program counter, dat bijhoudt waar de processor is. En dan zijn er ook wat vlaggenstokken, waar vlaggen in gehesen kunnen worden. Bij bv 1 onthouden wordt een vlag gehesen, (een bit geset) en bij 0 als resultaat een andere.
0
C
N
V
I
Vroeger, toen men computers uit losse I C’ sopbouwde, toen was er een vooruitgang waardoor men het centrale processorgedeelte in een IC kon onderbrengen. Men noemde dit een micro-processor. Deze micro-processor had nog wel geheugen en I/O nodig om te kunnen functioneren, maar het was een hele vooruitgang. Omdat het mogelijk was steeds meer op een chip te proppen ging men twee kanten uit n.l. meer functies op een chip (pentium) of meer componenten op een chip (AVR). Deze presentatie is gericht op micro-controllers, waarbij naast de CPU, het geheugen en de I/O op de chip is gepropt. Natuurlijk is het allemaal wat minder, maar voor eenvoudige besturingen is dat geen bezwaar.
Dit is een 4 bi t ’ sALU, en men zou er een rekenmachine mee kunnen bouwen. Er zal dan nog wat bij moeten, maar zo wordt het ongeveer gedaan. Er is een control-buse n24bi t ’ s ingangsbussen en een 4 bi t ’ s uigangsbus. Flags zijn er ook.
De uP zet een adres op de adresbus en de handeling op de besturingsbus en bij schrijven de data op de databus en na de toegangstijd is de data in het geheugen. Bij lezen is na de toegangstijd de data op de databus geldig. De breedte van de databus bepaald of men met een 8 bi t ’ s , een 16 bi t ’ s , een 32 bi t ’ sof een 64 bi t ’ ssysteem te maken heeft.
Adres decodering Hierbij verdeelt men de beschikbare adresruimte in een deel voor RAM, een deel voor ROM en een deel voor I/O. Er zijn ook enable ingangen op het IC, voor als er nog voorwaarden zijn. Dit IC gebruik ik voor het opwekken van de !CS (CS=0) Op G1 sluit ik het E (enable) signaal aan. G2 wordt met GND verbonden
MICRO-CONTROLLERS Dit is een kleine micro-processor, met ingebakken geheugen en I/O. Er zijn dan geen aansluitingen nodig om het geheugen aan te sturen zodat de aansluitingen gebruikt kunnen worden voor I/O, input en output. Maar let op!!! Dit is een digitaal onderdeel en het verwacht digitaal aangestuurd te worden, ik bedoel daarmee dat het aan de ingang een spanning van 0V of 5V verwacht. Aan de uitgang leveren ze ook 0V of 5V. Het geheugen kan men vergelijken met een lange weg, met allemaal dezelfde huizen, en dan kijkt men achter welk venster licht brand. Men heeft dan een geheugenadres bezocht en gekeken welke bi t ’ s waren geset.
De micro-controller verwacht in het geheugen een opeenvolgende reeks instructies te vinden, in machine-code. Deze machine-code is voor mensen lastig om mee te werken, zodat men een afkorting van de instructie maakte, de mnemonics, zodat men zich minder vergiste. Maar er zijn ook hogere programmeer talen, zoals BASCOM, die het mogelijk maken om het programma op een begrijpelijker manier te realiseren. Deze presentatie gaat over BASCOM en hoe U het moet aanpakken om er iets nuttigs mee te doen. Er zijn twee soorten BASCOM, voor de 8051 en voor de AVR. Deze twee soorten zijn onderling niet uitwisselbaar, de 8051 heeft een andere instructie set, de machine-code is anders en de RESET ook.
Inwendig geheugen ROM
Micro-controllers hebben, door het ontbreken van externe bus aansluitingen intern ROM en RAM geheugen. De ROM is voor het programma en literals, terwijl de RAM voor het werkgeheugen is. U moet dan denken aan de stack en aan variabelen.
RAM var Ld a,var
A
B
C
D
Vaak bevat de micro-controller minder poorten, en soms meer en ze hebben ook vaak andere namen. Hieronder staat een deel van een micro-controller programma dat ik geschreven heb voor iets met lichtslangen Het programma is geschreven in BASCOM, en het werkt voortreffelijk.
Het zijn gewoon wat registers, op een speciale manier verbonden. Er is een oscillator die een klok-signaal opwekt en dit kloksignaal wordt gebruikt om het geheel te synchroniseren. Er is ook een Program Counter waarin wordt bijgehouden waar de processor is.
Eigenschappen 8515
Er is dus een 8 bi t ’ s - en een 16 b i t ’ stimer, een analoge comparator, een UART (voor seriële communicatie ) en een SPI interface
8515 overzicht Dit is de structuur van een 8515, alles is verbonden met de databus, behalve de uitgang van het programma geheugen. Dit wordt geleid naar het IR, het instructie-register en de instructie-decodering. Deze instructie-decodering zorgt voor de besturing van de besturingslijnen.
Een register-bank met 32 8-bi t ’ s registers, verbonden met de ALU. De ALU is het rekengedeelte van de processor. Er is ook nog 128 byte data RAM, voor de variabelen en stack. En dan is er ook 128 byte EEPROM voor constanten
8515 UNI T’ s Dit is de structuur van een 8515 uC. De bouwstenen zijn duidelijk te herkennen. Dit is de grote broer van de 2313, met meer geheugen.
8515 memorymap Dit is de memorymap van de 8515, de 4414 is wat minder. Dit is de indeling van het geheugen, het programma geheugen is 16 bi t ’ sbreed en volledig gescheiden van het data geheugen.
De SRAM De SRAM is datageheugen, het houd de data vast totdat de voedingsspanning wordt uitgeschakeld.
De EEPROM is bedoeld voor constanten en literals, d.w.z. data die maar heel weinig veranderd. Deze data blijft ook als de voedingsspanning wordt uitgeschakeld in het geheugen. Deze data kan elektrisch worden gewist, vandaar de naam
De bijbehorende statement zijn: READEEPROM WRITEEEPROM Zoals in de helpfiles is te lezen.
De eeprom De eeprom wordt gebruikt als geheugen, dat eventueel nog te wijzigen is. U moet hierbij denken aan constanten en data. De geheugeninhoud is elektrisch te veranderen, vandaar die ee, maar dit is niet voor vaak veranderende data.
Het Programma-geheugen Het programma-geheugen is een rij van 1024 opeenvolgende geheugenplaatsen, e ni e de r ege he uge np l a a t si s16bi t ’ s breed. De processor verwacht in het programma-geheugen een opeenvolgende reeks instructies te vinden
De ALU en de registers De ALU is de rekenkundige en logische unit, die de rekenkundige en logische taken uitvoert. Vroeger was de accumulator de bron en de bestemming van de ALU, maar de accumulator is vervangen door een registerbank van 32 registers en ieder register kan optreden als bron en/of bestemming van de ALU. Na een rekenkundige bewerking in de ALU worden flags (vlaggen) geset in het status-register,
De micro-controller
Dit is een kleine micro-computer op een chip, doordat de ROM en de RAM en de I/O op de chip geïntegreerd zijn, zijn er minder aansluitingen nodig Er is vaak alleen voedingsspanning en een kristal nodig om een werkend geheel te maken. Voor kleine toepassingen is vaak een kleine microc ont r ol l e rme te e n8b i t ’ sda t a busvol doe nd e . He ti sr a a dz a a momook te zorgen voor een goede RESET, want dat is vaak de oorzaak van een slecht functionerende computer. (stoorpulsen op de RESET belemmeren een goede werking) Micro-controllers kunnen ook interrupts verwerken, de processor zet dan het adres van de volgende instructie op de stack en haalt de interruptvector binnen en springt naar de interrupt handler. Na afloop wordt het adres van de volgende instructie van de stack gehaald en in de Program Counter geladen
De condensator C dient om stoorpieken te onderdrukken. De MCU wil dan telkens opnieuw beginnen (10nF is een goede waarde).
Print (1)
PRINT (2)
Zo kan het er dus uitzien, het hoeft niet, maar het kan, U kunt natuurlijk ook kiezen voor een IC in een andere behuizing
De klok verzorgd de timing, dit is heel belangrijk want dan begint een volgende cycle.
DECOUPLING
Gewoonlijk is dit voldoende voor een stabiele werking. Het is bedoeld als tijdelijke buffer om stroomstoten op te vangen.
Dit is een waakhond, als de waaktijd verstrijkt zonder watchdogreset dan volgt een reset.
Een waakhond Een watchdog is een waakhond, die als je hem niet tijdig reset, na een bepaalde tijd een interrupt geeft. Deze worden ingezet tegen vastlopende code. Er is dan geen watchdog-reset, de code blijft dan hangen door een programma-lus of een buffer-overflow
Gereserveerde woorden $BAUD,$CRYSTAL,$DATA,$DEFAULT,$END,$EEPROM,$EXTERNAL,$INCLUDE,$LCD,$LC DRS,$LCDPUTCTRL,$LCDPUTDATA,$LIB,$REGFILE,$SERIALINPUT,$SERIALINPUT2LCD,$ SERIALOUTPUT,$WAITSTATE,$XRAMSIZE,$XRAMSTART,1WRESET,1WREAD,1WWRITE, ACK,ABS(),ALIAS,AND,AS,ASC(),AT,BAUD,BCD(),BIT,BITWAIT,BLINK,BOOLEAN,BYTE,B YVAL,CALL,CAPTURE1,CASE,CHR(),CLS,CLOSE,COMPARE1A,COMPARE1B,CONFIG,CON ST,COUNTER,COUNTER0,COUNTER1,COUNTER2,CPEEK(),CPEEKH(),CRYSTAL,CURSOR,D ATA,DATE$,DEBOUNCE,DECR,DECLARE,DEFBIT,DEFBYTE,DEFLNG,DEFWORD,DEGSNG, DEFLCDCHAR,DEFINT,DEFWORD,DELAY,DIM,DISABLE,DISPLAY,DO,DOWNTO,ELSE,ELS EIF,ENABLE,END,ERAM,ERASE,ERR,EXIT,EXTERNAL,FOR,FOURTH,FOURTHLINE,FUNCT ION,GATE,GETAD(),GETRC5(),GOSUB,GOTO,HEXVAL(),HIGH(),HOME,I2CRECEIVE,I2CSE ND,I2CSTART,I2CSTOP,I2CRBYTE,I2CWBYTE,IDLE,IF,INCR,INKEY,INP(),INPUT,INPUTBIN, INPUTHEX,INT0,INT1,INTEGER,INTERNAL,INSTR,IS,LCASE(),LCD,LEFT,LEFT(),LEN(),LOA D,LOCAL,LOCATE,LONG,LOOKUP(),LOOKUPSTR(),LOOP,LTRIM(),LOW(),LOWER,LOWER LINE,MAKEBCD(),MAKEDEC(),MAKEINT(),MID(),MOD,MODE,NACK,NEXT,NOBLINK,NOS AVE,NOT,OFF,ON,OR,OUT,OUTPUT,PEEK(),POKE,PORTA,PORTB,PORTC,PORTD,PORTE,PO RTF,POWERDOWN,PRINT,PRINTBIN,PULSEOUT,PWM1A,PWM1B,READ,READEEPROM,RE M,RESET,RESTORE,RETURN,RIGHT,RIGHT(),ROTATE,RTRIM(),SELECT,SERIAL,SET,SHIFT ,SHIFTLCD,SHIFTCURSOR,SHIFTIN,SHIFTOUT,SOUND,SPACE(),SPIINIT,SPIIN,SPIMOVE,SP IOUT,START,STEP,STR(),STRING(),STOP,STOP,TIMER,SUB,SWAP,THEN,TIME$,THIRD,THI RDLINE,TIMER0,TIMER1,TIMER2,TO,TRIM(),UCASE(),UNTIL,UPPER,UPPERLINE,VAL(),VA RPTR(),WAIT,WAITKEY(),WAITMS,WAITUS,WATCHDOG,WRITEEEPROM,WEND,WHILE,W ORD,XOR,XRAM
SFR
special function register
RAM
DATA geheugen (voor tussenresultaten en de stack)
EEPROM
geheugen voor constanten
ROM
programma-geheugen
RESET
opnieuw starten b.v. als de computer blijft hangen
mS
miliseconde (1/1000 Sec.)
uS
microseconde (1/1 000 000 Sec.)
Hiermee worden de soorten data bedoelt die door de processor verwerkt kunnen worden. • BIT
hiermee wordt een enkele geheugencel bedoeld en deze kan de waarden 0 of 1 aannemen.
• BYTE
hiermee wordt een groep van 8 bi t ’ sbedoeld en deze hebben hetzelfde geheugenadres. Er kan ook een kleine waarde (max 255) in opgeslagen worden.
• INTEGER
hiermee wordt een groep van 2 bytes bedoeld en er kan een getal tussen –32 768 en +32 767 in opgeslagen worden.
• WORD
hiermee wordt ook een groep van 2 bytes bedoeld maar nu wordt het geïnterpreteerd als een getal tussen 0 en 65535
Data t ype ’ svervolg *LONG
hiermee wordt een data type bedoeld dat bestaat uit een groep van 4 bytes, dus tussen -2147483648 en 2147483647.
*SINGLE
hiermee wordt een floating point nummer bedoeld.
*STRING
hiermee wordt een reeks lettertekens (tot 254) bedoeld Deze reeks wordt afgesloten met een NULL character en is bedoeld voor communicatie met de gebruiker.
Bij dit vereenvoudigde Processor model is er een Program Counter (waarin de processor bijhoudt waar hij is), een data pointer ( die wijst naar de data) en een accumulator. Meestal is de accumulator de bron en de bestemming van de data (alles wat elektronisch wordt verwerkt noemen we data). We kunnen direct met de accumulator werken of via de data-pointer, dit laatste is veel flexibeler omdat we de pointer naar iets anders kunnen laten wijzen. Na een RESET staat de Program Counter op 0, en na iedere instructie wordt hij met 1 verhoogd.
Rekenkundige operatoren Deze zijn er ook, in BASCOM, en ze hebben betrekking op rekenkundige bewerkingen.
+
optellen
2+4
-
aftrekken
4-2
*
vermenigvuldigen
2*4
\
delen van integers met integer result
5\2
MOD rest van integer deling
5 MOD 2
/
delen van s i ngl e ’ s
a/b
^
machtsverheffen
a^2
Logische operatoren
NOT 0 1 1 0
A 0 0 1 1
B 0 1 0 1
AND 0 0 0 1
OR XOR 0 0 1 1 1 1 1 0
Hier kan U zien wat het resultaat is van de bewerking, A en B zijn de te bewerken data.
Debounce mechanische contacten willen vaak een beetje stuiteren en daarom is dit statement,het wacht even totdat het stuiteren is afgelopen. Portx
om een poort als ingang of uitgang te configureren
Pinx.y
om een enkele pin als ingang of uitgang te configureren.
Er zijn nog andere mogelijkheden maar daarvoor verwijs ik graag naar de helpfiles.
Demo programma Dit is een heel eenvoudig programma, het bestaat uit een kleine loop die in 2 uS wordt doorlopen. Het schrijft waarden naar een uitgangspoort.
Portb.1 => 0/2
Portb.0 => 0/1
Dit zijn benoemde geheugenplaatsen, het is een alias voor een geheugen-adres en het type van de variabele bepaald hoeveel geheugen gereserveerd wordt. Dim Tmp As Byte Dit is een voorbeeld van het declareren van variabelen
Een label is een alias voor een adres, de plaats waar een procedure of een subroutine begint. In plaats van het adres van een subroutine gebruikt men het label, Serhand: is de interrupt handler van de seriele interrupt, het label eindigt in een dubbele punt. Comphand: is de interrupt handler van de comparator-interrupt, bij dit programma wordt de interrupt gebruikt om bij te houden hoeveel personen passeren. $sim => Simulator versie, hierdoor worden wait instructies overgeslagen
Bij computers zoekt men vaak naar een herhalingsstructuur. We hebben daarvoor: • Do….Loop
onbepaalde lus
• For…. Next
als we weten hoe vaak de lus moet worden doorlopen.
• While…. we nd
voorwaardelijke lus, als de conditie na while waar is, dan wordt de loop doorlopen.
Wait (aant seconden) Dit statement wacht een aantal seconden. Varianten: * WAITMS (1-255)
wacht aantal miliseconden
* WAITUS (1-255)
(const geen variable)
* DELAY
wacht 1mS
De timing kan door interrupts verlengd worden.
Dit wordt gebruikt voor een ingebouwde vertraging. En soms bestaat deze vertraging uit een vast en een variabel deel. Bv wait a+6
U zou wel eens een programma willen maken dat wat lampen bestuurt. We beginnen dan met het bepalen van de stuurlijnen, hier d2 t/m d5. We willen ook dat het programma zichzelf eindeloos herhaalt, dus kiezen we voor een do-loop. We schakelen de lijnen bitgewijs, eerst portd.2 (bit 2) enz. als we de bits veranderd hebben dan volgt een wait instructie, die wacht een seconde. Portd.3 gaat dan ook aan, waarna weer een seconde wordt gewacht. Portd.4 gaat dan ook aan waarna weer een seconde wordt gewacht. Daarna gaan portd.2 t/m portd.4 uit en gaat portd.5 aan, waarna twee seconden wordt gewacht, en de loop zichzelf herhaalt.
Programma 1a Dit is een manier om het programma te schrijven, dit heet lineair programmeren. Hierbij wordt iedere stap na elkaar beschreven en uitgevoerd. Bij deze versie worden de individuele bi t ’ s van de uitgang geset (1) of gereset (0). De wait instructie wacht 1 of 2 seconden afhankelijk van de parameter ( het argument van een functie-aanroep (wait) noemen we parameter).
I F….THEN….ELSE Dit is een belangrijk statement, het maakt het mogelijk om het verloop van het programma te veranderen. Deze veranderingen in het verloop van het programma kunnen bv afhankelijk zijn van de inhoud van een register. Indien de conditie (achter if) waar is dan worden de statements achter THEN uitgevoerd totdat ELSE of ENDIF wordt bereikt. Als de conditie niet waar is dan worden de statements achter ELSE uitgevoerd, of als er geen ELSE is dan achter ENDIF. IF a=10 THEN print a ENDIF
IF a<10 THEN pr i n t“ t ewe i n i g ” ELSE pr i n t“ go e d” ENDIF
Relationele operatoren Deze zijn er ook in BASCOM en ze worden vooral in IF statements gebruikt. Operator Relation Tested
Expression
=
Equality
X=Y
gelijk
<>
Inequality
X <> Y
niet gelijk
<
Less than
X
lager dan
>
Greater than
X>Y
groter dan
<=
Less than or equal to
X <= Y
lager of gelijk
>=
Greater than or equal to
X >= Y
groter of gelijk
Deze relaties kunnen waar of niet waar zijn.
Dit programma is op een andere manier gerealiseerd, met data waarden. De reeks datawaarden eindigt met een nul, dit heet centinel (terminal value). Het programma begint met het instellen van de datapointer, waarna gekeken wordt of het de centinel is. Als het de centinel is dan wordt de datapointer hersteld zodat hij weer naar het eerste databyte wijst. De databyte wordt dan naar de uitgangsbuffer van poort d gestuurd waarbij de gewenste aansturing plaatsvindt.
Hier heb ik het programma verduidelijkt, de programma-structuur is nu duidelijker. Lop1 is een label en het hangt aan een datareeks, en die datareeks eindigt met een nul.
De instructie Read leest de data van Lop1 in de variable Tmp, een waarde per keer.
Print is om data naar de seriële poort te sturen, en als men de argumenten scheidt met een punt-komma dan gaat het programma op dezelfde regel verder. Men kan met dit statement gebruiken voor communicatie met de gebruiker. Men kan het ook gebruiken in de simulator, zoals op onderstaande foto te zien is.
De simulator is een hulpmiddel om het programma te ontwikkelen. U kunt dan het verloop van het programma volgen en breakpoints invoegen. Het programma stopt daar dan en het blauwe pijltje wijst naar de volgende instructie.
Liquid Cristal Display Dit moet eerst gecleard worden, met cls en dan wordt het scherm leeg. Men gebruikt het om text op een schermpje te zetten, bv LCD“ O. K. ” .Di twe r ktooki ndes i mul a t or dus kan men de werking van het programma volgen.
Hier kunnen we duidelijk zien dat het lezen van, en schrijven naar een adres via de databus gaat. Dit adres wordt gedecodeerd en gebruikt als enable-signaal . Als parameter kan men natuurlijk ook de naam van een register opgeven.
Ander Processor model Bij dit processor model is er ook een stackpointer. deze stackpointer wijst naar een stukje vrij geheugen dat de processor kan gebruiken als kladblok. Dit is een last in, first out data structuur Een stackpointer is een wijzer naar een stack. Denk aan een stapel CD’ s , een CD erbij plaatst die CD op de top van de stapel. een CD van de stapel halen gebeurt ook met de bovenste CD. Zo gaat het ook in computers, een geheugenadres op de stack zetten plaatst het geheugenadres op de top van de stack. Een geheugenadres van de stack halen heeft ook betrekking op de top van de stack. Men moet er dus rekening mee houden dat de stack kan groeien (naar beneden).
Een queue is een wachtrij, zoals bij een winkel, men wacht net zolang totdat men aan de beurt is. Nieuwe klanten moeten achteraan aansluiten. Dit is een first in, first out data structuur
[BYREF/BYVAL] Deze termen bent U vast wel eens tegengekomen en ik zal ze hier uitleggen. Als U ze tegenkomt in een subroutine aanroep of in een procedure aanroep dan betekend BYVAL dat een kopie van de waarde als argument (de z.g. parameter) gegeven is. U kunt de waarde eventueel veranderen maar dan geld die verandering alleen binnen de subroutine of procedure. Als U BYREF tegenkomt dan wordt het adres van de eigenlijke variabele als parameter meegeleverd, veranderingen hebben dan direct invloed op de variabele.
DECLARE SUB TEST[( [BYREF/BYVAL] var as type)] Sub-r out i ne ’ svoeren taken uit die meerdere malen moeten worden uitgevoerd, in plaats van meerdere malen dezelfde code te schrijven roept U dan de sub-routine aan. De processor plaatst dan het adres van de volgende instructie op de stack en springt naar het adres van de sub-routine. Aan het einde van die sub-routine is er een return instructie die het adres van de volgende instructie van de stack haalt. Volgende adres
Volgende adres
Subroutine Doe iets nuttigs stack
return
stack
Er is een groot verschil tussen s ubr out i ne ’ sen functies, functies retourneren een waarde, zoals uit de declaratie blijkt. DECLARE FUNCTION TEST[( [BYREF/BYVAL] var as type)] As type
Voor de rest is het wel vergelijkbaar. Tus s e nde$ ASM…$ENDASM ka nme nassembly instructies invoegen, dit is soms wat sneller en veel flexibeler.
RND
random nummer
Deze functie is er ook, al is hij meer bedoeld voor spelletjes. Hij retourneert een willekeurig getal, of een benadering ervan. Natuurlijk is het niet nuttig, maar als U wilt plagen is het wel leuk. Bv als etagenummer in een lift, of met lookupstr() voor foutmeldingen.
Hiervoor hebben we het Select case statement SELECT CASE var CASE test1 : statements [CASE test2 : statements ] CASE ELSE : statements END SELECT
voorbeeld Dim a as bit BITWAIT a , SET
'wait until bit a is set
BITWAIT PORTB.7, RESET
'wait until bit 7 of Port B is 0.
End
Dit statement wacht totdat een bit is geset(1) of gereset(0).
bitwait Het programma bestaat uit een do loop, en het eerste statement clears de LCD, dan komt de bitwait en die kijkt of pin poortA.7=0 en zolang die poort niet 0 is dan gaat het programma niet verder.
bitwait Hier is wederom het bitwait statement, en het is in een loop die eerst het LCD scherm schoonmaakt en dan een bitwait statement, maar nu is PA.7=0 en de loop gaat direct verder en het plaatst de text “ e i nde l i j kreset”op het LCD scherm.
bitwait Erz ul l e nva s twe lme ns e nz i j nd i ede nke n“ da a rka ni k e e nl e ukea l a r mi ns t a l l a t i eme ema ke n” ,ma a rda ti sni e t aan te raden. U moet dit eerst heel grondig uitwerken, en er veel mee experimenteren omdat het geheel wel eens onstabiel zou kunnen wezen.
Getkbd() Dit statement is bedoeld voor het aansluiten van een hexadecimaal toetsenbord. Als men het nodig vind om een hexadecimaal toetsenbord te gebruiken dan kan dat zonder bezwaar. De ontwikkelaar van BASCOM heeft dat al voor ons uitgezocht. Het is heel verbazingwekkend, ik heb ook eens zoiets gebouwd voor aan de centronics poort van een Z80 machine.
GETATKB() Als men een ATtoetsenboard aan een microcontroller wilt hangen, dan kan men dit statement gebruiken De helpfiles zijn er heel duidelijk over. Ook over het gebruik van een look-up table.
lookup Dit is een statement voor de conversie van waarden of data, men kan hiermee eenvoudig compenseren voor niet lineair gedrag van schakelingen of onderdelen. Code-conversie is ook gemakkelijk te bereiken met dit statement. Numdata: Data 1,4,7,5,8,9,4 Afhankelijk van de index wordt een waarde geretourneerd.
LOOKUPSTR
Afhankelijk van de index wordt een string geretourneerd, de index begint bij 0. strData: Da t a“ on j u i s t ei nvo e r ” , ” ve r ke e r d ed a t a ” , ” kor t s l u i t i ng ” , ” v e r k e e r d e pr ogr a mme ur ” , ” wa t e ri npr oc e s s or ” , ” e i nd e l i j k ” , ” e rz i j nelectronen ont s na p t ” , ” Pr ogr a mCount e rove r f l o w” , ” pr i n t s p ooronde r br e ki ng ” , “ deda t a bushe e f te e nl e k keba nd” , ” ? ? ? ? ” , ” l e kke ndge he uge n ”
shift Het naar links of naar rechts schuiven van de binaire inhoud van een variabele.
Varianten:
omschrijving
Shiftin
onder invloed van een klokpuls invoeren
Shiftout
onder invloed van een klokpuls verzenden
Bij twijfel: kijk in de help-files
Serial Programming Interface Sommige typen uit de AVR reeks hebben een SPI module, en anders kan het softwarematig worden nagebootst. Deze interface is sneller dan de RS232C standaard. * config SPI
hardware/ software
* SPIinit
initiëren van de SPI
* SPIin
het lezen van de SPI data
* SPIout
het verzenden van SPI data
* SPImove
het lezen en schrijven van SPI data
Bij twijfel: raadpleeg de helpfiles. MOSI= master out, slave in
MISO=master in, slave out
Het kan nodig zijn om de voedingsspanning te verlagen omdat niet alle AVR’ sbij 5V zijn te programmeren.
De Inter Ic Communicatie
Syntax I2CRECEIVE slave, var I2CRECEIVE slave, var ,b2W, b2R I2CSEND slave, var I2CSEND slave, var , bytes
Dit is een langzame bus, die maar 1 processorpin nodig heeft. Het is daardoor mogelijk om de reeks single wire drukknoppen toe te passen. Er zijn statements zoals: *1WReset *1WWrite *1WRead *1WSearchFirst *1WSearchNext *1WireCount Bij twijfel in de help files kijken.
PULSE In BASCOM zijn er speciale statements om met pulsen te kunnen werken. PULSEOUT PORT , PIN , PERIOD PORT
naam van de poort, portB bv
PIN
variabele of constante met het pin nummer (0-7).
PERIOD het aantal prioden.
PULSEIN var , PINX , PIN , STATE var
een variabele waarin het resultaat wordt opgeslagen.
PINX
een PIN register zoals PIND
PIN
het pin nummer(0-7) to get the pulsetime of.
STATE May be 0 or 1.
0 Means sample 0 to 1 transition. 1 means sample 1 to 0 transition.
Magnetische kaartlezer BASCOM heeft een speciaal statement om magnetische kaarten uit te lezen.
SOUND pin, duration, pulses Pin
elke I/O pin, zoals portb.0
Duration
Het aantal pulsen.
Pulses
Het aantal uS dat de uitgang stabiel blijft, dit is de waarde voor een loop teller.
Denk vooral aan een beep
Dit statement is eigenlijk bedoeld om de stand van een potentiometer, een variabele weerstand dus, te bepalen. Men kan er ook de waarde van weerstanden en condensatoren mee bepalen. Eigenlijk is dit een heel gemakkelijk statement, men kan er meetinstrumenten mee maken. Men kan ook de potentiometer vervangen door een LDR.
GETRC5 Het doel van dit statement is afstandbediening mogelijk te maken.
A/D conversie met de comparator
Men laad een condensator en men meet de tijd die verstrijkt totdat de comparator omklapt
GETADC(chan)
Dit statement is speciaal voor de 8535, een AVR met ingebouwde A/D converter.
Als U denkt dat U niet genoeg I/O poorten heeft dan kan U er altijd nog een 8255 tussen plaatsen. Dit is een oude techniek en het werd vaak gebruikt om het aantal I/O poorten te verhogen.
Maar daarom past U nou juist geen micro-controller toe!!!! Een grotere micro-controller is vaak een betere oplossing want doordat er teveel omheen hangt is het niet meer klein en goedkoop.
Denk erom, een 1 in het Data Direction Register (DDRA) schrijven configureert die databit als uitgang. PINA geeft de toestand van de datapinnen weer.
Denk erom, een 1 in het Data Direction Register (DDRB) schrijven configureert die databit als uitgang. PINA geeft de toestand van de datapinnen weer.
PB0 en PB1 zijn externe counter ingangen PB2 en PB3 zijn de ingangen van de analoge comparator PB4, PB5, PB6 en PB7 is de SPI interface
Denk erom, een 1 in het Data Direction Register (DDRC) schrijven configureert die databit als uitgang. PINA geeft de toestand van de datapinnen weer.
Denk erom, een 1 in het Data Direction Register (DDRD) schrijven configureert die databit als uitgang. PINA geeft de toestand van de datapinnen weer.
PD0 en PD1 zorgen voor de RS232 interface PD2 en PD3 zorgen voor EXTERNAL interrupt 0 en 1 PD5 signaleert dat timer/counter1 gelijk is aan compareA PD6 en PD7 geven de !WR en !RD signalen. m.b.v. een XOR kan men een Enable signaal maken.
Dit is het aansturen van allerhande dingen, zoals motoren enz. Voor kleine aantallen is het beter om meer hardware te gebruiken, terwijl voor grote aantallen een software- oplossing beter is.
En hoe doen we dat? Dat ligt eraan wat we willen gaan doen. Maar eerst wil ik de dingen die daarvoor gebruikt worden introduceren.
Dit zijn relais: om ze aan te schakelen hoeven we alleen de spoelspanning te leveren, de elektromagneet trekt aan, en dat wordt gebruikt om via een hefboompje, kontaktjes tegen elkaar te duwen, of van elkaar
DE WEERSTAND Een weerstand heeft maar 1 doel en dat is te zorgen dat er geen te grote stroom kan lopen. Soms wil men een bepaalde stroomsterkte en dan moet men die begrenzen met een serieweerstand. Hij biedt weerstand aan de elektrische stroom.
WET VAN OHM Deze wet geeft het verband tussen de spanning, de stroom en de weerstand aan.
DE CONDENSATOR Er zijn verschillende soorten condensatoren, en ze verzamelen allemaal elektriciteit. Een verschil in elektronenverdeling. Een belangrijke eigenschap van condensatoren is de hoeveelheid elektriciteit die ze kunnen bevatten en het is een kleine buffer die plotselinge schakel-pieken opvangt.
Wanneer men een serieschakeling van een weerstand en een condensator aansluit op een gelijkstroom dan wordt de condensator geladen. De laadstroom wordt begrensd door de serieweerstand, en hoe voller de condensator word des te minder wordt de laadstroom.
Het duurt 1RC tijd (R*C ) totdat 63% van de voedingsspanning is bereikt
uitleg We beginnen met te veronderstellen dat de condensator is ontladen en dat de serieschakeling is aangesloten op 5V Er vloeit dan een stroom U/R1, 5/150=33,3mA en als de condensatorspanning is gestegen tot 1V, dan vloeit er nog maar (5-1)/150=26,6mA. Bij een condensatorspanning van 2V vloeit er (5-2)/150=20mA en bij een condensatorspanning van 3V (5-3)/150=13,3mA
UxC=IxT
Dit zijn licht-afhankelijke weerstanden, de weerstandwaarde is afhankelijk van de hoeveelheid licht die erop valt.
Voor micro-controllers met ingebouwde comparator is dit wel eenvoudig toe te passen.
Soms moeten we teruggrijpen naar schakelaars bv om te kunnen bepalen of we ergens tegenaan zitten of dat we de juiste positie hebben bereikt. De contacten willen wel eens wat stuiteren zodat men ook daarop bedacht moet zijn + Pin GND
Het licht van een LED dat op een fototransistor valt. Er zijn ook typen die werken met het gereflecteerde licht.
I C’ s Dit is een voorbeeld van hoe U drivers gebruikt (ULN2803). Deze hebben meegebakken dioden (om de inductiespanning te dempen) U kunt deze driver gebruiken om kleine stappenmotoren, kleine motoren of relais aan te sturen. Maar wel met gelijkstroom
Deze schakeling van transistors heet een darlington, de eerste levert de stuurstroom voor de tweede
Hoe die reageert op Vgs, waar de drempel ligt enz. Enhi jkos te nke l ee ur o ’ se ni si de a alvoorPWM
Het solid-state relais Een door een infra-rood led bestuurde triac Sommige typen schakelen tijdens de nuldoorgang en veroorzaken daardoor heel weinig storing. Er zijn typen met ingebouwde nulspanningsschakelaar, deze zijn heel gemakkelijk toe te passen omdat er geen verdere storingsonderdrukkende maatregelen hoeven te worden genomen. Gewoon de schakelstroom leveren en hij gaat aan!!!!
En zo gaat dat dan Ondanks dat het wat lastig gaat is dit wel redelijk gelukt.
230V lichtslang aansturing
Ik heb 4 solid state relais toegepast omdat er vaak wordt geschakeld, en deze hebben geen bewegende contacten.
Denk eraan, lichtslang werkt per meter, het is een serie schakeling die 98 cm lang is
Maar het kan ook anders Links is een experimenteerboardje waarin men de onderdelen kan prikken. Men gebruikt deze dingen om de schakeling te ontwikkelen. Voor de constructie van de schakeling gebruikt men de onderstaande boardjes gaatjesboard, veroboard of fotoprint. Als men fotoprint gebruikt dan moet men een belichtingsmasker maken, (en afdrukken op overhead-folie) en de print belichten . Men kan ook gewone eurokaart kopen, zonder fotolaag, en men kan dan zelf een etsbestendige tekening erop aanbrengen.
De spanningsdeler R1 U1
R2
U2
Het blijkt dat de spanning U2 een gedeelte is van de spanning U1. De spanning U2 is evenredig met de weerstandswaarde verhouding.
U2= U1*R2/(R1+R2) Maar de inwendige weerstand is ook toegenomen, er kan minder stroom geleverd worden. Als men R1 vervangt door een LDR dan is U2 afhankelijk van de hoeveelheid licht.
DE COMPARATOR LDR
Deze wordt gebruikt om een analoog signaal te veranderen in een digitaal signaal. Als men de uitgangstoestand wilt weten dan kijkt U gewoon welke ingang hoger is, als de + ingang hoger is dan is de uitgang 1, en als de –ingang hoger is dan is de uitgang 0. Een comparator vergelijkt spanningen, dus ook de spanning tussen twee spanningsdelers.
In plaats van schakelaars kan men ook een micro-controller gebruiken. Ik heb nog een prototype voor aan een LPT poort.
Dit is een IC dat een klokpuls deelt totdat de juiste toon ontstaat. Het zijn gewoon programmeerbare delers (3), die de uitgang omschakelen. Da te re e nb l okgo l fui t k omti sni e tz o’ nbe z wa a r omdat in de erop volgende versterker er nog wel wat aan gedaan kan worden. I khe bnogs t e e dsz o’ nd i nga a ndecentronics poort van een CP/M computer hangen, met wat lampen. Ik zing er wel eens bij, en dat is mijn begeleiding. Tegenwoordig zijn er betere i c ’ sin de handel.
Een afstand-bediening
Zo gaat dat en men kan deze schakeling of delen ervan toepassen in andere applicaties.
Motor-sturing Hierbij geef je een puls, zodat de motor in beweging komt, en dan wacht je even, en geef je weer een puls. Het lijkt dan alsof je het toerental kan regelen, maar je regelt de vermogenstoevoer. Als men de polariteit van de voedingsspanning omdraait, dan loopt de motor de andere kant uit. Eigenlijk draait de motor ongecontroleerd rond, men kan er niets van zeggen. Voor de voortstuwing van bv een speelgoedbootje is dat geen enkel bezwaar, maar soms wil men bv een plotter maken.
Nog meer motorsturing
De 4041 is een goed ic om de L293D aan te sturen, er zijn daarin 4 buffers met gewone en geinverteerde uitgangen. In de L293D zitten de dioden op de chip.
PWM1, golfvorm Er is een verschil in timing tussen de puls en de pauze
Dit is de met pulsbreedte gestuurde voedingsspanning die de motor die mijn etsmachine aandrijft.
ETS-machine De aansturing is met de zojuist beschreven schakeling. Het geheel dient om mijn etsbad in beweging te houden, het printjes etsen gaat daardoor sneller. Men kan natuurlijk ook de herhalingsfrequentie regelen en daarvoor kan men ook een micro-controller gebruiken. Met een 555 timer gaat het ook, en dit is veel gemakkelijker. Bij hogere temperaturen verlopen chemische processen sneller.
Nuha dUva s twe lg e da c ht“ e nhoek a ni kz ep r o gr a mme r e n ? ” . Daar zijn diverse antwoorden op mogelijk, deze is serieel. Het kan nodig zijn de voedingsspanning te verlagen, want sommige exemplaren zijn bij 5V niet serieel te programmeren. Het programmeren gebeurt m.b.v. de SPI interface.
Dit is een parallel programmer Let op de 12V aan de RESET, dit is nodig om de gewenste veranderingen in de chip te maken.
SERVO Dit is een elektro-mechanisch onderdeel dat gebruikt wordt om iets te besturen. Het kan ook een deel van een regel-lus zijn.
stappenmotoren Een gewone elektromotor draait nauwelijks gecontroleerd rond, maar een stappenmotor maakt telkens kleine stapjes. Stappen tellen en in welke richting en dat bijhouden in een register. Je kan er plotters mee maken maar de kwaliteit van de inktjetprinters is zo groot dat je helemaal geen plotter nodig heb voor normale printjes
De stappenmotor (1) Dit is een principe-tekening om de werking te verduidelijken. De spoelen hebben een middenaftakking om de aansturing te vergemakkelijken. De rotor volgt het magnetisch veld
Een gewone elektromotor draait onbeheerst rond, de stappenmotor neemt telkens een beheerst stapje, hij volgt het magnetisch veld in de stator (het stilstaande gedeelte).
De stappenmotor (2)
De stappenmotor (3) Halve stap, meer vermogen, doordat twee spoelen zorgen voor de kracht. Maar de koppeling is niet optimaal.
De stappenmotor (4) Het verschil tussen bipolaire en unipolaire stappenmotoren is hier duidelijk te zien.
Dit kan ook diverse vormen aannemen, variërend van een jackplug voor een dikke stekker tot een kleine printtrafo. Men kan ook een kleine gelijkrichtbrug toepassen, die hebben hetzelfde effect, maar verhogen de inwendige weerstand.
Deze dingen zijn ook nog kortsluitvast!!
Voedingsspanning-stabilisator Dit zijn I C’ sdie van de ongestabiliseerde voedingsspanning een keurige 5V maken. Men moet er wel aan denken dat er kleine buffercondensatoren (10uF) naast geplaatst moeten worden. B.v. 7805,78L05 voor 5V
Trafo
Reg. diode elko diode
Het is niet moe i l i j komz o’ n voeding te maken, gewoon een kleine printtrafo met wat onderdelen in een hoekje van de print.
Aanvulling BASCOM
Om bepaalde aspecten te verduidelijken.
Destackpointer STACK (pointer) De stack is een kladblok, de processor bewaard hierin de terugkeer-adressen van de interrupts en sub-routines. Als er een interrupt gegeven wordt dan maakt de processor de huidige instructie af en slaat het adres van de volgende instructie op in de stack. Hij springt dan naar de interruptafhandelingsroutine, en gaat daar dan verder. Aan het eind van die routine is er een return instruktie, de processor kijkt dan op de stack voor het adres van de volgende instructie.
Interrupt systeem
Interrupt systeem De bovenste twee interrupt r out i ne ’ sgeven een toon, en de onderste interrupt routine geeft twee stuurpulsen.
De main loop De main loop is een loop die een instructie uitvoert, nl nop, no operation. Dat doet het telkens weer, in een eindeloze lus, want dit is om de werking van het interrupt-systeem te verduidelijken.
nogmaals
Dit is nogmaals de main loop, single stepping door de loop, maar omdat de loop uit deze instructies bestaat, daarom zijn er geen verdere bijzonderheden.
De interrupt int0
Single steppen door interrupt
Int 0 Dit is de hele interrupt routine, er wordt een geluid gemaakt, en dat is voldoende. De parameters zouden eventueel nog aangepast moeten worden.
VERTRAGING TIMER0 Als ik uitga van een clock van 8Mhz dan duurt een periode 125nS, en als ik de prescaler gebruik van 1024, dan duurt de periode 0,128mS. Dus Tcnt=99. 99+156=255 156x0.128mS=19.968mS dat is wel een goede periode-tijd Deze tijd is bedoeld om de s e r vo’ sopnieuw van een stuurpuls te voorzien, want anders denken ze dat de batterij leeg is.
Even in de simulator
Bij iedere timer interrupt wordt er een asterix geprint
Se r vo’ s 10uS Omda ti kookl i dbe nva nHCCRobot i c a , da c hti k“i kz a l ook even wat vertellen over s e r vo’ s ” . Erz i j nd i ve r s e manieren om dat te realiseren, maar als er nog een niet gebruikte timer is, dan is het heel gemakkelijk. Dan gebruik je die timer. (de 8515 heeft een 16 bit timer 1) de pulsbreedte moet 1-2mS zijn, maar dat moet nog afgesteld worden.
Nog meer s e r v o’ s
Hier links ziet U wat servostuurpulsen, de breedte van de puls bepaald de mate van verdraaiing van de as.
De /8 prescale is wel gemakkelijk want je kan dan de pulsbreedte opgeven in uS (bij een 8Mhz clock) 1 tot 2 mS
1000-2000
constructie
Andere main loop