                __config  0X3F31 

	          	#include "p16f873a.inc"  		;Include header file	          

	        	ORG			0x000           	;il programma parte dalla locazione 0x000  
		    	FLAG        EQU 21H				;registro generico
			  		    
;INIZIALIZZAZIONE PIC

       			BSF    	STATUS,RP0    	     	;banco 1
         		MOVLW	B'11010111'				;pone ogni pin della porta A come ingresso
          		MOVWF	TRISA					;attuazione
          	 	MOVLW	B'11111111'				;pone ogni pin della porta B come ingresso
            	MOVWF	TRISB                   ;attuazione
             	MOVLW	B'11111010'				;pone il pin 1,3,4,5,6,7 della porta C come ingresso ed il pin 0 ed il pin2 come uscita
              	MOVWF	TRISC	     			;attuazione
               	MOVLW   B'00000111'				;setta il prescaler a 1:256 per il Timer 1
				MOVWF   OPTION_REG				;attuazione			
				MOVLW   0X006 					;predispone tutti i pin della porta A per accettare segnali digitali
                MOVWF   ADCON1      			;attuazione	
				BCF   	STATUS,RP0    	     	;banco 0
				CLRF    FLAG					;azzera il registro FLAG
				BCF     PORTA,3					;tiene spento il led del tasto MODE
				BCF     PORTA,5					;tiene spento il led del tasto DECREMENTA
				BCF     PORTC,0					;tiene spento il led del tasto INCREMENTA	

;FINE INIZIALIZZAZIONE PIC

;INIZIO ROUTINE PER IMMETTERE I PARAMENTRI INIZIALI DEL PWM
		
				BSF 	STATUS,RP0 				;banco 1
				MOVLW 	B'00011110' 			;valore iniziale corrispondente alla frequenza di 2Khz da immettere nel registro PR2			
				MOVWF 	PR2 					;immette il valore relativo alla frequenza di 2Khz nel registro PR2
				BCF     STATUS,RP0				;banco 0
				BCF    	STATUS,C				;azzera il Carry
				MOVWF 	CCPR1L					;carica il valore di PR2 nel registro CCPR1L
				RRF     CCPR1L,f				;divide per 2 il contenuto del registro CCPR1L che con i due bit significativi del registro CCP1CON risulterà
												;il doppio del valore contenuto in PR2.	
				MOVLW 	B'00000111' 			;attiva il TIMER 2 e predispone il prescaler a 16
				MOVWF 	T2CON					;attuazione
				MOVLW 	B'00001100' 			;attiva il funzionamento del modulo PWM
				MOVWF	CCP1CON					;attuazione

;FINE ROUTINE PER IMMETTERE I PARAMENTRI INIZIALI DEL PWM

;INIZIO ROUTINE PER LA LETTURA TASTI

LOOP_1
				CALL    RITARDO					;ritardo occorrente per rallentare l'incremento ed il decremento della frequenza
				CALL    RITARDO					;	"
				BCF     PORTA,5					;spegne il led del tasto DECREMENTA
				BCF     PORTC,0					;spegne il led del tasto INCREMENTA
			
				BTFSS   PORTA,2					;il tasto mode è premuto? si = va a RESETTA_SETTA_FLAG, no = salta
				GOTO    RESETTA_SETTA_FLAG		;va alla routine RESETTA_SETTA_FLAG
				BTFSC   FLAG,0					;il valore nel registro FLAG è, 1 = i testi DECREMENTA ed INCREMENTA agiscono sul Duty-Cycle, è 0 = i tasti
												;DECREMENTA ed INCREMENTA agiscono sulla frequenza
				GOTO    REGOLA_DC				;va ala routine REGOLA_DC
			    BTFSS	PORTA,0					;il tasto è premuto sull'ingresso 0 della porta A, si = va alla routine DECREMENTA frequenza, 
												;no = salta alla seconda istruzione
				GOTO    DECREMENTA				;routine che diminuisce la frequanza
				BTFSS   PORTA,1					;il tasto è premuto sull'ingresso 1 della porta A, si = va alla routine INCREMENTA, 
												;no = salta alla seconda istruzione
	
				GOTO    INCREMENTA				;routine che aumenta la frequanza
				GOTO    LOOP_1					;torna a leggere i tasti

DECREMENTA
				BSF 	STATUS,RP0 				;banco 1
				INCF	PR2,f					;incrementa il valore nel registro PR2, ovvero decrementa la frequanza
				MOVF    PR2,W					;attuazione
				BCF 	STATUS,RP0 				;banco 0
				BCF    	STATUS,C				;azzera il Carry
				MOVWF 	CCPR1L					;carica il valore di PR2 nel registro CCPR1L
				RRF     CCPR1L,f				;divide per 2 il contenuto del registro CCPR1L che con i due bit significativi del registro CCP1CON risulterà
												;il doppio del valore contenuto in PR2.	
				BSF     PORTA,5					;accende il led del tasto DECREMENTA
				GOTO    LOOP_1					;torna a leggere i tasti


INCREMENTA
				bsf 	STATUS,RP0				;banco 1 
				DECF	PR2,f					;decrementa il valore nel registro PR2, ovvero decrementa la frequanza
				MOVF    PR2,W					;attuazione
				bcf 	STATUS,RP0 				;banco 0	
				BCF    	STATUS,C				;azzera il Carry
				MOVWF 	CCPR1L					;carica il valore di PR2 nel registro CCPR1L
				RRF     CCPR1L,f				;divide per 2 il contenuto del registro CCPR1L che con i due bit significativi del registro CCP1CON risulterà
												;il doppio del valore contenuto in PR2.	
				BSF     PORTC,0					;accende il led del tasto INCREMENTA
				GOTO    LOOP_1					;torna a leggere i tasti

RESETTA_SETTA_FLAG
				BTFSS   FLAG,0					;se il valore nel registro FLAG è 0 va alla routine SETTA_FLAG, se è 1 salta
				GOTO    SETTA_FLAG				;va alala routine SETTA_FLAG
				BCF     PORTA,3					;spegni il led del tasto MODE
				CLRF    FLAG					;azzera il registro FLAG
				BSF     STATUS,RP0				;banco 1
				MOVF    PR2,W					;salva PR2 in W				
				BCF     STATUS,RP0				;banco 0
				BCF    	STATUS,C				;azzera il Carry
				MOVWF 	CCPR1L					;carica il valore di PR2 nel registro CCPR1L
				RRF     CCPR1L,f				;divide per 2 il contenuto del registro CCPR1L che con i due bit significativi del registro CCP1CON risulterà
												;il doppio del valore contenuto in PR2.	
				GOTO    LOOP_1					;torna a leggere i tasti
SETTA_FLAG
				BSF     PORTA,3					;accende il led del tasto MODE
				INCF    FLAG,f					;incrementa il registro FLAG
				GOTO    LOOP_1					;torna a leggere i tasti

REGOLA_DC
				BTFSS   PORTA,0					;se il testo DECREMENTA è premuto diminuisce ilDuty-Cycle se no salta
				GOTO    DIMINUISCI_DC			;va alla routine DIMINUSCI_DC
				BTFSS   PORTA,1					;se il tasto INCREMENTA	 è premuto aumenta il Duty-Cycle se no salta
				GOTO    AUMENTA_DC				;va alla routine AUMENTA_DC
				GOTO    LOOP_1					;torna a leggere i tasti

AUMENTA_DC
				BSF     PORTC,0					;accende il led del tasto INCREMENTA
				INCF    CCPR1L,f				;aumenta il Duty-Cycle
				GOTO    LOOP_1					;torna a leggere i tasti
DIMINUISCI_DC   
				BSF     PORTA,5					;accende il led del tasto DECREMENTA
				
				DECF    CCPR1L,f				;diminuisce il Duty-Cycle
				GOTO    LOOP_1					;torna a leggere i tasti	

;FINE ROUTINE PER LA LETTURA TASTI
				

;INIZIO ROUTINE RITARDO
					
RITARDO
                CLRW                            ;cancella il registro W.
                MOVWF   TMR0                    ;azzara il timer0.
                BCF     INTCON,TMR0IF           ;azzera il bit di overflow del timer0
LOOP
                BTFSS   INTCON,TMR0IF           ;ripete il loop  fintanto il registro ha raggiunto il valore 0xFF.
                GOTO    LOOP                    ;torna alla routine LOOP
                RETLW    0                      ;ritorna.	
	
;FINE ROUTINE RITARDO

END
