Inleiding
Deze handleiding dient om u te helpen bij het gemakkelijk uitbreiden
van sensoren van de robot software-matig. Er zijn 3 onderdelen
die men zal moeten aanpassen. Het Master-programma, Slave-programma
en Visual Basic-programma. Het Slave-programma wordt nog eens
onderverdeeld in twee, grondsensoren en zijsensoren.
Master
Zoals al gekend spreekt de Master elke Slave aan via I²C.
Elke Slave heeft een aanspreekadres, ingesteld op de Slave-module
zelf. De Master ontvangt de informatie van de PC en stuurt deze
door naar de Slaves. Hierna wacht de Master op de uitslagen van
de Slaves en stuurt deze verder naar de PC.
Nu moet er voor elke Slave registers worden aangemaakt in de Master
asm-file. Op dit moment zijn in de microcontroller van de Master
al reeds 55 van de 96 vrije registers van Bank0 toegekend (Free
Registers Master.xls). Op de 3 andere Banken staan in totaal nog
272 beschikbare registers.
Voor elke Slave moet je de volgende registers aanmaken in het
begin van het programma:
WhatToSay1
McToPcBuffxx (xx = 2 cijfers, voor elke Slave steeds 4 opeenvolgende)
McToPcBuffxxBis (xx = 2 cijfers, voor elke Slave steeds 4 opeenvolgende)
Dus in totaal moeten per Slave 9 registers aangemaakt worden.
Eenmaal deze registers zijn aangemaakt kan men verdere aanpassingen
doen in het programma. In het begin van het programma, bij MainProg
moet in Bank0 elk McToPcBuffxxBis-register gewist worden. Hierna
zal men in Mainloop een nieuw communicatieproces moeten opmaken
voor elke Slave die men wenst bij te maken. Nu zijn er twee mogelijkheden,
grondsensoren of zijsensoren.
– Zijsensoren:
; COMMUNICATE WITH MODULE z, FIRST SEND, THEN READ
call DEL_3
BSF PORTB,0
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
MOVF WhatToDo,W
MOVWF WhatToSayz
; ********SEQUENTIAL firing********
; btfsc USReady,(z-1)
; bsf WhatToSayz,2
; ********ASAP firing********
movf USReady,W
andlw b'00000111'
xorlw b'00000111'
btfsc STATUS,Z
BSF WhatToSayx,2
; ***************************
CALL i2c_on
MOVLW B'010yyyyy0'
CALL i2c_tx
MOVF WhatToSayz,W
CALL i2c_tx
CALL i2c_off
bcf USReady,(z-1)
CALL i2c_on
MOVLW B'010yyyy1'
CALL i2c_tx
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf1
CALL i2c_ACK
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf2
CALL i2c_ACK
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf3
CALL i2c_ACK
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf4
CALL i2c_off
BSF STATUS,RP0
BCF INTCON,GIE
BCF STATUS,RP0
MOVF TempBuf1,W
MOVWF McToPcBuffwwBis
MOVF TempBuf2,W
MOVWF McToPcBuff(ww+1)Bis
MOVF TempBuf3,W
MOVWF McToPcBuff(ww+2)Bis
MOVF TempBuf4,W
MOVWF McToPcBuff(ww+3)Bis
BSF STATUS,RP0
BSF INTCON,GIE
BCF STATUS,RP0
btfsc TempBuf1,6
bsf USReady,(z-1)
Nu moeten we hierin de z vervangen door het nummer van de Slave.
In het originele Masterprogramma staan al 3 Slaves (1-2-3) voor
zijsensoren in geprogrammeerd. Bij register USReady zal men telkens
de (z-1) bit nakijken, dit omdat de eerste bit in het register
wordt aangesproken als 0. Dus voor Slave 1 wordt bit (1-1) aangesproken.
Dan is er nog de McToPcBuffwwBis, hierbij moet ww vervangen worden
cijfers die wijzen naar de in begin aangemaakte registers. En
als laatste moet men telkens het juiste adres hierin invullen.
Hier wordt verder op ingegaan in het Slave gedeelte.
In het begin van het deelprogramma gaat men de byte USReady vergelijken
met de byte die het zou zijn moesten alle US-sensoren niet in
gebruik zijn. Bij ons hebben we 3 US-sensoren, dus de drie laatste
bit moeten 1 zijn. Indien ze alledrie niet bezig zijn gaat hij
de derde bit op 1 zetten en zo in Slave programma duidelijk maken
dat hij mag uitzenden. Er is echter nog een belangrijk punt, de
USReady register heeft maar 8 bits, dus er kunnen maar 8 Slaves
voor zijsensoren mee beheerd worden. Dit kan men oplossen door
een extra register aan te maken, bvb USReady2. Dan moet men in
bovenstaande tekst USReady vervangen door USReady2 en weer beginnen
vanaf bit 0.
– Grondsensoren
; COMMUNICATE WITH GROUND MODULE z, FIRST SEND, THEN READ
call DEL_3
BCF PORTB,0
BCF PORTB,1
BCF PORTB,2
BSF PORTB,3
MOVF WhatToDo,W
MOVWF WhatToSayz
CALL i2c_on
MOVLW B'010yyyy0'
CALL i2c_tx
MOVF WhatToSayz,W
CALL i2c_tx
CALL i2c_off
CALL i2c_on
MOVLW B'010yyyy1'
CALL i2c_tx
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf1
CALL i2c_ACK
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf2
CALL i2c_ACK
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf3
CALL i2c_ACK
CALL i2c_rx
MOVF SSPBUF,W
MOVWF TempBuf4
CALL i2c_off
BSF STATUS,RP0
BCF INTCON,GIE
BCF STATUS,RP0
MOVF TempBuf1,W
MOVWF McToPcBuffwwBis
MOVF TempBuf2,W
MOVWF McToPcBuff(ww+1)Bis
MOVF TempBuf3,W
MOVWF McToPcBuff(ww+2)Bis
MOVF TempBuf4,W
MOVWF McToPcBuff(ww+3)Bis
BSF STATUS,RP0
BSF INTCON,GIE
BCF STATUS,RP0
Hierbij gelden weer dezelfde regels als voor de zijsensoren.
Let wel op voor de nummering van de Slavemodule, deze loopt door
naar die van de zijsensoren.
Na deze bijgevoegd te hebben mag men zeker niet vergeten terug
te keren naar het begin door achter de laatste volgende regel
bij te voegen:
GOTO MAINLOOP
Het volgende dat men moet aanpassen is het doorsturen van de
data's naar de PC. Per sensor zijn er twee bytes die doorgestuurd
worden. Die moeten 1 per 1 doorgestuurd worden, beginnend bij
McToPcBuff01 tot de laatste aangemaakte McToPcBuffxx. Om deze
een per een te doorsturen is er een pointer aangemaakt: McToPcPointer.
Deze heeft als waarde de plaats van McToPcBuff01, in ons programma
zijnde h'40'. Nadat het eerste register is doorgestuurd wordt
hierbij 1 opgeteld, gevende h'41', zodat dan de waarde in register
h'41' wordt doorgestuurd, zijnde McToPcBuff02 en zo gaan we door
tot we de laatste nodige waarde hebben doorgestuurd.
Vermits er per Slave 2 sensoren zijn en dus 4 bytes hebben we
in ons programma het per 4 ingedeeld.
SendDataToPC:
BCF STATUS,RP0
BCF STATUS,IRP ; Clear IRP , choose bank 0 or 1
MOVF McToPcPointer,W
SUBLW H'50'
BTFSC STATUS,Z ; skip if zero, thus McToPcPointer = 50
GOTO SendSyncByte
MOVF McToPcPointer,W
SUBLW H'40'
BTFSS STATUS,Z ; continue if zero, thus McToPcPointer = 40
GOTO NotCopyBlock1AtOnce
MOVF McToPcBuff01Bis,W
MOVWF McToPcBuff01
MOVF McToPcBuff02Bis,W
MOVWF McToPcBuff02
MOVF McToPcBuff03Bis,W
MOVWF McToPcBuff03
MOVF McToPcBuff04Bis,W
MOVWF McToPcBuff04
Op de vierde regel van bovenstaand stuk programma moet men de
hexadecimale waarde vervangen afhankelijk van hoeveel sensoren
men heeft. In ons programma zijn we begonnen bij register h'40'
en hebben we 4 slaves met telkens 2 sensoren, dus hebben we 16
waardes die doorgestuurd moeten worden. Daardoor zal de laatste
waarde zich bevinden op register h'50'. Men mag hierbij niet vergeten
dat men bij hexadecimaal na 49 eerst nog 4A tot 4F heeft vooraleer
men bij 50 zit. Daardoor kijken we na of in de pointer de waarde
h'50' niet al inzit, want indien dit zo is, is alles al doorgestuurd
en kan men terug herbeginnen. Dit doet men dan door h'40' weer
te schrijven in McToPcpointer.
Men moet dus wel zien dat al de waardes in registers worden geplaatst
die achter mekaar staan. Hierdoor zal men misschien wel de zelf
gedefinieerde registers anders moeten ordenen om zo meer waardes
in een stuk achter rmekaar te zetten.
In bovenstaande tekst ziet men dat als men dus de eerste 4 waardes,
zijnde de resultaten van de metingen van de eerste slave, heeft
doorgestuurd men zal gaan naar het deelprogramma NotCopyBlock1AtOnce:
MOVF McToPcPointer,W
SUBLW H'44'
BTFSS STATUS,Z ; continue if zero, thus McToPcPointer = 44
GOTO NotCopyBlock2AtOnce
MOVF McToPcBuff05Bis,W
MOVWF McToPcBuff05
MOVF McToPcBuff06Bis,W
MOVWF McToPcBuff06
MOVF McToPcBuff07Bis,W
MOVWF McToPcBuff07
MOVF McToPcBuff08Bis,W
MOVWF McToPcBuff08
Hierbij wordt weer een hexadecimaal getal vergeleken met de pointer,
indien deze weer 4 waardes groter is geworden zal men de waardes
van de volgende Slave willen doorsturen en dus doorgaan naar NotCopyBlock2AtOnce
en zo gaat men door tot men alle waardes heeft doorlopen. Dus
in het programma moet je bovenstaand programma bijplakken, met
aangepaste cijfers natuurlijk, tot men al zijn Slaves heeft doorlopen.
Indien dit allemaal gedaan is, is de Master aangepast aan alle
Slaves.
Terug naar boven
Slave
Voor de Slaves moet er niet zoveel aangepast worden qua programmatie
zelf. Men moet gewoon ervoor zorgen dat men het juiste programma
inlaad voor de juiste Slave. Er zijn twee verschillende programma's,
een voor grondsensoren en een voor de zijsensoren.
Hetgene waar men voor moet opletten is het adres en deze is hardware
matig in te geven. Dit wordt gedaan aan de hand van de switch
die staat op het bord (foto switch). De eerste vier switchs bepalen
het adres van de Slave: 010yyyy0, deze moeten dan correct ingevuld
worden in het Master-programma.
Terug naar boven
Visual Basic
Wat de uitbreiding van het Visual Basic programma betreft, is
de eerste stap het toevoegen van een tekstbox per toegevoegde
sensor. Vervolgens dienen in de code enkele aanpassingen te gebeuren.
In het deel met als titel: ‘Private Sub Form_Load()’
dient het volgende gewijzigd te worden:
For count = 0 To z
Text1(count).Text = ""
Next
Waarbij z het aantal tekstboxen (die de outputs van de sensoren
weergeven) met als naam Text1() zijn.
Vervolgens moeten ook de volgende zaken in het deel: ‘Private
Sub MSComm1_OnComm()’ aangepast worden:
If InPointer > a Then InPointer = 0
Waarbij a gelijk aan tweemaal het totaal aantal sensoren-1 is.
Per toegevoegde zijsensor, dient het volgende toegevoegd te worden:
Text1(b).Text = (RecieveBuffer(c) And 127) + (RecieveBuffer(d)
And 7) * 128
If (RecieveBuffer(d) And 32) <> 0 Then RecieveBuffer(e)
= 0
If (RecieveBuffer(d) And 16) <> 0 Then RecieveBuffer(f)
= 0
Text1(g).Text = RecieveBuffer(f) + RecieveBuffer(e) * 256
Text1(h).Text = ((RecieveBuffer(f) + RecieveBuffer(e) * 256) /
1800) * 0.3048
For count = 0 To i
Waarbij b het tekstvak aanduidt waarin de output van de IR sensor
geschreven wordt, c en d de posities van de doorgestuurde signalen
van de IR weergeven, e en f de posities van de doorgestuurde signalen
van de bijhorende US weergeven, g het tekstvak aanduidt waarin
de output van de US sensor geschreven wordt, h het tekstvak aanduidt
waarin de afstand gemeten door de US sensor geschreven wordt en
i het aantal IR sensoren is.
Per toegevoegde grondsensor, dient het volgende toegevoegd te
worden:
Text1(j).Text = (RecieveBuffer(k) And 127) + (RecieveBuffer(l)
And 7) * 128
If Text1(j).Text > 100 Then
Text1(m).Text = "white"
Else
Text1(m).Text = "black"
End If
Waarbij j het tekstvak aanduidt waarin de output van de grondsensor
geschreven wordt, k en l de posities van de doorgestuurde signalen
van de grondsensor weergeven en m het tekstvak is om aan te duiden
of de ondergrond zwart of wit is.
Ten slotte dienen de resultaten van de metingen met de toegevoegde
sensoren ook nog in de csv-file geschreven te worden door volgende
wijziging door te voeren:
Print #1, Text1(u).Text + "," + Text1(n).Text + ","
+ Text1(o).Text + "," + Text1(p).Text + ","
+ Text1(q).Text + "," + Text1(r).Text + ","
+ Text1(s).Text + "," + Text1(t).Text
Met n, o, p, q, r, s, t en u de resultaten van de sensormetingen
Terug naar boven