Programma Completo
Home Hardware Software Gallery Crediti

 

Software Programma Software Utilizzati

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                              ;;
;; 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