Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

servo comandati a distanza

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[111] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 5 mar 2011, 12:06

Non va per almeno un paio di motivi:

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 !
Avatar utente
Foto Utentedavidde
13,3k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 4026
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[112] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 9 mar 2011, 11:34

infatti, devo dirti che mi ero posto la domanda della differenza tra goto e call ma non avevo capito bene..grazie..e poi non ho capito una cosa, come faccio a convertire i secondi che voglio in un delay in cifre decimali de dare ai vari registri di ritardo?
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[113] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 9 mar 2011, 12:12

L' esempio è nell' ultimo programma che ti ho inviato:

Codice: Seleziona tutto
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


Aiutandoti con lo strumento StopWatch di MPLAB SIM metti due breakpoint e vedi il tempo che il programma impiega ad eseguire la routine di delay. Se lo vuoi più lungo aumenti il precarico dei registri se lo vuoi più breve riduci il precarico dei registri.
Avatar utente
Foto Utentedavidde
13,3k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 4026
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[114] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 9 mar 2011, 13:46

si, fin qui ci sono... ma se dovessi farmi un delay di un tempo x noto, non posso andare per tentativi, dunque come "converto" i secondi che servono a me in cifre decimali da assegnare ai registri, e quanti registri fare..?
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[115] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 10 mar 2011, 22:48

Ok, allora per fare il conto devi prendere in considerazione il clock del microcontrollore, che nel tuo caso è a 8MHz. Dal clock risali al numero dei cicli macchina, in un PIC (credo in tutti i PIC) un ciclo macchina si ottiene dividendo per quattro il clock, avremo quindi una frequenza dei cicli macchina pari a 2MHz.
Ogni istruzione in assembler, ad eccezione dei salti e di altre particolari istruzioni (vedi pag. 160 del datasheet), viene eseguita in un ciclo macchina, quindi nel tuo programma ogni 0,5µs viene eseguita un' istruzione.

Il conto diventa quindi semplice, per eseguire un ritardo di 1s devi scrivere una routine che impegni il microcontrollore per 1/0.0000005 = 2000000 cicli macchina. Scritta la routine di ritardo non dovrai far altro che chiamarla consecutivamente per il numero di secondi che ti servono. Puoi mettere tante CALL una sotto l' altra oppure creare un registro (chiamato ad esempio secondi) che andrai a precaricare durante la fase di inizializzazione e poi ricaricherai ogni volta che sarà andato a zero. La tecnica è sempre quella di usare l' istruzione DECFSZ inscatolando un contatore dentro l' altro....

P.S.
Penso che ormai sia il caso di spostare questa discussione nella sezione dei microcontrollori visto che ormai non parliamo d' altro... se non la trovi più qui è di là ;-) :-) ...
Avatar utente
Foto Utentedavidde
13,3k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 4026
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[116] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 11 mar 2011, 22:18

si effettivamente è meglio spostarla...bè che dire..grazie mille ancora, sei stato gentilissimo a spiegarmi tutte qelle cose :ok: 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...
mi sarebbe piaciuto averlo in decimale, dato che devo visualizzare valori in gradi e in lux, ma fa lo stesso, altrimenti rischio di occuparmi troppo della parte relativa ai sensori e non finisco più il resto ..
grazie ancora davidde =D>
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[117] Re: servo comandati a distanza

Messaggioda Foto Utenteadmin » 12 mar 2011, 3:00

Alla fine vogliamo vedere un bel articolo sul progetto finito ;-)
Con video.
Avatar utente
Foto Utenteadmin
196,7k 9 12 17
Manager
Manager
 
Messaggi: 11953
Iscritto il: 6 ago 2004, 13:14

0
voti

[118] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 12 mar 2011, 17:46

ha ha va bene va bene :D metterò un sunto scritto sul mio blog... ma solo quando avrò finito gli esami :roll:
per quanto riguarda il video...bè mi spiace, si è rotta la webcam! accidenti!! :mrgreen:
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[119] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 15 mar 2011, 10:15

Prego !.. guarda che a fine esami ti aspettiamo al varco :-) :lol: ... !
Avatar utente
Foto Utentedavidde
13,3k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 4026
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[120] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 15 mar 2011, 16:34

al varco? ?% chiedo perdono ma non so cosa voglia dire.. :?
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti