da
davidde » 14 feb 2011, 9:48
Ciao,
giozambi ha scritto:. però non so perché OPTION_REG,7 porti tutte le resistenze di pull up agli ingressi...se tipo volessi portare le resistenze di pull up anche a portc dovrei cambiare il numero 7?
No, in questo PIC soltanto la PORTB è dotata di resistenze interne di pull-up, nelle altre porte non è possibile settarle, l' unica soluzione è di aggiungerle esternamente. Se vai al paragrafo 4.2 del datasheet trovi tutte le informazioni per settare le resistenze di pull-up sulla PORTB.
giozambi ha scritto:ma se volessi fare in modo che il servo si posizioni anche in parti intermedie delle stesse, secondo te è utile che io tolga il delay in modo da non consentirgli il giro completo?
Dipende come ti serve fare. Il delay serve per fare in modo che anche in seguito ad una breve pressione del pulsante il segnale al servocomando rimanga attivo per un tempo sufficiente a fargli coprire il percorso.
Se lo togli potrà capitare che in seguito ad una pressione troppo breve il servocomando si porti in una posizione non voluta, un po' come se durante lo spostamento venisse a mancare l' alimentazione. Se invece le nuove posizioni che il servo deve raggiungere sono abbinate a pulsanti differenti non ti serve togliere il delay.
giozambi ha scritto:quindi se non erro, il codice precarica count_1 con un numero inversamente proporzionale alla durata del ton? se nelle posizione da 1.6ms è 9 e nelle posizione 0.7ms è 20...?
No, i commenti del codice erano nella posizione sbagliata. Il Ton è direttamente proporzionale al contenuto del registro COUNT_1. Più lo carichi più durerà il Ton. Inoltre è importante affinchè venga rispettata la frequenza di 50Hz che il risultato di COUNT_1 + COUNT_2 sia sempre 255. Ti riallego il codice con i commenti al posto giusto:
- Codice: Seleziona tutto
; FUNZIONE: due pulsanti comandano due posizioni definite di un servocomando.
#include P16F876.INC
__CONFIG 3FF2H
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
BANKSEL TRISB ; CONFIGURA RB4,RB5 COME INGRESSI GLI ALTRI COME USCITE
MOVLW B'00110000'
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 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
MAIN BTFSS PORTB,4 ;TESTA PULSANTE COLLEGATO A RB4
GOTO SET1
BTFSS PORTB,5 ;TESTA PULSANTE COLLEGATO A RB5
GOTO SET2
GOTO MAIN
SET1 MOVLW D'9' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'246' ; 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 del 3,5% (=0,7ms)
; 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.
POSIZIONE1 BSF PORTC,5 ; SETTA A LIVELLO LOCICO ALTO RC5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'9' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTC,5 ; SETTA A LIVELLO LOGICO BASSO RC5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'246' ; 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 MAIN
SET2 MOVLW D'20' ; PRECARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
MOVLW D'235' ; 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 del 8% (=1,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.
POSIZIONE2 BSF PORTC,5 ; SETTA A LIVELLO LOCICO ALTO RC5
CALL DELAY_ON ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
MOVLW D'20' ; RICARICA IL CONTATORE COUNT_1
MOVWF COUNT_1
BCF PORTC,5 ; SETTA A LIVELLO LOGICO BASSO RC5
CALL DELAY_OFF ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
MOVLW D'235' ; 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 MAIN
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
END ; FINE PROGRAMMA
Visto che non hai l' oscilloscopio ti consiglio di guardarti bene come funziona il Simulator Logic Analyzer.