;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; ITIS G.MARCONI
;;
;;
;;
;; PROGETTO ELECTRA
;;
;;
;;
;; MASTRO FLORIANI IVAN ;;
;; MASTRO PELLA SIMONE
;;
;; CLASSE 5 SEZIONE O
;;
;; ANNO SCOLASTICO 2005/2006 ;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR 16F84 ; Direttiva del compilatore assembler che consente
di definire per quale microprocessore è stato scritto il programma.
RADIX DEC ; Serve ad informare
il compilatore che i numeri riportati senza notazione, sono da intendersi come numeri decimali.
INCLUDE "P16F84.INC" ; Il compilatore si limiterà a sostituire la
linea contenente la direttiva INCLUDE con il contenuto del file indicato e ad effettuare
quindi la compilazione come se fosse anch'esso parte del nostro source.
ERRORLEVEL -302 ;
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
;Definizione delle Costanti
Select EQU 3
;Assegna alla costante Select il valore 3
Ck
EQU 2 ;Assegna alla costante Ck il valore 2
SterzoSinistra EQU 4 ;Assegna alla costante SterzoSinistra il valore
4
SterzoDestra EQU 5 ;Assegna alla costante SterzoDestra
il valore 5
Destra EQU 7
;Assegna alla costante Destra il valore 7
Centro EQU 6
;Assegna alla costante Centro il valore 6
Centro1 EQU 5 ;Assegna
alla costante Centro1 il valore 5
Sinistra EQU 4 ;Assegna alla
costante Sinistra il valore 4
Avanti EQU 3
;Assegna alla costante Avanti il valore 3
Velo EQU
6 ;Assegna alla costante Velo il valore 6
TerraSinistra EQU 2 ;Assegna alla costante TerraSinistra il
valore 2
TerraDestra EQU 3 ;Assegna alla costante
TerraDestra il valore 3
DietroDestra EQU 0 ;Assegna alla costante DietroDestra
il valore 0
DietroSinistra EQU 1 ;Assegna alla costante DietroSinistra il valore
1
;Select = Serve per
selezionare il verso del flusso dati.Aquisizione o Scrittura
;Ck
= Impulso di clock sui three state.Abilita la scrittura
;SterzoSinistra = Se abilitato lo sterzo va a sinistra
;SterzoDestra = Se abilitato lo sterzo va a destra
;Destra = Corrisponde al
sensore davanti destro della macchina
;Centro = Corrisponde al
sensore davanti centrale della macchina
;Centro1 = Corrisponde al
sensore davanti centrale della macchina
;Sinistra = Corrisponde al sensore
davanti sinistro della macchina
;Avanti = Se a 1 sara
innestata la reromarcia.Se 0 la marcia avanti
;Velo = Se a 1
mette in movimento il motore
;TerraSinistra = Corrisponde al sensore sinistro per il controllo
della striscia nera
;TerraDestra = Corrisponde al sensore Destro per il
controllo della striscia nera
;DietroDestra = Corrisponde al sensore posteriore dietro
;DietroSinistra = Corrisponde al sensore posteriore sinistro
ORG 0CH ;Commuta sul banco di memoria
= 0CH
Count RES 2 ;Riserva
n°2 byte alla variabile Count
Ciclo RES 1 ;Riserva
n°2 byte alla variabile Ciclo
Retro RES 1 ;Riserva
n°2 byte alla variabile Retro
Retro1 RES 1 ;Riserva n°2
byte alla variabile Retro1
Ostacolo RES 1 ;Riserva n°2 byte alla
variabile Ostacolo
Limita RES 1 ;Riserva n°2
byte alla variabile Limita
LimitaNero RES 1 ;Riserva n°2 byte alla variabile
LimitaNero
LimitaRetro RES 1 ;Riserva n°2 byte alla variabile
LimitaRetro
;Reset Vector
;Start point
at CPU reset
ORG 00H
;Commuta sul banco di memoria = 00H
bsf STATUS,RP0
;Mette a uno RP0 del registro STATUS
movlw 00000000B
;Imposta il PORTA come uscità
movwf TRISA
movlw 11111111B
;Imposta il PORTB come ingresso
movwf TRISB
bcf STATUS,RP0
;Mette a zero RP0 del registro STATUS
;Inizio del programma
movlw 0
;Mette il valore nell'accumulatore
movwf PORTA
;Assegna al PORTA il valore presente nell'accumulatore
movwf PORTB
;Assegna al PORTB il valore presente nell'accumulatore
movlw 20
;Mette il valore nell'accumelatore
movwf Limita
;Assegna alla variabile Limita il valore presente nell'accumulatore
movlw 1
;Mette il valore nell'accumulatore
movwf LimitaNero
;Assegna a LimitaNero il valore presente nell'accumulatore
movlw 15
;Mette il valore nell'accumulatore
movwf LimitaRetro
;Assegna a LimitaRetro il valore presente nell'accumulatore
Controllo
movlw 0
;Mette il valore nell'accumulatore
movwf PORTA
;Assegna al PORTA il valore presente nell'accumulatore
movwf PORTB
;Assegna al PORTB il valore presente nell'accumulatore
movlw 15
;Mette il valore nell'accumulatore
movwf Ciclo
;Assegna alla variabile ciclo il valore presente nell'accumulatore
movlw 0
;Mette il valore nell'accumulatore
movwf Retro
;Assegna alla variabile Retro il valore presente nell'accumulatore
movlw 0
;Mette il valore nell'accumulatore
movwf Retro1
;Assegna alla variabile Retro1 il valore presente nell'accumulatore
movlw 252
;Mette il valore nell'accumulatore
movwf Ostacolo
;Assegna alla variabile Ostacolo il valore presente nell'accumulatore
Call Scrittura
;Chiama la sobroutine Scrittura
bcf PORTB,Avanti
;Mette a 0 il bit Avanti del PORTB
bsf PORTB,Velo
;Mette a 1 il bit Velo del PORTB
Call Scrivi
;Chiama la Sobroutine Scrivi(impulso su Ck)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Lettura
;Chiama la sobroutine di Lettura
Call Scrivi
;Chiama la Sobroutine Scrivi(impulso su Ck)
btfss PORTB,Centro
;Controlla il sensore.Se a 1 salta istruzione succesiva
goto FermaRetro
;Salta al punto del programma chiamato FermaRetro
btfss PORTB,Centro1
;Controlla il sensore.Se a 1 salta istruzione succesiva
goto FermaRetro1
;Salta al punto del programma chiamato FermaRetro1
btfss PORTB,Destra
;Controlla il sensore.Se a 1 salta istruzione succesiva
goto SterzoSinistra1 ;Salta al
punto del programma chiamato SterzoSinistra1
btfss PORTB,Sinistra ;Controlla
il sensore.Se a 1 salta istruzione succesiva
goto SterzoDestra1
;Salta al punto del programma chiamato SterzoDestra1
btfsc PORTB,TerraDestra ;Controlla il sensore.Se a
0 salta istruzione succesiva
goto SterzoSinistra1Linea ;Salta al punto del programma
chiamato SterzoSinistra1Linea
btfsc PORTB,TerraSinistra ;Controlla il sensore.Se a 0 salta
istruzione succesiva
goto SterzoDestra1Linea ;Salta al punto del
programma chiamato SterzoDestra1Linea
btfss PORTB,DietroSinistra ;Controlla il sensore.Se a 1 salta
istruzione succesiva
goto SterzoDestra1
;Salta al punto del programma chiamato SterzoDestra1
btfss PORTB,DietroDestra ;Controlla il sensore.Se a 1
salta istruzione succesiva
goto SterzoSinistra1 ;Salta al
punto del programma chiamato SterzoSinistra1
Call Scrittura
;Chiama la Sobroutine di Scrittura
bcf PORTB,Velo
;Mette a 0 il bit Velo del PORTB
call Scrivi
;Chiama la sobroutine di scrittura sui three state
decfsz Limita,1
;Decrementa la variabile Limita. Se risultato 0 salta
goto Controllo
;Salta al punto del programma chiamato Controllo
goto LimitaVelo
;Salta al punto del programma chiamato LimitaVelo
LimitaVelo
Call Scrittura
;Chiama la sobroutine Scrittura
bsf PORTB,Avanti
;Mette a 1 il bit Avanti del PORTB
bsf PORTB,Velo
;Mette a 0 il bit Velo del PORTB
Call Scrivi
;Chiama la sobroutine di scrittura sui three state
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
bcf PORTB,Avanti
;Metti a 0 il bit Avanti del PORTB
bcf PORTB,Velo
;Metti a 0 il bit Velo del PORTB
movlw 20
;Metti il valore nell'accumulatore
movwf Limita
;Assegna a Limita il valore presente nell'accumulatore
goto Controllo
;Salta al punto del programma chiamato Controllo
FermaRetro
movlw 30
;Metti il valore nell'accumulatore
movwf Ciclo
;Assegna a Ciclo il valore presente nell'accumulatore
Call Scrittura
;Chiama la sobroutine Scrittura
bsf PORTB,Avanti
;Mette a 1 il bit Avanti del PORTB
bsf PORTB,Velo
;Mette a 1 il bit Velo del PORTB
Call Scrivi
;Chiama la Sobroutine Scrivi(impulso su Ck)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
Call Delay1
;Chiama la sobroutine Delay1(Attendi)
bcf PORTB,Velo
;Mete a 0 il bit Velo del PORTB
Call Scrivi
;Chiama la Sobroutine Scrivi(impulso su Ck)
goto CicloRetro
;Salta al punto del programma chiamato CicloRetro
CicloRetro
Call Scrittura
;Chiama la sobroutine Scrittura
bcf PORTB,SterzoDestra ;Metti a 0 il bit
SterzoDestra del PORTB
bcf PORTB,SterzoSinistra ;Metti a 0 il bit
SterzoSinistra del PORTB
Call Scrivi ;Chiama la Sobroutine Scrivi(impulso su Ck)
Call Lettura ;Chiama la sobroutine di Lettura
Call Scrivi ;Chiama la Sobroutine Scrivi(impulso su Ck)
btfss PORTB,Destra ;Controlla il Sensore
goto SterzoRetroDestra1 ;Salta al punto del programma chiamato
SterzoDestra1
btfss PORTB,Sinistra ;Controlla
il Sensore
goto SterzoRetroSinistra1 ;Salta al punto del programma
chiamato SterzoSinistra1
btfss PORTB,DietroSinistra ;Controlla il Sensore
goto SterzoDestra1
;Salta al punto del programma chiamato SterzoDestra1
btfss PORTB,DietroDestra ;Controlla il Sensore
goto SterzoSinistra1 ;Salta al
punto del programma chiamato SterzoSinistra1
Call Scrittura
;Chiama la sobroutine Scrittura
bsf PORTB,Avanti
;Metti a 1 il bit avanti del PORTB
bsf PORTB,Velo
;Metti a 1 il bit Velo del PORTB
Call Scrivi
;Chiama la Sobroutine Scrivi(impulso su Ck)
Call Delay
;Chiama la sobroutine Delay (Attendi)
decfsz LimitaRetro,1 ;Decrementa
la variabile LimitaRetro. Se risultato 0 salta
goto Continua
;Salto al punto del programma..............
goto LimitaVeloRetro ;Salto al
punto del programma..............
Continua
decfsz Ciclo,1
;Decrementa la variabile Ciclo1. Se risultato 0 salta
goto CicloRetro
;Salto al punto del programma..............
incfsz Ostacolo,1
;Incrementa lavariabile Ostacolo.Se risultato 0 salta
goto Metti1R
;Salto al punto del programma..............
movlw 252
;Metti valore nell'accumulatore
movwf Ostacolo
;Assegna ad Ostacolo il valore presente nell'accumulatore
goto Metti2R
;Salto al punto del programma..............
;La spiegazione delle istruzioni
seguenti è stata omessa perchè queste sono ripetute
FermaRetro1
movlw 30
movwf Ciclo
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
Call Scrivi
Call Delay1
Call Delay1
bcf PORTB,Velo
Call Scrivi
goto CicloRetro1
CicloRetro1
Call Scrittura
bcf PORTB,SterzoDestra
bcf PORTB, SterzoSinistra
Call Scrivi
Call Lettura
Call Scrivi
btfss PORTB,Destra
goto SterzoRetroDestra
btfss PORTB,Sinistra
goto SterzoRetroSinistra
btfss PORTB,DietroSinistra
goto SterzoDestra1
btfss PORTB,DietroDestra
goto SterzoSinistra1
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
Call Scrivi
Call Delay
bcf PORTB,Avanti
decfsz LimitaRetro,1
goto Continua1
goto LimitaVeloRetro1
Continua1
decfsz Ciclo,1
goto CicloRetro1
incfsz Ostacolo,1
goto Metti2R
movlw 252
movwf Ostacolo
goto Metti1R
SterzoRetroSinistra
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoDestra
Call Scrivi
Call Delay1
CAll Delay1
goto CicloRetro1
SterzoRetroDestra
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoSinistra
Call Scrivi
Call Delay1
CAll Delay1
goto CicloRetro1
SterzoRetroSinistra1
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoDestra
Call Scrivi
Call Delay1
Call Delay1
goto CicloRetro
SterzoRetroDestra1
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoSinistra
Call Scrivi
Call Delay1
Call Delay1
goto CicloRetro
Metti2R
bsf Retro1,0
movlw 40
movwf Ciclo
goto Avanti0
Metti1R
bsf Retro,0
movlw 40
movwf Ciclo
goto Avanti0
Avanti0
Call Scrittura
btfss Retro,0
btfss Retro1,0
goto CicloAvanti
goto CicloAvanti1
CicloAvanti
bcf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoDestra
Call Scrivi
Call Delay1
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
btfss PORTB,Destra
goto SterzoSinistra1
btfss PORTB,Sinistra
goto SterzoDestra1
bcf Retro,0
Call Scrittura
bcf PORTB,Velo
Call Scrivi
Call Delay1
Bcf PORTB,SterzoDestra
Call Scrivi
decfsz Ciclo,1
goto CicloAvanti
goto Controllo
CicloAvanti1
bcf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoSinistra
Call Scrivi
Call Delay1
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
btfss PORTB,Destra
goto SterzoSinistra1
btfss PORTB,Sinistra
goto SterzoDestra1
bcf Retro1,0
Call Scrittura
bcf PORTB,Velo
Bcf PORTB,SterzoSinistra
Call Scrivi
Call Delay1
Bcf PORTB,SterzoSinistra
Call Scrivi
decfsz Ciclo,1
goto CicloAvanti1
goto Controllo
SterzoSinistra1
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
movlw 15
movwf Ciclo
Call Scrittura
bcf PORTB,Velo
Call Scrivi
goto CicloAvanti
SterzoDestra1
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
movlw 15
movwf Ciclo
Call Scrittura
bcf PORTB,Velo
Call Scrivi
goto CicloAvanti1
SterzoSinistra1Linea
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
movlw 15
movwf Ciclo
Call Scrittura
bcf PORTB,Velo
Call Scrivi
goto AvantiNero
SterzoDestra1Linea
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
movlw 15
movwf Ciclo
Call Scrittura
bcf PORTB,Velo
Call Scrivi
goto AvantiNero1
AvantiNero1
bcf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoSinistra
Call Scrivi
Call Delay1
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
btfss PORTB,Destra
goto SterzoSinistra1
btfss PORTB,Sinistra
goto SterzoDestra1
bcf Retro1,0
Call Scrittura
bcf PORTB,Velo
Bcf PORTB,SterzoSinistra
Bcf PORTB,SterzoSinistra
Call Scrivi
decfsz Ciclo,1
goto AvantiNero1
decfsz LimitaNero,1
goto Controllo
goto LimitaVeloNero
LimitaVeloNero
Call Scrittura
bsf PORTB,Avanti
bsf PORTB,Velo
Call Scrivi
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
bcf PORTB,Avanti
bcf PORTB,Velo
call Scrivi
movlw 1
movwf LimitaNero
goto Controllo
AvantiNero
bcf PORTB,Avanti
bsf PORTB,Velo
bsf PORTB,SterzoDestra
Call Scrivi
Call Delay1
Call Lettura
Call Scrivi
btfss PORTB,Centro
goto FermaRetro
btfss PORTB,Centro1
goto FermaRetro1
btfss PORTB,Destra
goto SterzoSinistra1
btfss PORTB,Sinistra
goto SterzoDestra1
bcf Retro,0
Call Scrittura
bcf PORTB,Velo
Bcf PORTB,SterzoDestra
Call Scrivi
decfsz Ciclo,1
goto AvantiNero
decfsz LimitaNero,1
goto Controllo
goto LimitaVeloNero
LimitaVeloRetro
call Scrittura
bcf PORTB,Avanti
bsf PORTB,Velo
call Scrivi
Call Delay
Call Delay
movlw 15
movwf LimitaRetro
goto CicloRetro
LimitaVeloRetro1
call Scrittura
bcf PORTB,Avanti
bsf PORTB,Velo
call Scrivi
Call Scrivi
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
Call Delay1
movlw 15
movwf LimitaRetro
goto CicloRetro1
Azzera
Call Scrittura
Movlw 0
movwf PORTB
Call Scrivi
goto Controllo
Scrivi
bsf PORTA,Ck ;Impulso di Clock sul bit Ck del PORTA
bcf PORTA,Ck
return
Scrittura
bsf STATUS,RP0
movlw 00000000B
movwf TRISA
movlw 00000000B
movwf TRISB
bcf STATUS,RP0
bcf PORTA,Select
return
Lettura
bsf STATUS,RP0
movlw 00000000B
movwf TRISA
movlw 11111111B
movwf TRISB
bcf STATUS,RP0
bsf PORTA,Select
return
Delay
bsf STATUS,RP0
movlw 00000010B
movwf OPTION_REG & 0x7F
bcf STATUS,RP0
;Inizializza TMR0 per ottenere 250 conteggi prima di arrivare a zero.
;Il registro TMR0 e' un registro ad 8 bit quindi se viene incrementato
;nuovamentre quando arriva a 255 ricomincia a contare da zero.
;Se lo si inizializza a 6 dovra' essere incrementato 256 - 6 = 250 volte
;prima passare per lo zero.
movlw 6
movwf TMR0
;Il registro Count viene inizializzato a 20 in quanto il suo scopo e' far
;uscire il loop
movlw 20
movwf Count
;Loop di conteggio
DelayLoop
;TMR0 vale 0 ?
movf TMR0,W
btfss STATUS,Z
goto DelayLoop ;No,aspetta...
movlw 6 ;Si, reimposta TMR0 e controlla se
movwf TMR0 ;è passato per 20 volte per lo zero
decfsz Count,1
goto DelayLoop
return
Delay1
bsf STATUS,RP0
movlw 00000000B
movwf OPTION_REG & 0x7F
bcf STATUS,RP0;
;Inizializza TMR0 per ottenere 216 conteggi prima di arrivare a zero.
;Il registro TMR0 e' un registro ad 8 bit quindi se viene incrementato
;nuovamentre quando arriva a 255 ricomincia a contare da zero.
;Se lo si inizializza a 6 dovra' essere incrementato 256 - 40 = 216 volte
;prima passare per lo zero.
movlw 40
movwf TMR0
;Il registro Count viene inizializzato a 20 in quanto il suo scopo e' far
;uscire il loop
movlw 20
movwf Count
;Loop di conteggio
DelayLoop1
;TMR0 vale 0 ?
movf TMR0,W
btfss STATUS,Z
goto DelayLoop1 ;No, aspetta...
movlw 6 ;Si, reimposta TMR0 e controlla se
movwf TMR0 ;e' passato per 20 volte per lo zero
decfsz Count,1
goto DelayLoop1
return
END |