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

[101] Re: servo comandati a distanza

Messaggioda Foto UtenteTardoFreak » 2 mar 2011, 23:08

Un ritardo male non fa. Io pero' implementerei anche una media. Leggerei il valore per ... chesso' ... 8 volte e poi dividerei la somma dei valori per 8 (che e' facile da fare, basta fare 3 shift a destra).
Funziona. :ok:
Chiaramente bisogna utilizzare una variabile a 16 bit per totalizzare la somma. ;-)
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[102] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 2 mar 2011, 23:16

va bene, una cosa per volta..il ritardo se lo metto però va ad influenzarmi anche il controllo PWM..che testerà i pulsanti solo dopo il ritardo..
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

1
voti

[103] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 2 mar 2011, 23:27

bè tornando a noi.. così facendo ( con il sensore all'ingresso) la visualizzazione non è stabile, mentre con il partitore l'uscita binaria era stabile...


E' facile che il sensore avesse un' impedenza d' uscita troppo alta per il convertitore A/D.

ed invece ho dei banali BPW34 per la luminosità e un lm35 per la temperatura..devo trovare il sistema per non avere una sovrapporizione delle letture... dici che devo mettere un ritardo davidde?


Occhio che stai mettendo un po' troppa carne al fuoco. Interfacciarsi a dei sensori per ottenere anche solo un dato spannometrico non è così semplice. Io comunque il ritardo lo metterei, il fatto che le cifre oscillino può dipendere da quello. Se poi, come dice TardoFreak fai anche la media di otto letture il lato digitale comincia a diventare qualcosa di completo.

Riguardo al discorso di ieri volevo farti notare alcune cose che nel tuo codice che possono essere migliorate per renderlo più leggibile.

Nella prima parte ad esempio definisci ADCON,ADCON1 e ADRESH. L' indirizzo di questi registri è già definito nel file P16F876.INC che è allegato al progetto. Non ti serve stare a specificarli nuovamente, quindi quelle righe puoi toglierle:

Codice: Seleziona tutto
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
ADCON0         EQU 1FH
ADCON1         EQU 9FH
ADRESH         EQU 1EH
C1             EQU 2DH                        ;INDIRIZZO REGISTRO PRIMO CONTATORE


Una cosa simile la fai in quest' altro punto del programma:

Codice: Seleziona tutto
START_ADC
            BCF   03H,07H
            BSF 03H,05H
            MOVLW 0EH
            MOVWF ADCON1
            BCF   03H,07H
            BCF   03H,05H
            MOVLW 81H               ;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



Le righe di codice sopra possono essere scritte così:

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


In questo modo quando rileggerai in futuro il programma ti sarà più immediato capire cosa sta facendo.

Un' altra possibilità che il compilatore ti da è quella di permetterti di saltare su e giù tra le righe senza utilizzare per forza una label. La parte di codice qui sotto :

Codice: Seleziona tutto
NUOVA          BSF      ADCON0,2   ;PONE AD UNO BIT 2 DI ADCON0 E AVVIA CONV.
LOOP           BTFSC    ADCON0,2   ;TEST BIT2 DI ADCON, SE 0 SALTA ISTRUZIONE SUCCESSIVA
               GOTO     LOOP       ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
               MOVF     ADRESH,0   ;CARCA IN W PARTE DEL RISULTATO
               MOVWF    07


può essere riscritta così:

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
               MOVF     ADRESH,0    ;CARCA IN W PARTE DEL RISULTATO
               MOVWF    07          ;USCITA SU PORTC.VISUALIZZA DATO CONVERTITO


il simbolo $-1 ti permette di indicare al compilatore che deve fare il salto alla riga precedente. Se vuoi saltare ancora più indietro puoi scrivere $-2 (o $-3 etc. etc.), il valore indica il numero di righe. Se invece vuoi saltare avanti sostituisci al segno - il segno + .
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

[104] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 2 mar 2011, 23:37

giozambi ha scritto:il ritardo se lo metto però va ad influenzarmi anche il controllo PWM..che testerà i pulsanti solo dopo il ritardo..


Si è vero ma devi considerare che testare i pulsanti ogni mezzo secondo non è la fine del mondo. Altrimenti se quest' idea non ti piace puoi pensare di utilizzare un' interrupt appoggiato ad un timer che ogni mezzo secondo faccia soltanto l' aggiornamento della PORTC, il resto continuerebbe a funzionare come ora e i pulsanti verrebbero controllati ad una frequenza più elevata.
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

[105] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 2 mar 2011, 23:41

che figo il modo da saltare le righe! :D
si poi effettivamente ragionandoci su è molto più leggibile con il nome del registro anziche la locazione.. poi mi stanno antipatici i numeri in hex :evil:
ora correggo.. però non ho capito perché dici che non è semplice interfacciare quei sensori.. perché alla fine saranno quelli che andranno a fornire il dato da convertire... io credevo che con un circuito di condizionamento mediante opamp si risolvesse tutto ed avrei avuto in uscita una tensione da 0 a 5V..trasformata poi in digitale.
davidde ha scritto: faccia soltanto l' aggiornamento della PORTC

quindi lui continua come è adesso però il dato lo pone in uscita solo (per esempio) ogni mezzo secondo?
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[106] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 3 mar 2011, 0:15

giozambi ha scritto:però non ho capito perché dici che non è semplice interfacciare quei sensori.. perché alla fine saranno quelli che andranno a fornire il dato da convertire... io credevo che con un circuito di condizionamento mediante opamp si risolvesse tutto ed avrei avuto in uscita una tensione da 0 a 5V..trasformata poi in digitale.


Si, effettivamente sopra hai scritto che non ti serve una gran precisione quindi può andare bene anche così.

davidde ha scritto:quindi lui continua come è adesso però il dato lo pone in uscita solo (per esempio) ogni mezzo secondo?


Si, lo pone e lo mantiene fino al mezzo secondo successivo. Guarda nei link ai tutorial che ti mandai come funziona l' interrupt generato dal timer, è spiegato tutto chiaramente...
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

[107] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 3 mar 2011, 0:28

va bene seguirò il tuo consiglio.. grazie mille davidde, faccio domani pomeriggio.. ora studio per verifica di tdp e interrogazione di telecomunicazioni...mi bombardano in questo periodo :( quella di oggi di elettronica è andata quasi bene, però ho sbagliato il DC nell'astabile con l' ne555, dovevo regolarlo al 50% ed invece ho dimenticato di mettere una resistenza in più col diodo in opposizione.. vabbè gli altri dovrebbero essere giusti....
bè scusa il mio divagare..grazie ancora! :ok:
grazie anche a TardoFreak :mrgreen:
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[108] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 4 mar 2011, 20:32

ho pensato che potrei aggiungere un tasto che mi porta il risultato della conversione su portc, e che rimane attivo per un po' di tempo.. ho modificato così il programma:
Codice: Seleziona tutto
BANKSEL     TRISB                   ; CONFIGURA RB3,RB4,RB5 COME IN. GLI ALTRI COME USCITE
               MOVLW      B'00111001'
               MOVWF      TRISB     
     
BANKSEL     PORTB                  ; CONFIGURA LE OUT DELLA PORTB A LIVELLO LOGICO BASSO
               MOVLW       B'00000000'
               MOVWF       PORTB             

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 ISTR. SUCC.
            GOTO $-1               ;SE BIT2 è 1 ESEGUI NUOVO CONTROLLO
            BTFSS PORTB,0
            GOTO VIS

Codice: Seleziona tutto
VIS:         MOVF ADRESH,0            ;CARICA IN W PARTE DEL RISULTATO
            MOVWF 07               ;USCITA SU PORTC.VISUALIZZA DATO CONVERTITO
            MOVLW D'255'
VIS_DELAY      MOVWF C2
            DECFSZ C2
            GOTO $-2
            CLRF PORTC
   RETURN
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[109] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 4 mar 2011, 21:38

Ciao,

metti tutto il programma altrimenti è difficile seguirti. Mi sembra ci sia qualche errore ma devo vedere tutto il codice...
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

[110] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 4 mar 2011, 22:45

sicuramente c'è... il servo si muove ma non vedo conversione..
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
C2            EQU 24H
C1            EQU 25H                        ;INDIRIZZO REGISTRO PRIMO CONTATORE

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
            GOTO 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'
VIS_DELAY      MOVWF C2
            DECFSZ C2
            GOTO $-2
            CLRF PORTC
            RETURN
END
            
         
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 13 ospiti