Gestione di un impianto semaforico

con microcontrollore PIC 16F84.

Schema elettrico

Elenco componenti

3 diodi LED di colore Rosso, Verde e Giallo. 3 Resistenze da 270Ω. 4 Resistenze da 10KΩ. 3 Pulsanti normalmente chiusi (NC), 1 Pulsante normalmente aperto (NA) per il RESET.

 Descrizione

Si riporta il listato del programma in linguaggio assembly per il PIC 16F84.

La porta B è impostata come uscita.. Le linee RB0 RB1 RB2 pilotano, rispettivamente, i LED ROSSO , GIALLO e VERDE.

La porta A è impostata come ingresso. La subroutine SCELTA seleziona la modalità di funzionamento:

·         Un impulso positivo su RA0 (RA2RA1RA0 = 001) attiva la sequenza del normale funzionamento del semaforo (subroutine FUNZ);

·         Un impulso positivo su RA1 (RA2RA1RA0 = 010) attiva il ciclo notte per cui si ha il giallo lampeggiante (subroutine NOTTE);

·         Un impulso positivo su RA2 (RA2RA1RA0 = 100) pone il PIC in modalità SLEEP (subroutine FERMA).

Per riprendere il funzionamento è necessario fornire un impulso di RESET sul piedino MCLR.

La subroutine DELAY imposta la durata dell’accensione dei diodi LED.

; **SEMAFORO**

PROCESSOR 16F84

RADIX DEC

INCLUDE "P16F84.INC"

ORG 0CH

Sema            RES 1

Moda            RES 1

Count            RES 1

Count1          RES 1

INIZIO:

 ORG 00H

 bsf STATUS,RP0

 movlw 00H

 movwf Sema

 movlw 255

 movwf TRISA

 movlw 00000011B

 movwf OPTION_REG

 bcf STATUS,RP0

 movlw 00H

 movwf Sema

 movlw 00H

 movwf Moda

 call SCELTA:

 goto 00H

SCELTA:

 bcf STATUS,RP0

 movf PORTA,0

 movwf Moda

 BTFSC Moda,0

 goto FUNZ

 BTFSC Moda,1

 goto NOTTE

 BTFSC Moda,2

 goto FERMA

 return

FUNZ:

 bsf STATUS,RP0

 movlw 00H

 movwf TRISB

 bcf STATUS,RP0

;Accende VERDE

 movlw 100B

 movwf Sema

movwf PORTB

call DELAY

call DELAY

call DELAY

call SCELTA:

;Accende GIALLO

 movlw 010B

 addwf Sema

 movf Sema,w

 movwf PORTB

 call DELAY

 call SCELTA:

;Accende ROSSO

 movlw 001B

 movwf Sema

 movf Sema,w

 movwf PORTB

 call DELAY

 call DELAY

 call SCELTA:

 goto FUNZ

NOTTE:

 bsf STATUS,RP0

 movlw 00H

 movwf OPTION_REG

 movlw 11111101B

 movwf TRISB

 bcf STATUS,RP0

 bsf PORTB,1

GA ; Giallo Acceso

 call DELAY1

 btfsc PORTB,1

 goto GS

 bsf PORTB,1

 call SCELTA:

 goto GA

GS ; Giallo Spento

 bcf PORTB,1

 call SCELTA:

 goto GA

DELAY:

 movlw 00000101B

 movwf OPTION_REG

 movlw 6

 movwf TMR0

movlw 125

 movwf Count

DelayLoop

 movf TMR0,W

 btfss STATUS,Z

 goto DelayLoop

 movlw 6

 movwf TMR0

 decfsz Count,1

 goto DelayLoop

return

DELAY1:

 movlw 00000011B

 movwf OPTION_REG

 movlw 6

 movwf TMR0

 movlw 125

 movwf COUNT1

DelayLoop1

 movf TMR0,w

 btfss STATUS,Z

goto DelayLoop1

 movlw 6

 movwf TMR0

 decfsz COUNT1,1

 goto DelayLoop1

 return

FERMA:

 BTFSC Moda,2

 sleep

 goto INIZIO

 END