Appendice B
Listato dei programmi
B.1 Programma
Assembler
;--- Programma per il calcolo delle accelerazioni dell'ADXL202JE e trasferimento dei dati in seriale
list P=PIC16F877, F=INHX8M, ST=OFF, N=42, MM=OFF, B=6 radix dec
include "p16f877.inc" errorlevel -302
__CONFIG _XT_OSC & _PWRTE_OFF & _BODEN_OFF & _CP_OFF & _WDT_OFF & _LVP_OFF
PORTB_CONF equ 240 ; setto i piedini RB7, RB6 e RB5 come ingressi RB7 equ 7 ; per sfruttare la proprieta di questa porta RB6 equ 6 ; di gestire interruzioni per il cambiamento RB5 equ 5 ; di stato dei piedini RB<7,6,5,4>
; RB7= assex , RB6=assey , RB5=assez. Corispondenza tra i piedini e il
RB4 equ 4 ;sensore
RBIE equ 3
TMR1ON equ 0 ; bit 0 del
registro T1CON, avvia il Timer1
tx equ 6 ; tx è nel
piedino RC6
rx equ 7 ; rx è nel
piedino RC7
baud equ 3 ; setto la trasmissione
a 57600 con oscillatore a FOSC = 3.6864 MHz, hi
KHi equ 2
KLo equ 13
Listato dei Programmi
asp ; controlla se è
la primaq esecuzione del programma Count1 ArgL ArgH AccHi AccLo DivCnt PRODW3 PRODW2 PRODW1 PRODW0 DIV0 DIV1 ANS0 ANS1 T2xHi T2xLo T2zHi T2zLo T1xLo T1xHi
T1yLo ; variabili per il conteggio di T1
T1yHi T1zLo T1zHi ZXcalHi ZXcalLo ZYcalHi ZYcalLo ZZcalHi ZZcalLo T2xcalHi T2xcalLo T2zcalHi T2zcalLo ZXActualHi ZXActualLo ZYActualHi ZYActualLo ZZActualHi ZZActualLo XAccel YAccel
Listato dei Programmi
ZAccel
LASTPB ; memorizza il
valore della porta B
TEMP ; memorizza il valore
dell'ultima lettura della porta B
conta ; variabile di comodo
nei conteggi
dato ; variabile che tiene
conto del dato ricevuto e da mandare alla seriale
canali ;
posto ;
comodo ;
STATO ; indica quante
volte si accede a quella procedura Temp0 Temp1 Temp2 Temp3 EADR EDATA endc org 00h goto start org 110h
;---Subroutine Controllo sulla attivazione della procedura di calibrazione--- ControllaCalibra
rip btfsc PORTB,RB4 ; RB4 è basso?
goto rip
avanti
call CalcoloT2 ; fa la procedura di calibrazione e salva i valori rilevati movf T2xHi,W movwf T2xcalHi movf T2xLo,W movwf T2xcalLo movf T2zHi,W movwf T2zcalHi movf T2zLo,W movwf T2zcalLo
Listato dei Programmi call CalcoloT1 movf T1xHi,W movwf ZXcalHi movf T1xLo,W movwf ZXcalLo movf T1yHi,W movwf ZYcalHi movf T1yLo,W movwf ZYcalLo movf T1zHi,W movwf ZZcalHi movf T1zLo,W movwf ZZcalLo return
;---calcolo del periodo nel primo ciclo utile del solo segnale X CalcoloT2
T2x
movlw 2
movwf conta
clrf T1CON ; Pulisco il registro
clrf TMR1L ; resetto il timer, parte
bassa
clrf TMR1H ; e parte alta
FronteAltox
btfss PORTB,RB7 ;
goto FronteAltox ;
bsf T1CON,TMR1ON ; Abilito il Timer1
FronteBassox btfsc PORTB,RB7 ; goto FronteBassox ; decf conta,1 ; FronteAlto2x btfss PORTB,RB7
Listato dei Programmi
goto FronteAlto2x
decfsz conta,1
goto fine ; Genera segnale d'erroe per esempio
interrupt Stopx
bcf T1CON,TMR1ON ; stoppo il Timer
movf TMR1H,w ; salvo il contenuto del
Timer1
movwf T2xHi
movf TMR1L,w ; salvo il contenuto
del Timer1
movwf T2xLo
T2z
clrf T1CON ; Pulisco il registro
clrf TMR1L ; resetto il timer, parte
bassa clrf TMR1H ; e parte alta movlw 2 movwf conta FronteAltoz btfss PORTB,RB5 ; goto FronteAltoz ;
bsf T1CON,TMR1ON ; Abilito il Timer1
FronteBassoz btfsc PORTB,RB5 ; goto FronteBassoz ; decf conta,1 ; FronteAlto2z btfss PORTB,RB5 goto FronteAlto2z decfsz conta,1
Listato dei Programmi
Stopz
bcf T1CON,TMR1ON ; stoppo il Timer
movf TMR1H,w ; salvo il contenuto del
Timer1
movwf T2zHi
movf TMR1L,w ; salvo il contenuto
del Timer1
movwf T2zLo
return
;---Subroutine Calcolo T1 dei tre segnali X, Y e Z---
CalcoloT1
bsf STATUS,RP0
;movlw B'10000000' ; Setto la direzione
dei pin nella porta B
;movwf TRISB
bcf STATUS,RP0
clrf T1CON ; Pulisco il registro
clrf TMR1L ; resetto il timer, parte
bassa
clrf TMR1H ; e parte alta
Aspetta_RB7
btfsc PORTB,RB7 ; cerco il momento in cui il
segnale torna a zero
goto Aspetta_RB7
Aspetta_RB7_up
btfss PORTB,RB7
goto Aspetta_RB7_up
bsf T1CON,TMR1ON ; attivo il timer
Aspetta_RB7_down
btfsc PORTB,RB7 ; cerco il momento in cui il
segnale torna a zero
goto Aspetta_RB7_down
bcf T1CON,TMR1ON ; stoppo il timer e ne
salvo il contenuto
movf TMR1L,0 ; in T1xlo e T1xhi
movwf T1xLo
movf TMR1H,0
movwf T1xHi
Listato dei Programmi
clrf TMR1L ; resetto il timer, parte
bassa
clrf TMR1H ; e parte alta
Aspetta_RB6
btfsc PORTB,RB6 ; cerco il momento in cui il
segnale torna a zero
goto Aspetta_RB6
Aspetta_RB6_up
btfss PORTB,RB6
goto Aspetta_RB6_up
bsf T1CON,TMR1ON ; attivo il timer
Aspetta_RB6_down
btfsc PORTB,RB6 ; cerco il momento in cui il
segnale torna a zero
goto Aspetta_RB6_down
bcf T1CON,TMR1ON ; stoppo il timer e ne
salvo il contenuto
movf TMR1L,0 ; in T1ylo e T1yhi
movwf T1yLo
movf TMR1H,0
movwf T1yHi
clrf T1CON ; Pulisco il registro
clrf TMR1L ; resetto il timer, parte
bassa
clrf TMR1H ; e parte alta
Aspetta_RB5
btfsc PORTB,RB5 ; cerco il momento in cui il
segnale torna a zero
goto Aspetta_RB5
Aspetta_RB5_up
btfss PORTB,RB5
goto Aspetta_RB5_up
bsf T1CON,TMR1ON ; attivo il timer
Aspetta_RB5_down
btfsc PORTB,RB5 ; cerco il momento in cui il
segnale torna a zero
goto Aspetta_RB5_down
bcf T1CON,TMR1ON ; stoppo il timer e ne
salvo il contenuto
movf TMR1L,0 ; in T1zlo e T1zhi
movwf T1zLo
Listato dei Programmi
movwf T1zHi
clrf T1CON ; Pulisco il registro
clrf TMR1L ; resetto il timer, parte
bassa
clrf TMR1H ; e parte alta
incf STATO,1
return
;--- Impostazioni delle porte
;--- portB usata per la comuncazione con l'accelerometro, PortC usata per la trasmissione tramite seriale al PC
start
bcf STATUS, RP0
bcf STATUS, RP1 ; accedo al banco di
memoria 0
clrf PORTB
bsf STATUS, RP0 ; accedo al
banco di memoria 1,
movlw 240
movwf TRISB ; setto
RB7, RB6, RB5 e RB4 in ingresso
movlw 128 ; setto RC6/Tx
in uscita e RC7/Rx in ingresso
movwf TRISC
bsf OPTION_REG,NOT_RBPU ; disabilita
esplicitamente il pull-up software sulla porta B
clrf STATUS ; Bank0
clrf INTCON ; Disable
interrupts and clear some flags
clrf PIR1 ; Clear all flag bits
bcf STATUS, RP0 ; Bank0
clrf T1CON goto Main
Listato dei Programmi
Main bsf STATUS,RP0
movlw baud
movwf SPBRG
clrf TXSTA ; trasmissione asincrona,8 bit bsf TXSTA,BRGH ; high speed
bsf TXSTA,TXEN ; Abilita la
comunicazione seriale
bcf STATUS,RP0 ; Banco 0
BSF RCSTA,SPEN ; configura il pin TX come uscita seriale...
call ControllaCalibra ; Controlla se abilitata la procedura di calibrazione
goto Invia_RS232
ripeti call CalcoloT1 Invia_RS232
bcf STATUS,RP0 ; Banco 0;
bsf RCSTA,SPEN ; configura il pin TX come uscita seriale...
bsf STATUS,RP0
bsf TXSTA,TXEN ; abilitazione comunicazione seriale
aspettax0 btfss TXSTA,TRMT ; aspetto che il registro TSR sia vuoto
goto aspettax0 bcf STATUS,RP0
movlw 115
MOVWF TXREG ; invia il carattere di sincronismo "s" BSF STATUS,RP0 aspettax1s BTFSS TXSTA,TRMT GOTO aspettax1s bcf STATUS,RP0 movlw 100
MOVWF TXREG ; invia il carattere di sincronismo "d" BSF STATUS,RP0
aspettax2s BTFSS TXSTA,TRMT GOTO aspettax2s
Listato dei Programmi
bcf STATUS,RP0
movlw 80
MOVWF TXREG ; invia il carattere di sincronismo "P" BSF STATUS,RP0
aspettax3s BTFSS TXSTA,TRMT GOTO aspettax3s
bcf STATUS,RP0
movf T1xHi,0
MOVWF TXREG ; invia il valore T1xHi BSF STATUS,RP0
aspettas8 BTFSS TXSTA,TRMT GOTO aspettas8
bcf STATUS,RP0
movf T1xLo,0
MOVWF TXREG ; invia il valore T1xLo BSF STATUS,RP0
aspettas7 BTFSS TXSTA,TRMT GOTO aspettas7
bcf STATUS,RP0
movf T1yHi,0
MOVWF TXREG ; invia il valore T1yHi BSF STATUS,RP0
aspettasA BTFSS TXSTA,TRMT GOTO aspettasA
bcf STATUS,RP0
movf T1yLo,0
MOVWF TXREG ; invia il valore T1yLo BSF STATUS,RP0
aspettas9 BTFSS TXSTA,TRMT GOTO aspettas9
bcf STATUS,RP0
movf T1zHi,0
MOVWF TXREG ; invia il valore T1zHi BSF STATUS,RP0
aspettasB BTFSS TXSTA,TRMT GOTO aspettasB
bcf STATUS,RP0
movf T1zLo,0
MOVWF TXREG ; invia il valore T1zLo BSF STATUS,RP0
aspettasC BTFSS TXSTA,TRMT GOTO aspettasC
Listato dei Programmi
BCF STATUS,RP0 bcf STATUS,RP0
movf T2xHi,0
MOVWF TXREG ; invia il valore T2xh BSF STATUS,RP0
aspettaT2xh BTFSS TXSTA,TRMT GOTO aspettaT2xh
bcf STATUS,RP0
movf T2xLo,0
MOVWF TXREG ; invia il valore T2xLo BSF STATUS,RP0
aspettaT2xl BTFSS TXSTA,TRMT GOTO aspettaT2xl
bcf STATUS,RP0
movf T2zHi,0
MOVWF TXREG ; invia il valore T2zh BSF STATUS,RP0
aspettaT2zh BTFSS TXSTA,TRMT GOTO aspettaT2zh
bcf STATUS,RP0
movf T2zLo,0
MOVWF TXREG ; invia il valore T2zl BSF STATUS,RP0
aspettaT2zl BTFSS TXSTA,TRMT GOTO aspettaT2zl
bcf STATUS,RP0
movf ZXcalHi,0
MOVWF TXREG ; invia il valore ZXcalHi BSF STATUS,RP0 aspettaZXcalH BTFSS TXSTA,TRMT GOTO aspettaZXcalH bcf STATUS,RP0 movf ZXcalLo,0
MOVWF TXREG ; invia il valore ZXcalLo BSF STATUS,RP0 aspettaZXcalL BTFSS TXSTA,TRMT GOTO aspettaZXcalL bcf STATUS,RP0 movf ZYcalHi,0
MOVWF TXREG ; invia il valore ZYcalHi BSF STATUS,RP0
Listato dei Programmi aspettaZYcalH BTFSS TXSTA,TRMT GOTO aspettaZYcalH bcf STATUS,RP0 movf ZYcalLo,0
MOVWF TXREG ; invia il valore ZYcalLo BSF STATUS,RP0 aspettaZYcalL BTFSS TXSTA,TRMT GOTO aspettaZYcalL bcf STATUS,RP0 movf ZZcalHi,0
MOVWF TXREG ; invia il valore ZZcalHi BSF STATUS,RP0 aspettaZZcalH BTFSS TXSTA,TRMT GOTO aspettaZZcalH bcf STATUS,RP0 movf ZZcalLo,0
MOVWF TXREG ; invia il valore ZZcalLo BSF STATUS,RP0 aspettaZZcalL BTFSS TXSTA,TRMT GOTO aspettaZZcalL ; ; return goto ripeti fine end
B.2 Programma Visual Basic
Dim canali(1 To 16) As Integer Dim B(1 To 19) As Integer Dim grafico(1 To 3) As Double
Listato dei Programmi
Dim conta As Integer Dim stato As Integer Dim ris(1 To 6) As Double Dim T2(1 To 6) As Double Dim Zcal(1 To 6) As Double Dim T1(1 To 6) As Double Dim Accel(1 To 3) As Double Dim cal(1 To 4) As Double Dim somma As Integer
Dim vett(1 To 3, 1 To 200) As Double Dim Control As Boolean
Dim X(1 To 1024) As Double Dim Y(1 To 1024) As Double Dim Z(1 To 1024) As Double Dim i, j, k, r, p, h, conf As Integer Private Sub CmdExit_Click() End
End Sub
Private Sub Cmdstart_Click() MSComm1.CommPort = 1
' 57600 baud, no parity, 8 data, and 1 stop bit. MSComm1.Settings = "57600,N,8,1"
' Tell the control to read entire buffer when Input ' is used. MSComm1.InputLen = 0 MSComm1.PortOpen = True Timer1.Interval = 50 Timer1.Enabled = True End Sub
Private Sub CmdStop_Click() Timer1.Enabled = False MSComm1.PortOpen = False End Sub
Private Sub Command1_Click() Control = True
Salvadati.ShowSave
Open Salvadati.FileName For Output As #1 End Sub
Listato dei Programmi 'For j = 1 To 1024 ''Write #1, X(j), Y(j), Z(j), ''Write #1, 'Text1(28).Text = X(j) 'Text1(29).Text = Y(j) 'Text1(30).Text = Z(j) 'Next j Close #1 End Sub
Private Sub Form_Load()
'MsgBox "FASE DI CALIBRAZIONE TERMINATA", 64, "Procedura Calibrazione" Timer1.Enabled = False
Control = False conta = 0 stato = 0
'MsgBox "ATTENZIONE!!Controllare il Periodo", 64, "Controllo Periodo" End Sub
Private Sub Timer1_Timer() Dim A As String
A = MSComm1.Input PrimaS = InStr(A, "s") Text2.Text = PrimaS
A = Right(A, Len(A) - PrimaS + 1) Text3.Text = A 'For p = 1 To 19 ' B(p) = Asc(Mid(A, p, 1)) sottos = Left(A, 19) 'Next p Text4.Text = sottos
If Left(sottos, 1) = "s" Then 'And Left(sottos, 2) = "d" And Left(sottos, 3) = "P" Text5.Text = "Pippo"
conta = conta + 1 If conta = 20 Then
MsgBox "FASE DI CALIBRAZIONE TERMINATA", 64, "Procedura Calibrazione" stato = 1
Listato dei Programmi
i = 1
For j = 1 To 6
' memorizza i valori di calibrazione di T2 If i = 2 Then T2(j) = Asc(Mid(sottos, (i + 9), 1)) If somma = 0 Then i = 0 somma = somma + 1 End If Else T2(j) = Asc(Mid(sottos, (i + 9), 1)) End If
Text1(j - 1).Text = T2(j) ' voglio fare l'estensione a 16 bit i = i + 1
Next j For j = 1 To 6
Zcal(j) = Asc(Mid(sottos, (j + 13), 1)) ' memorizza i valori di calibrazione di Zcal Text1(j + 5).Text = Zcal(j)
Next j For i = 1 To 4 cal(i) = Asc(Mid(sottos, (i + 9), 1)) Text1(i + 11) = cal(i) Next i End If If stato = 0 Then sottos = Left(A, 19) Else
sottos = Left(A, 9) 'prendo i 6 dati T1xHi, T1xLo, T1yHi, T1yLo, T1zHi, T1zLo ' For i = 0 To 10 'Next i 'Text5.Text = "Pippo" ' 'For k = 1 To 3 ' For i = 1 To 6 T1(i) = Asc(Mid(sottos, i + 3, 1))
Listato dei Programmi
Text1(i + 15).Text = T1(i) Next i
'k = i - 1 j = 1 For i = 1 To 3
Accel(i) = 720 * ((T1(j) * 256 + T1(j + 1)) - (Zcal(j) * 256 + Zcal(j + 1))) / (T2(j) * 256 + T2(j + 1))
Text1(i + 21).Text = Accel(i) j = j + 2 Next i For i = 1 To 3 grafico(i) = Accel(i) Next i ' ' j = 1 ' ' ' If j < 1024 Then ' If Control Then ' For i = 1 To 3 ' If i = 1 Then ' X(j) = Accel(i) ' Text1(25).Text = X(j) ' ElseIf 2 = 2 Then ' Y(j) = Accel(i) ' Text1(26).Text = Y(j) ' ElseIf i = 3 Then ' Z(j) = Accel(i) ' Text1(27).Text = Z(j) ' End If ' ' End If ' j = j + 1 ' Next i n = 1
Listato dei Programmi For n = 1 To 1024 For i = 1 To 3 'grafico(i) = Accel(i) If Control Then If i = 1 Then X(n) = Accel(i) Text1(25).Text = X(n) ElseIf i = 2 Then Y(n) = Accel(i) Text1(26).Text = Y(n) ElseIf i = 3 Then Z(n) = Accel(i) Text1(27).Text = Z(n) End If End If Next i If Control Then ' For n = 1 To 1024 Write #1, X(n), Y(n), Z(n), Write #1, End If Next n MSChart2.ChartData = grafico End If End If End Sub