Vrije Universiteit Brussel


Handleiding bij uitbreiden sensoren

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

©2004 • Vrije Universiteit Brussel • Pleinlaan 2 • 1050 Elsene • Tel.: 02/629.21.11 • info@vub.ac.be