Il progetto Neptune continua nella sua evoluzione. Il PIC 16F628A è stato programmato con l'opportuno software in grado di generare sul pin 0 della porta B una forma d'onda quadrata (duty cycle 50%) di frequenza 100 Hz. Contemporaneamente, utilizzando l'interrupt non mascherabile ed il prescaler interno al microprocessore, si possono generare sul pin 1 della porta B frequenze variabili, a seconda della configurazione posta sui pin 0 e 1 della porta A. Il software, completamente scritto in assembly nativo del 16F628A è riportato subito sotto. L'ambiente di sviluppo, tipico per le MPU Microchip, è stato MPLAB X ver 1.10 e il simulatore/debugger PIC3.

 

;**********************************************************
;* Blink Led ver 4 - Marco Tinari aprile 2012 *
;* Emette sul pin 0 della porta B un'onda quadra *
;* a frequenza dipendente dalla condizione *
;* logica presente sui bit 0 e 1 della porta A *
;* (frequenze generate 7,5Hz 15Hz 30,5Hz 61Hz) *
;* in questa versione viene utilizzato *
;* l'interrupt il prescaler ed il TMR0 *
;**********************************************************
; maschera i warnings per la scelta del banco ram
errorlevel -302
; fissa i parametri di compilazione
processor 16F628a
radix dec
; includi le definizione per il processore
#include P16F628a.inc
; stabilisci i valori per i fuses
__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF
;riserva i byte nell'area dati
cblock 020H
Contatore : 2
Rotator : 1
endc
; definisci l'inizio di esecuzione
org 00H
ResetVector goto Inizio
; definisci ingresso per interrupt
org 04H
InterVector goto Blinkrupt
; codice principale
org 05H
Inizio call Inizializza
Ancora call AccendiLed
call Aspetta
call SpegniLed
call Aspetta
goto Ancora
Aspetta movlw 0x7A ; inizializza il contatore
movwf Contatore ; per attesa di 5ms
movlw 0x07
movwf Contatore+1
Aspetta1 decfsz Contatore, 1
goto Aspetta1
decfsz Contatore+1, 1
goto Aspetta1
return
AccendiLed bcf PORTB, 0 ; metti a 0 il primo bit di PORT B
return
SpegniLed bsf PORTB, 0 ; metti a 1 il primo bit di PORT B
return
AccendiLedRupt
bcf PORTB, 1 ; metti a 0 il secondo bit di PORT B
return
SpegniLedRupt
bsf PORTB, 1 ; metti a 1 il secondo bit di PORT B
return
Inizializza call SelectB1 ; seleziona il bank 1
movlw 11111111B ; tutta la PORT A in input
movwf TRISA
movlw 11111100B ; solo i pin 0 e 1 di PORT B in output
movwf TRISB
bcf OPTION_REG, T0CS ; attiva il clock come sorgente di impulsi
bcf OPTION_REG, PSA ; utilizza il prescaler
bsf OPTION_REG, PS2 ; dividi almeno per 32
call SelectB0 ; ritorna al bank 0
movlw 00000111B ; configurazione per ingressi digitali
movwf CMCON
movlw 01010101B ; inizializza il rotator
movwf Rotator
clrf TMR0
bcf INTCON, T0IF ; pulisci il bit di TMR0 overflow
bsf INTCON, T0IE ; fai partire l'interrupt
bsf INTCON, PEIE ; attiva l'interrupt delle periferiche
bsf INTCON, GIE ; attiva il gestore di interrupt
return
SelectB0 bcf STATUS, RP1 ; seleziona il bank 0
bcf STATUS, RP0
return
SelectB1 bcf STATUS, RP1 ; seleziona il bank 1
bsf STATUS, RP0
return
; gestione dell'interrupt
Blinkrupt call SelectB0
bcf STATUS, C
btfsc Rotator, 0
bsf STATUS, C
Rotate rrf Rotator,1
btfss STATUS, C
goto TurnOff
goto TurnOn
TurnOff call SpegniLedRupt
goto IntReturn
TurnOn call AccendiLedRupt
IntReturn call ReadInput
bcf INTCON, T0IF ; pulisci il bit di overflow del TIMER0
retfie
ReadInput call SelectB0
btfss PORTA,0
goto Ps0Off
call SelectB1
bsf OPTION_REG, PS0
goto TestBit1
Ps0Off call SelectB1
bcf OPTION_REG, PS0
TestBit1 call SelectB0
btfss PORTA,1
goto Ps1Off
call SelectB1
bsf OPTION_REG, PS1
goto EsciRead
Ps1Off call SelectB1
bcf OPTION_REG, PS1
EsciRead call SelectB0
return
end