|
| |

Il programma in ASSEMBLY bisogna comporlo in tre parti, la prima
riguarda la scrittura delle etichette, principalmente per identificare una riga,
la seconda è quella riguardante le istruzione, e la terza riguarda i commenti,
sempre preceduti da un punto e virgola “;”.
Prima di procedere alla stesura del programma bisogna dare delle direttive,
come:
1) Scelta del tipo di microprocessore (preceduta dall’istruzione “LIST”;
2) Scelta della base numerica (preceduta dall’istruzione “RADIX”);
3) Scelta dell’header file (preceduta dall’istruzione “INCLUDE”);
4) Scelta della configurazione di lavoro (preceduta dall’istruzione “__CONFIG”);
5) Scelta delle variabili (come ad esempio: X RES 1. Significa che abbiamo
inserito un registro di nome “X”, che occupa nella memoria uno spazio pari a 1
Byte);
Programmi:
-"evita gli ostacoli";
-"evita gli ostacoli"+"inseguitore di luce".
Torna ad inizio
pagina
Ecco il
programma che esegue “evita gli ostacoli”:
;**********************************************************************************************************
;
; Creatore:
Classe: Quinta
Programma: ROBOT
;
; -Pali Alessio
Sezione: O
Funzione del programma: Fare in modo che il Robot comandato da ;
questo programma eviti gli ostacoli che gli ostruiscono la via.
;
; Data: 30/05/2007
;
;**********************************************************************************************************
;ROBOT
LIST P=16F876A ;SCELTA MICROCONTROLLORE
RADIX DEC ;SCELTA BASE NUMERICA
INCLUDE <P16F876A.INC> ;HEADER FILE
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON &
_PWRTE_ON & _WDT_OFF & _XT_OSC
ORG 20H
X RES 1 ;DICHIARAZIONE VARIABILE ‘X’
Y RES 1 ;DICHIARAZIONE VARIABILE ‘Y’
ORG 00H
BSF STATUS,RP0 ;ENTRIAMO NEL BANCO #1 PER CONFIGURARE IN E OUT
MOVLW 0XFF ;CREIAMO IL DATO ‘1111’ NEL REGISTRO ‘W’
MOVWF TRISA ;CARICO NEL REGISTRO TRISA IL DATO PRIMA CARICATO IN ‘W’
CLRF TRISB ;IMPOSTIAMO TUTTA LA LINEA COME USCITA PER I MOTORI
MOVLW B'01001110' ;CREIAMO IL DATO ‘01001110’ NEL REGISTRO ‘W’
MOVWF ADCON1 ;CONFIGURO PORTA COME IN DIGITALE
BCF STATUS,RP0 ;TORNIAMO NEL BANCO #0
BCF ADCON0,2 ;DISATTIVIAMO IL CONVERTITORE
CLRF PORTA ;AZZERIAMO TUTTA L’USCITA PER EVITARE ERRORIALL’ACCENSIONE
INIZIO
BCF ADCON0,2 ;DISATTIVIAMO IL CONVERTITORE
BCF PORTC,1
BSF PORTC,2
BTFSS PORTA,3 ;TESTIAMO IL SENSORE DX E SE E' ATTIVO SALTIAMO
;UNA RIGA
GOTO SENLEFT ;VADO A TESTARE IL SENSORE DI SINISTRA
CICLO2
CALL INDIETRO ;IL ROBOT VA INDIETRO
CALL DELAY ;RITARDO
CALL DELAY ;RITARDO
BTFSC PORTA,3 ;RITESTA IL SENSORE DX PER EVITARE ERRORI DI
;POSIZIONE
GOTO CICLO2 ;SE SI VERIFICA,SIGNIFICA CHE IL ROBOT SENTE
;L'OSTACOLO E VA AL CICLO 2 ED INDIETREGGIA
CALL SINISTRA ;IL ROBOT GIRA A SINISTRA
CALL DELAY ;ENTRIAMO NEL CICLO DI TEMPORIZZAZIONE
CALL DELAY ;RITARDO
CALL AVANTI ;IL ROBOT VAAVANTI
GOTO START ;TORNIAMO ALL'INIZIO DEL PROGRAMMA
SENLEFT
BTFSS PORTA,2 ;TESTIAMO IL SENSORE SX E SE E' ATTIVO SALTIAMO
;UNA RIGA
GOTO START ;TORNIAMO A TESTARE IL SENSORE DX
CICLO3
CALL INDIETRO ;IL ROBOT VA INDIETRO
CALL DELAY ;RITARDO
CALL DELAY ;RITARDO
BTFSC PORTA,2 ;TESTA IL SENSORE SX PER EVITARE ERRORI DI
;POSIZIONE
GOTO CICLO3 ;SE SI VERIFICA, SIGNIFICA CHE IL ROBOT SENTE
;L'OSTACOLO ED INDIETREGGIA
CALL DESTRA ;IL ROBOT GIRA A DESTRA
CALL DELAY ;ENTRIAMO NEL CICLO DI TEMPORIZZAZIONE
CALL DELAY ;RITARDO
CALL AVANTI ;IL ROBOT VAAVANTI
GOTO INIZIO ;TORNIAMO ALL'INIZIO DEL PROGRAMMA
;**********************************************************************************************************
;Procedura di ritardo
;**********************************************************************************************************
DELAY
MOVLW 0XFF ;CREIAMO IL DATO 256 NELL'ACCUMULATORE W
MOVWF X ;CARICHIAMO IL DATO DI W IN 'X'
MOVLW 0XFF ;CREIAMO IL DATO 256 NELL'ACCUMULATORE W
MOVWF Y ;CARICHIAMO IL DATO DI W IN 'Y'
ESTER
DECFSZ X,1 ;DECREMENTIAMO DI 1 IL REGISTRO 'X'
GOTO INTER
GOTO FINE
INTER
DECFSZ Y,1 ;DECREMENTIAMO DI 1 IL REGISTRO 'Y'
GOTO INTER
GOTO ESTER
FINE
RETURN ;FINE DELLA SUBROUTINE
;**********************************************************************************************************
;Il Robot va a marcia avanti
;**********************************************************************************************************
AVANTI
BCF PORTB,0 ;MOTORE SX AVANTI
BSF PORTB,1 ;MOTORE SX AVANTI
BCF PORTB,2 ;MOTORE DX AVANTI
BSF PORTB,3 ;MOTORE DX AVANTI
BCF PORTB,4 ;LED SX ON
BCF PORTB,5 ;LED DX ON
RETURN
;**********************************************************************************************************
;Il Robot gira a destra
;**********************************************************************************************************
DESTRA
BCF PORTB,0 ;MOTORE SX AVANTI
BSF PORTB,1 ;MOTORE SX AVANTI
BCF PORTB,2 ;MOTORE DX FERMO
BCF PORTB,3 ;MOTORE DX FERMO
BSF PORTB,4 ;LED SX OFF
BCF PORTB,5 ;LED DX ON
RETURN
;**********************************************************************************************************
;Il Robot gira a sinistra
;**********************************************************************************************************
SINISTRA
BCF PORTB,0 ;MOTORE SX FERMO
BCF PORTB,1 ;MOTORE SX FERMO
BCF PORTB,2 ;MOTORE DX AVANTI
BSF PORTB,3 ;MOTORE DX AVANTI
BCF PORTB,4 ;LED SX ON
BSF PORTB,5 ;LED DX OFF
RETURN
;**********************************************************************************************************
;Il Robot va indietro
;**********************************************************************************************************
INDIETRO
BSF PORTB,0 ;MOTORE SX AVANTI
BCF PORTB,1 ;MOTORE SX AVANTI
BSF PORTB,2 ;MOTORE DX FERMO
BCF PORTB,3 ;MOTORE DX FERMO
BSF PORTB,4 ;LED SX OFF
BSF PORTB,5 ;LED DX OFF
RETURN
END
Torna ad inizio
pagina
Ecco il programma che esegue “evita gli ostacoli” più “inseguitore di luce”:
;**********************************************************************************************************
; Progetto Robot: evita gli ostacoli ed
insegue una fonte di luce.
;
; _Creatori: Classe 5^O
Anno scolastico: 2006/07
;
; -Antonietti simone
; -Boschetti Davide
; -Pali Alessio
Data: 30/05/07
;
;**********************************************************************************************************
LIST P=PIC16F876A ;SCELTA MICROCHIP
RADIX DEC ;SCELTA BASE NUMERICA
INCLUDE <P16F876A.INC> ;HEADER FILE
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON &
_PWRTE_ON & _WDT_OFF & _XT_OSC
ORG 20H
X RES 1 ;DICHIARAZIONE VARIABILE X
Y RES 1 ;DICHIARAZIONE VARIABILE Y
PROG RES 1 ;DICHIARAZIONE VARIABILE PROG
FR_DX RES 1 ;DICHIARAZIONE VARIABILE FOTORES DX
DECI RES 1 ;DICHIARAZIONE VARIABILE CONTATORE DEC
ORG 00H ;INDIRIZZO D'INIZIO
BCF STATUS,6 ;BANCO 1
BSF STATUS,5 ;BANCO 1
MOVLW 0FFH ;CARICO IN W FFH PER IMPOSTARE IL TRISA
MOVWF TRISA ;TRISA CONFIGURATO COME INGRESSO
MOVLW 00H ;CARICO IN W 00H PER IMPOSTARE IL TRISB
MOVWF TRISB ;TRISB CONFIGURATO COME USCITA
MOVLW 001H ;CARICO IN W 01H PER IMPOSTARE IL TRISC
MOVWF TRISC ;TRISC CONFIG COME INGRESSO (0) E USCITA (1;2)
BCF STATUS,5 ;BANCO 0
CLRF PORTC
CLRF PROG
CLRF PORTB ;PORTB TUTTO SPENTO
;**********************************************************************************************************
;Scelta del programma da eseguire
;**********************************************************************************************************
INIZIO
START
BTFSC PORTC,0 ;TEST PER LA SCELTA DEL PROGRAMMA
GOTO SCELTA1 ;VADO A TESTARE IL BIT 0 DEL REGISTRO 'PROG'
SCELTA2
BTFSS PORTC,0
GOTO SCELTA2
COMF PROG ;COMPLEMENTO IL REGISTRO 'PROG'
BTFSS PROG,0 ;TESTO IL BIT 0 DEL REGISTRO 'PROG'
GOTO ULTR ;VA AL PROGRAMMA DEGLI ULTRASUONI
GOTO FRT ;VA AL PROGRAMMA DELLE FOTORESISTENZE
SCELTA1
BTFSS PROG,0
GOTO ULTR ;VA AL PROGRAMMA DEGLI ULTRASUONI
GOTO FRT ;VA AL PROGRAMMA DELLE FOTORESISTENZE
;**********************************************************************************************************
;Programma ROBOT con Ultrasuoni
;**********************************************************************************************************
ULTR
BCF STATUS,6 ;BANCO 1
BSF STATUS,5 ;BANCO 1
MOVLW B'00000111' ;CARICO IN W IL NUMERO BINARIO '00000111'
;PER IMPOSTARE IL ADCON1
MOVWF ADCON1 ;ADCON1 CONFIG GIUSTIFICAZIONE(SX) E IN ANALOGOCI
BCF STATUS,5 ;BANCO 0
BCF ADCON0,2 ;DISATTIVIAMO IL CONVERTITORE
BCF PORTC,1
BSF PORTC,2
BTFSS PORTA,3 ;TESTIAMO IL SENSORE DX E SE E' ATTIVO SALTIAMO
;UNA RIGA
GOTO SENLEFT ;VADO A TESTARE IL SENSORE DI SINISTRA
CICLO2
CALL INDIETRO1 ;IL ROBOT VA INDIETRO
CALL DELAY ;RITARDO
CALL DELAY ;RITARDO
BTFSC PORTA,3 ;RITESTA IL SENSORE DX PER EVITARE ERRORI DI
;POSIZIONE
GOTO CICLO2 ;SE SI VERIFICA,SIGNIFICA CHE IL ROBOT SENTE
;L'OSTACOLO E VA AL CICLO 2 ED INDIETREGGIA
CALL SINISTRA1 ;IL ROBOT GIRA A SINISTRA
CALL DELAY ;ENTRIAMO NEL CICLO DI TEMPORIZZAZIONE
CALL DELAY1 ;RITARDO
CALL AVANTI1 ;IL ROBOT VAAVANTI
GOTO START ;TORNIAMO ALL'INIZIO DEL PROGRAMMA
SENLEFT
BTFSS PORTA,2 ;TESTIAMO IL SENSORE SX E SE E' ATTIVO SALTIAMO
;UNA RIGA
GOTO START ;TORNIAMO A TESTARE IL SENSORE DX
CICLO3
CALL INDIETRO1 ;IL ROBOT VA INDIETRO
CALL DELAY ;RITARDO
CALL DELAY ;RITARDO
BTFSC PORTA,2 ;TESTA IL SENSORE SX PER EVITARE ERRORI DI
;POSIZIONE
GOTO CICLO3 ;SE SI VERIFICA, SIGNIFICA CHE IL ROBOT SENTE
;L'OSTACOLO ED INDIETREGGIA
CALL DESTRA1 ;IL ROBOT GIRA A DESTRA
CALL DELAY ;ENTRIAMO NEL CICLO DI TEMPORIZZAZIONE
CALL DELAY1 ;RITARDO
CALL AVANTI1 ;IL ROBOT VAAVANTI
GOTO START ;TORNIAMO ALL'INIZIO DEL PROGRAMMA
;**********************************************************************************************************
;Programma ROBOT con Fotoresistenze
;**********************************************************************************************************
FRT
BCF STATUS,6 ;BANCO 1
BSF STATUS,5 ;BANCO 1
MOVLW 04H ;CARICO IN W 04H PER IMPOSTARE IL ADCON1
MOVWF ADCON1 ;ADCON1 CONFIG GIUSTIFICAZIONE(SX) E IN ANALOGOCI
BCF STATUS,5 ;BANCO 0
BSF PORTC,1
BCF PORTC,2
CLRF ADCON0 ;RESETTO ADCON0 PER INIZIO CONFIGURAZIONE
BSF ADCON0,3 ;IN ANALOGICO 1 QUINDI FR_DX
CALL ACQUISISCI
MOVWF FR_DX ;SALVO IL DATO DELLA FR DX
CLRF ADCON0 ;RESETTO ADCON0 PER INIZIO CONFIGURAZIONE
CALL ACQUISISCI
SUBWF FR_DX,W ;CONFRONTO LE FR DX E SX
BTFSC STATUS,Z ;SE SONO UGUALI AVANTI CIURMA
CALL AVANTI2
BTFSC STATUS,C ;CONTROLLO CARRY PER ANDARE O A SX O A DX
CALL DESTRA2 ;GIRARE A DESTRA
BSF STATUS,C ;CARICARE IL CARRY PER PROSSIMA ACQUISIZIONE
CALL SINISTRA2 ;GIRARE A SINISTRA
ACQUISISCI
BSF ADCON0,7 ;SELEZIONO FRC (CK INTERNO)
BSF ADCON0,6 ;SELEZIONO FRC (CK INTERNO)
BSF ADCON0,0 ;AD_ON ACCENSIONE ADC
CALL DELAY1 ;ATTESA ACCENSIONE
BSF ADCON0,2 ;ADC GO (CONVERSIONE START)
CICLOF
BTFSC ADCON0,2 ;TEST SUL GO/DONE' (ASPETTO FINE CONVERSIONE)
GOTO CICLOF
MOVF ADRESH,W ;SPOSTO IL DATO IN W
RETURN
;**********************************************************************************************************
;Procedura di ritardo(1)
;**********************************************************************************************************
DELAY
MOVLW 0XFF ;CREIAMO IL DATO 256 NELL'ACCUMULATORE W
MOVWF X ;CARICHIAMO IL DATO DI W IN 'X'
MOVLW 0XFF ;CREIAMO IL DATO 256 NELL'ACCUMULATORE W
MOVWF Y ;CARICHIAMO IL DATO DI W IN 'Y'
ESTER
DECFSZ X,1 ;DECREMENTIAMO DI 1 IL REGISTRO 'X'
GOTO INTER
GOTO FINE
INTER
DECFSZ Y,1 ;DECREMENTIAMO DI 1 IL REGISTRO 'Y'
GOTO INTER
GOTO ESTER
FINE
RETURN ;FINE DELLA SUBROUTINE
;**********************************************************************************************************
;Procedura di ritardo(2)
;**********************************************************************************************************
DELAY1
MOVLW 0FFH ;CARICO IN W FFH PER INSERIRLO IN DEC
MOVWF DECI ;SPOSTO IN DEC IL DATO PRESENTE IN W
DECRE
DECFSZ DECI,1 ;DECREMENTO DEC FINO A 00H
GOTO DECRE ;ATTESA FINE DECREMENTO
RETURN ;TORNO ALLA CHIAMATA
;**********************************************************************************************************
;Il Robot va a marcia avanti
;**********************************************************************************************************
AVANTI2
BCF PORTB,0 ;MOTORE SX AVANTI
BSF PORTB,1 ;MOTORE SX AVANTI
BCF PORTB,2 ;MOTORE DX AVANTI
BSF PORTB,3 ;MOTORE DX AVANTI
BCF PORTB,4 ;LED SX ON
BCF PORTB,5 ;LED DX ON
GOTO INIZIO ;RICOMINCIA IL CICLO ACQUISIZIONE
AVANTI1
BCF PORTB,0 ;MOTORE SX AVANTI
BSF PORTB,1 ;MOTORE SX AVANTI
BCF PORTB,2 ;MOTORE DX AVANTI
BSF PORTB,3 ;MOTORE DX AVANTI
BCF PORTB,4 ;LED SX ON
BCF PORTB,5 ;LED DX ON
RETURN
;**********************************************************************************************************
;Il Robot gira a destra
;**********************************************************************************************************
DESTRA2
BCF PORTB,0 ;MOTORE SX AVANTI
BSF PORTB,1 ;MOTORE SX AVANTI
BCF PORTB,2 ;MOTORE DX FERMO
BCF PORTB,3 ;MOTORE DX FERMO
BSF PORTB,4 ;LED SX OFF
BCF PORTB,5 ;LED DX ON
GOTO INIZIO ;RICOMINCIA IL CICLO ACQUISIZIONE
DESTRA1
BCF PORTB,0 ;MOTORE SX AVANTI
BSF PORTB,1 ;MOTORE SX AVANTI
BCF PORTB,2 ;MOTORE DX FERMO
BCF PORTB,3 ;MOTORE DX FERMO
BSF PORTB,4 ;LED SX OFF
BCF PORTB,5 ;LED DX ON
RETURN
;**********************************************************************************************************
;Il Robot gira a sinistra
;**********************************************************************************************************
SINISTRA2
BCF PORTB,0 ;MOTORE SX FERMO
BCF PORTB,1 ;MOTORE SX FERMO
BCF PORTB,2 ;MOTORE DX AVANTI
BSF PORTB,3 ;MOTORE DX AVANTI
BCF PORTB,4 ;LED SX ON
BSF PORTB,5 ;LED DX OFF
GOTO INIZIO ;RICOMINCIA IL CICLO ACQUISIZIONE
SINISTRA1
BCF PORTB,0 ;MOTORE SX FERMO
BCF PORTB,1 ;MOTORE SX FERMO
BCF PORTB,2 ;MOTORE DX AVANTI
BSF PORTB,3 ;MOTORE DX AVANTI
BCF PORTB,4 ;LED SX ON
BSF PORTB,5 ;LED DX OFF
RETURN
;**********************************************************************************************************
;Il Robot va indietro
;**********************************************************************************************************
INDIETRO1
BSF PORTB,0 ;MOTORE SX AVANTI
BCF PORTB,1 ;MOTORE SX AVANTI
BSF PORTB,2 ;MOTORE DX FERMO
BCF PORTB,3 ;MOTORE DX FERMO
BSF PORTB,4 ;LED SX OFF
BSF PORTB,5 ;LED DX OFF
RETURN
END
Torna ad inizio
pagina
pagina
|