1- fai una GOTO ad una subroutine che termina con RETURN. Il GOTO è un salto incondizionato e quindi il RETURN in fondo alla procedura manda in palla il programma. Il micro giunto a quel punto si resetta e riparte da capo. Al posto del GOTO devi mettere l' istruzione CALL:
- Codice: Seleziona tutto
NUOVA: BSF ADCON0,2 ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
BTFSC ADCON0,2 ;TEST BIT2 DI ADCON, SE 0 SALTA ISTRUZIONE SUCCESSIVA
GOTO $-1 ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
BTFSS PORTB,0
CALL VIS
2- dentro alla soubroutine VIS fai una GOTO $-2 mandando il programma a ricaricare il registro C2 con il valore contenuto in W. Il valore contenuto in quel momento è 255 quindi entra in un loop dal quale non esce più. Devi sostituire il GOTO $-2 con GOTO $-1 e valutare bene se il tempo sia sufficiente. Simulando si vede che i display rimangono accesi soltanto per circa 400µs. Ovviamente tenendo premuto il pulsante la visualizzazione si ripete ad una frequenza di 2,5kHz, questo fa si che non venga risolto il problema delle cifre "ballerine" perché ad ogni refresh dei display è associata una differente lettura del convertitore A/D.
Ti ho modificato il programma facendo in modo che la visualizzazione rimanga attiva per circa 1s. Prova a vedere se ti piace, ovviamente durante il tempo in cui viene visualizzata la cifra gli altri pulsanti saranno disattivi :
- Codice: Seleziona tutto
; FUNZIONE: 3 pulsanti comandano 3 posizioni definite di un servocomando
; E CONVERTE UNA TENSIONE ANALOGICA 0-5V IN DATO DIGITALE A 8 BIT SU PORTC,
; ALLINEAMENTO A SINISTRA, CONVERTE IN CONTINUAZIONE.
; ZAMBON GIOSUE 27/02/2011
#include P16F876A.INC
__CONFIG 3F72H
COUNT_1 EQU 20H ; REGISTRO Ton DEL PWM
COUNT_2 EQU 21H ; REGISTRO Toff DEL PWM
COUNT_3 EQU 22H ; REGISTRO DI RITARDO
COUNT_TIME EQU 23H ; REGISTRO DURATA SEGNALE
C1 EQU 24H
C2 EQU 25H ;INDIRIZZO REGISTRO PRIMO CONTATORE
C3 EQU 26H
C4 EQU 27H
BANKSEL TRISA ; CONFIGURA RA0 COME INGRESSO GLI ALTRI COME USCITE
MOVLW B'00000001'
MOVWF TRISA
BANKSEL PORTA ; CONFIGURA LE USCITE DELLA PORTA A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTA
BANKSEL TRISB ; CONFIGURA RB0,RB3,RB4,RB5 COME INGRESSI GLI ALTRI COME USCITE
MOVLW B'00111001'
MOVWF TRISB
BANKSEL PORTB ; CONFIGURA LE USCITE DELLA PORTB A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTB
BANKSEL OPTION_REG ; RESISTENZE DI PULL-UP INTERNE SU RB0,RB3,RB4 E RB5
BCF OPTION_REG,7
BANKSEL TRISC ; CONFIGURA TRISC COME TUTTE USCITE
MOVLW B'00000000'
MOVWF TRISC
BANKSEL PORTC ; CONFIGURA LE USCITE DELLA PORTC A LIVELLO LOGICO BASSO
MOVLW B'00000000'
MOVWF PORTC
ORG 40H
MOVLW D'30' ; PRECARICA IL CONTATORE COUNT_TIME
MOVWF COUNT_TIME
START_ADC: BCF STATUS,7
BSF STATUS,5
MOVLW B'00001110'
MOVWF ADCON1
BCF STATUS,7
BCF STATUS,5
MOVLW B'10000001' ;IN W CODICE FOSC/32, CANALE, A\D ON
MOVWF ADCON0 ;SPOSTA IL CODICE IN ADCON0 BANCO 0
CALL DELAY ;CHAMA LA ROUTINE DI RITARDO
NUOVA: BSF ADCON0,2 ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
BTFSC ADCON0,2 ;TEST BIT2 DI ADCON, SE 0 SALTA ISTRUZIONE SUCCESSIVA
GOTO $-1 ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
BTFSS PORTB,0
CALL VIS
START_PWM: BTFSS PORTB,4 ;TESTA PULSANTE COLLEGATO A RB4
GOTO SET1
BTFSS PORTB,5 ;TESTA PULSANTE COLLEGATO A RB5
GOTO SET2
BTFSS PORTB,3 ;TESTA PULSANTE COLLEGATO A RB3
GOTO SET3
GOTO NUOVA ;ESEGUI NUOVAMENTE CONTROLLI
SET1: MOVLW D'8' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'247' ; PRECARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
GOTO POSIZIONE1
; POSIZIONE1: genera il segnale PWM con frequenza di 50Hz e Ton =0,6ms
; si attiva alla pressione del pulsante collegato a RB4.
; Per variare la posizione assunta dal servocomando quando si preme RB4
; variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
; attenzione che la loro somma deve sempre risultare 255.
; Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando
; per il tempo necessario all' albero per compiere la rotazione voluta.
POSIZIONE1: BSF PORTA,5 ; SETTA A LIVELLO LOCICO ALTO RA5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'8' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTA,5 ; SETTA A LIVELLO LOGICO BASSO RA5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'247' ; RICARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
DECFSZ COUNT_TIME ; DECREMENTA IL COUNT_TIME
GOTO POSIZIONE1
MOVLW D'30' ; RICARICA IL COUNT_TIME
MOVWF COUNT_TIME
GOTO NUOVA
SET2: MOVLW D'28' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'227' ; PRECARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
GOTO POSIZIONE2
; POSIZIONE2: genera il segnale PWM con frequenza di 50Hz e Ton =2.4ms
; si attiva alla pressione del pulsante collegato a RB5.
; Per variare la posizione assunta dal servocomando quando si preme RB5
; variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
; attenzione che la loro somma deve sempre risultare 255.
; Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando
; per il tempo necessario all' albero per compiere la rotazione voluta.
POSIZIONE2: BSF PORTA,5 ; SETTA A LIVELLO LOCICO ALTO RA5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'28' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTA,5 ; SETTA A LIVELLO LOGICO BASSO RA5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'227' ; RICARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
DECFSZ COUNT_TIME ; DECREMENTA IL COUNT_TIME
GOTO POSIZIONE2
MOVLW D'30' ; RICARICA IL COUNT_TIME
MOVWF COUNT_TIME
GOTO NUOVA
SET3: MOVLW D'18' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'237' ; PRECARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
GOTO POSIZIONE3
; POSIZIONE3: genera il segnale PWM con frequenza di 50Hz e Ton =1,6ms)
; si attiva alla pressione del pulsante collegato a RB5.
; Per variare la posizione assunta dal servocomando quando si preme RB5
; variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
; attenzione che la loro somma deve sempre risultare 255.
; Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando
; per il tempo necessario all' albero per compiere la rotazione voluta.
POSIZIONE3: BSF PORTA,5 ; SETTA A LIVELLO LOCICO ALTO RA5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'18' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTA,5 ; SETTA A LIVELLO LOGICO BASSO RA5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'237' ; RICARICA IL CONTATORE COUNT_2
MOVWF COUNT_2
DECFSZ COUNT_TIME ; DECREMENTA IL COUNT_TIME
GOTO POSIZIONE3
MOVLW D'30' ; RICARICA IL COUNT_TIME
MOVWF COUNT_TIME
GOTO NUOVA
DELAY: MOVLW 0FH
MOVWF C1
LOOP1: DECFSZ C1,1 ;DECR.REG.E SALTA ISTRUZ. SUCCESSIVA SE è 0
GOTO LOOP1
RETURN
DELAY_ON: DECFSZ COUNT_3
GOTO DELAY_ON
MOVLW D'51' ; RICARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
DECFSZ COUNT_1 ; DECREMENTA IL COUNT_1
GOTO DELAY_ON
RETURN
DELAY_OFF: DECFSZ COUNT_3
GOTO DELAY_OFF
MOVLW D'51' ; PRECARICA IL CONTATORE COUNT_3
MOVWF COUNT_3
DECFSZ COUNT_2 ; DECREMENTA IL COUNT_2
GOTO DELAY_OFF
RETURN
VIS: MOVF ADRESH,0 ;CARICA IN W PARTE DEL RISULTATO
MOVWF 07 ;USCITA SU PORTC.VISUALIZZA DATO CONVERTITO
MOVLW D'255'
MOVWF C2
MOVWF C3
MOVLW D'10'
MOVWF C4
VIS_DELAY DECFSZ C2
GOTO VIS_DELAY
MOVLW D'255'
MOVWF C2
DECFSZ C3
GOTO VIS_DELAY
MOVLW D'255'
MOVWF C3
DECFSZ C4
GOTO VIS_DELAY
MOVLW D'10'
MOVWF C4
CLRF PORTC
RETURN
END
Un consiglio, prendi confidenza con MPLAB SIM, ci vuole un po' di tempo ma è tempo speso bene !

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



ora ho fatto il circuito su basetta ramata, mettendo dei connettori per inserire i pulsanti e per attaccare un cavo flat sull'uscita di portc che andrà al decoder bcd per il displei 7 segmenti, che purtroppo fornisce solo in esadecimale... 


chiedo perdono ma non so cosa voglia dire..