BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   aumentare l'estensione dei servi (https://www.baronerosso.it/forum/circuiti-elettronici/191219-aumentare-lestensione-dei-servi.html)

faustog_2 28 ottobre 10 01:43

aumentare l'estensione dei servi
 
salve volevo aprire una discussione che si è parlato in altri ambiti però qui volevo farlo in materia di microcontrollori.
Premetto che con il 16F628 riesco a leggere i dati (impulsi) che arrivano dalla ricevete e posso quindi manipolarli come voglio.. .quello che però vorrei un attimo condivere con voi è il problema che se arriva un inpulso più di 1,5 mS ok ..basta solo allungarlo creando un ulteriore ritardo... ma se dovesse arrivare un inpulso inferiore a 1,5 mS come faccio ad andare indietro nel tempo????? !!!!!!

be per questo la prima cosa che mi viene in mente è posticipare tutto inviando nuovamente lo stesso inpulso al servo poi però bufferizzando il segnale precedente ne creo uno con un tempo inferiore in modo da scendere fino per esempio a 0.5 mS per cui alla fine potrei aumentare la corsa di un servo da 0.5 mS a 2,5 mS... anzichè da 1 a 2 mS ...

Che ne pensate di questa soluzione?
si accettano consigli..
Di seguito una piccola routine fatta stamani per catturare l'impulso proveniente dalla RX (la ricenvente è un' Hitec AFHSS 2,4 Ghz )




BSF STATUS,RP0 ; ** BANK1 **

MOVLW b'00000000'
MOVWF TRISB ; portB all pins output

MOVLW b'11110001'
MOVWF TRISA ; RB7-RB4 and RB1(RX)=input, others output

BCF STATUS,RP0 ; ** BANK0 **

CLRF COUNT
CLRF PORTB
MAIN BTFSS PORTA,0 ; IF (bit 0 di PORTA è = 1)
GOTO MAIN

MOVLW 178 ;
MOVWF CL ;
GOTO $+1 ;
GOTO $+1 ;
DECFSZ CL,F ;
GOTO $-2 ;

XX BTFSS PORTA,0
GOTO SHOW

INCF COUNT,F ; attesa di 2uS
GOTO XX ; attesa di 2uS
SHOW MOVF COUNT,W
MOVWF PORTB
CLRF COUNT
GOTO MAIN

END

illez 28 ottobre 10 09:37

Non son sicuro di aver capito bene; se volessi leggere il segnale di ingresso per produrne uno diverso in uscita, io disaccoppierei le due cose.
Da un lato il processo di input, gestito tramite interrupt, dall'altro il processo di output che genera il segnale.
Il processo di input imposta una variabile condivisa che è la lunghezza dell'impulso ricevuto; il processo di output, in base al valore di questa variabile genera il segnale di output.

Domanda: ma se vuoi estendere la corsa dei servi, lo devi fare in entrambe le direzioni, quindi non puoi semplicemente aumentare la durata dell'impulso ma anche, nell'altro verso, diminuirla. Giusto?
:wink:

faustog_2 29 ottobre 10 10:36

ok
 
hai capito benissimo...

...praticamente è la stessa cosa... anzichè gestire il segnale di ingresso con l'interrupt.. lo leggo normalmente dal pin ..con uno sfasamento di un ventesimo di secondo viene dato in uscita in un altro pin, una risposta..
..comunque la soluzione proposta da te, è più accademica, secondo è più elegante..

appena ci metto le mani, ti faccio sapere.

a dopo
fausto


Citazione:

Originalmente inviato da illez (Messaggio 2282302)
Non son sicuro di aver capito bene; se volessi leggere il segnale di ingresso per produrne uno diverso in uscita, io disaccoppierei le due cose.
Da un lato il processo di input, gestito tramite interrupt, dall'altro il processo di output che genera il segnale.
Il processo di input imposta una variabile condivisa che è la lunghezza dell'impulso ricevuto; il processo di output, in base al valore di questa variabile genera il segnale di output.

Domanda: ma se vuoi estendere la corsa dei servi, lo devi fare in entrambe le direzioni, quindi non puoi semplicemente aumentare la durata dell'impulso ma anche, nell'altro verso, diminuirla. Giusto?
:wink:


illez 29 ottobre 10 18:36

Non è più accademica o elegante, è l'unica praticabile.
Pensaci: hai due oggetti (l'input e l'output) che vanno a velocità diverse.
Non possono andare a velocità diverse se uno (l'out) aspetta l'altro.

Del resto tu stesso ti sei reso conto del problema :wink::D

romoloman 29 ottobre 10 23:09

Citazione:

Originalmente inviato da illez (Messaggio 2284468)
Non è più accademica o elegante, è l'unica praticabile.
Pensaci: hai due oggetti (l'input e l'output) che vanno a velocità diverse.
Non possono andare a velocità diverse se uno (l'out) aspetta l'altro.

Del resto tu stesso ti sei reso conto del problema :wink::D

Scusa ma non capisco...

facendo una simulazione su una scala dei tempi:
T=0 Misuro l'impulso, supponiamo sia 1800uS
T=1800 Genero l'impulso 2000
T=3800 Mi metto a riaspettare il nuovo input
T=20000 Arriva il nuovo impulso...

Non capisco dove serva l'interrupt, ma anche andando all'indietro
T=0 Misuro l'impulso 1200
T=1200 Genero l'impulso 1000
T=2200 Mi metto a riaspettare il nuovo impulso
T=20000 Arriva il nuovo...

I due impulsi non vanno a velocità diverse hanno solo lunghezza diversa ma, se si vuole stare nello standard, la ripetizione è 50 hz.
Scomodare la gestione degli interrupt in questo caso non serve, la base dei tempi dei 50hz te la da la ricevente, non è necessario gestire anche la durata della pausa dell'impulso generato.

illez 29 ottobre 10 23:43

Citazione:

Originalmente inviato da romoloman (Messaggio 2284846)
...
I due impulsi non vanno a velocità diverse hanno solo lunghezza diversa ma, se si vuole stare nello standard, la ripetizione è 50 hz.
Scomodare la gestione degli interrupt in questo caso non serve, la base dei tempi dei 50hz te la da la ricevente, non è necessario gestire anche la durata della pausa dell'impulso generato.

Probabilmente sono stato portato fuori strada dalla domanda, perché è vero, il periodo può variare da 20 a 30ms mentre l'impulso tra 1 e 2ms.
L'interrupt non è necessario, basta leggere il timer per calcolare la durata dell'impulso.
Forse l'interrupt può tornare utile se il firmware fa anche altre cose, ma se fa solo quello direi che si può evitare.
Allora, sarà l'ora tarda, ma continuo a non capire la domanda iniziale.
:unsure:
Che vuol dire tornare indietro nel tempo?
Forse appena arriva alto l'impulso in ingresso lo porti alto anche in uscita e quindi non puoi farlo più breve di quanto ricevi (a meno di predire il futuro)?
Se questa era la domanda, direi che il flusso è sbagliato. Misuri impulso, generi di conseguenza l'impulso in out, più breve o più lungo.

romoloman 31 ottobre 10 04:00

Credo che la domanda iniziale fosse generata dalla voglia di far partire l'impulso in uscita in contemporanea con quello in entrata, ma la cosa è assolutamente inutile ed totalmente infattibile..

faustog_2 31 ottobre 10 17:02

ok
 
il problema è che se fosse solo leggere un impulso e poi come risposta sommare un ritardo opportuno.. il discorso era già risolto... ma in caso di impulsi al di sotto dei 1500 uS occorre avere un ritardo ancora più breve... quindi come intuito qui da tutti IMPOSSIBILE.. per questo si può optare nel rielaborare il ritardo durante la pausa dei 20 - 30 millisecondo e quindi dare risposta opportuna diminuendo il ritardo. tutto qui

Citazione:

Originalmente inviato da romoloman (Messaggio 2286069)
Credo che la domanda iniziale fosse generata dalla voglia di far partire l'impulso in uscita in contemporanea con quello in entrata, ma la cosa è assolutamente inutile ed totalmente infattibile..


romoloman 31 ottobre 10 23:00

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2286673)
il problema è che se fosse solo leggere un impulso e poi come risposta sommare un ritardo opportuno.. il discorso era già risolto... ma in caso di impulsi al di sotto dei 1500 uS occorre avere un ritardo ancora più breve... quindi come intuito qui da tutti IMPOSSIBILE.. per questo si può optare nel rielaborare il ritardo durante la pausa dei 20 - 30 millisecondo e quindi dare risposta opportuna diminuendo il ritardo. tutto qui

Scusami Fausto, ma forse se tu usassi una teminologia opportuna ti si capirebbe meglio.
Tu devi generare un impulso PWM con frequenza totale di 50Hz in base ad un impulso che ti arriva.
Che i due impulsi inizino asseme non ti importa nulla, ne tantomeno importa al servo.
Pertanto l'unica cosa che devi fare è:
leggere l'impulso, calcolare la durata di quello da generare in base alla tua funzione di trasformazione e generare l'impulso in uscita.
Non centrano nulla i ritardi o gli anticipi (credo sia la corretta definizione di "ritardo ancora più breve")

In picbasic il tuo problema lo si risolve con ben 8 righe di codice.
Esempio per aumentare del 20% le corse:

while 1=1
a=pulsin(gpio.portain,1);
if (a!=0) then
b=((a-150)*1.2)+150;
low gpio.portaout;
pulsout(gpio.portaout, b,1);
endif
wend

Alla fine non mi sembra così complesso...

faustog_2 02 novembre 10 10:38

ok
 
scusami se uso terminologia marziana!
appena ho tempo cerco di tradurre tutt oin termini di assembler
..comunque mi la tua osservazione coincide con la mia .. però detta meglio da te ovviamente..

a dopo


Citazione:

Originalmente inviato da romoloman (Messaggio 2287153)
Scusami Fausto, ma forse se tu usassi una teminologia opportuna ti si capirebbe meglio.
Tu devi generare un impulso PWM con frequenza totale di 50Hz in base ad un impulso che ti arriva.
Che i due impulsi inizino asseme non ti importa nulla, ne tantomeno importa al servo.
Pertanto l'unica cosa che devi fare è:
leggere l'impulso, calcolare la durata di quello da generare in base alla tua funzione di trasformazione e generare l'impulso in uscita.
Non centrano nulla i ritardi o gli anticipi (credo sia la corretta definizione di "ritardo ancora più breve")

In picbasic il tuo problema lo si risolve con ben 8 righe di codice.
Esempio per aumentare del 20% le corse:

while 1=1
a=pulsin(gpio.portain,1);
if (a!=0) then
b=((a-150)*1.2)+150;
low gpio.portaout;
pulsout(gpio.portaout, b,1);
endif
wend

Alla fine non mi sembra così complesso...


faustog_2 29 novembre 10 12:29

Problema !!!
 
ALLORA..

STUDIANDO E LEGGENDO DATASHEET COMPRESO.. APPRENDO CHE IL PWM NON SERVE E' SUFFICIENTE USARE IL MODULO TMR0

PERO PERO PERO.. C'E UN PROBLEMA CHE MI STA FACENDO GIRARE LE BAL..
OVVERO PRIMA DI OGNI COSA OCCORRE LEGGERE IL SEGNALE DALLA RICEVENTE...
ECCO E MI SPIEGO, HO FATTO UNA SEPLICE ROUTINE CHE FUNZIONA SOLO SE USO UN TEST PER SERVER OVVERO QUEI DISPOSITIVI CHE GENERANO DEGLI IMPULSI UGUALI A QUELLI PROVENIENTI DA UNA RICEVENTE, CON IL POTENZIOMETRO SI PUO VARIARE LA POSISZIONE DEL SERVO

FIN QUI SPETTACOLARE TUTTO OK... PERO SE USO LO STESSO CON UNA QUALUNQUE RICEVENTE.. KO!!! NIENTE DA FARE ELETTROENCEFALOGRAMMA PIATTO!!!

CHE NE PENSATE?

ECCO LA ROUTINE:

;-----------------------------------------------------
; This software read data fron Hitech receiver.
; For each pulse it's show value by led in binary mode
; the value 40 < COUNT < 207
;
; software by Fausto Giudice
;-----------------------------------------------------
PROCESSOR 16F628
RADIX DEC
INCLUDE "P16F628.INC"
__CONFIG 11110100010000B

;-----------------------------------------------------
COUNT EQU 32
CL EQU 33
;-----------------------------------------------------
ORG 0
;
; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
MOVLW 7 ;QUESTA OPZIONE E' NECESSARIA SE SI VUOLE USARE PORTA COME INPUT
MOVWF CMCON ;CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
BSF STATUS,RP0 ; ** BANK1 **

MOVLW b'00000000'
MOVWF TRISB ; portB all pins output

MOVLW b'11110100'
MOVWF TRISA ; RB7-RB4 and RB1(RX)=input, others output

BCF STATUS,RP0 ; ** BANK0 **

CLRF COUNT
CLRF PORTB

MAIN BTFSS PORTA,2 ; IF (bit 0 di PORTA è = 1)
GOTO $-1

MOVLW 178 ; 1uS |
MOVWF CL ; 1uS | 4uS
GOTO $+1 ; 2uS | ****** ATTESA DI 0.9 mS ******
GOTO $+1 ; 2uS |
DECFSZ CL,F ; 1uS | 5uS * (178 - 1) = 885uS + 4 + 2 = 891 uS circa
GOTO $-2 ; 2uS |

XX BTFSS PORTA,2 ; 2uS
GOTO SHOW

INCF COUNT,F ; attesa di 1uS
GOTO XX ; attesa di 2uS totale 5uS

SHOW MOVF COUNT,W
MOVWF PORTB
CLRF COUNT
GOTO MAIN

END

faustog_2 29 novembre 10 12:52

completo
 
non ho detto che l'output me lo faccio restituire sulla porta B con 8 Led che in binario mi offrono il numero del tempo a partire dal 1 mS, fino al secondo ovviamente il primo millisecondo lo faccio scorrere,, poi cominicio ad incrementare COUNT che incrementarà circa ogni 5 uS ,
Il fatto è che con la RX non legge nessun bit già fin dall'inizio!!
quinidi non incrementa niente!

ho provato anche la tecnica illustrata qui

Regolatore giri.

ma il risulktato è lo stesso..

ovviamente di questo suggerimento ho solo selezionato la parte che riguarda la lettura del segnale in arrivo dalla ricevente

a dopo
fausto

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2327146)
ALLORA..

STUDIANDO E LEGGENDO DATASHEET COMPRESO.. APPRENDO CHE IL PWM NON SERVE E' SUFFICIENTE USARE IL MODULO TMR0

PERO PERO PERO.. C'E UN PROBLEMA CHE MI STA FACENDO GIRARE LE BAL..
OVVERO PRIMA DI OGNI COSA OCCORRE LEGGERE IL SEGNALE DALLA RICEVENTE...
ECCO E MI SPIEGO, HO FATTO UNA SEPLICE ROUTINE CHE FUNZIONA SOLO SE USO UN TEST PER SERVER OVVERO QUEI DISPOSITIVI CHE GENERANO DEGLI IMPULSI UGUALI A QUELLI PROVENIENTI DA UNA RICEVENTE, CON IL POTENZIOMETRO SI PUO VARIARE LA POSISZIONE DEL SERVO

FIN QUI SPETTACOLARE TUTTO OK... PERO SE USO LO STESSO CON UNA QUALUNQUE RICEVENTE.. KO!!! NIENTE DA FARE ELETTROENCEFALOGRAMMA PIATTO!!!

CHE NE PENSATE?

ECCO LA ROUTINE:

;-----------------------------------------------------
; This software read data fron Hitech receiver.
; For each pulse it's show value by led in binary mode
; the value 40 < COUNT < 207
;
; software by Fausto Giudice
;-----------------------------------------------------
PROCESSOR 16F628
RADIX DEC
INCLUDE "P16F628.INC"
__CONFIG 11110100010000B

;-----------------------------------------------------
COUNT EQU 32
CL EQU 33
;-----------------------------------------------------
ORG 0
;
; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
MOVLW 7 ;QUESTA OPZIONE E' NECESSARIA SE SI VUOLE USARE PORTA COME INPUT
MOVWF CMCON ;CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
BSF STATUS,RP0 ; ** BANK1 **

MOVLW b'00000000'
MOVWF TRISB ; portB all pins output

MOVLW b'11110100'
MOVWF TRISA ; RB7-RB4 and RB1(RX)=input, others output

BCF STATUS,RP0 ; ** BANK0 **

CLRF COUNT
CLRF PORTB

MAIN BTFSS PORTA,2 ; IF (bit 0 di PORTA è = 1)
GOTO $-1

MOVLW 178 ; 1uS |
MOVWF CL ; 1uS | 4uS
GOTO $+1 ; 2uS | ****** ATTESA DI 0.9 mS ******
GOTO $+1 ; 2uS |
DECFSZ CL,F ; 1uS | 5uS * (178 - 1) = 885uS + 4 + 2 = 891 uS circa
GOTO $-2 ; 2uS |

XX BTFSS PORTA,2 ; 2uS
GOTO SHOW

INCF COUNT,F ; attesa di 1uS
GOTO XX ; attesa di 2uS totale 5uS

SHOW MOVF COUNT,W
MOVWF PORTB
CLRF COUNT
GOTO MAIN

END


MSchiepp 29 novembre 10 20:34

Deve funzionare... controlla di essere collegato sul pin giusto e con la massa del ricevitore collegata alla massa del micro; nei commenti hai scritto bit 0 di PORTB, ma tu testi il bit 2!

visto che usi il 628 che ha anche il timer1, è più facile fare la lettura così:

MAIN
CLRF TMR1L
CLRF TMR1H
BTFSS PORTA,2
GOTO $-1
BSF T1CON,0
BTFSC PORTA,2
GOTO $-1
BCF T1CON,0

(valore dell'impulso in timer1)

Se vuoi misurare solo dopo 1 mS, carichi il timer1 a -1000 (0xFC17) in modo che vada in overflow dopo 1ms e ricomincia a contare da zero.


Michele

faustog_2 30 novembre 10 14:12

risposta
 
ringrazio MSchiepp; ma ringrazio anche Juljila che anche se non scrive so che legge.. e il suo consiglio mi è parso molto utile in privato

fermo restando la procedura scritta inizialmente, sembrerebbe funzionare qualcosa, ho messo nella ricevente 6V mentre sul 16F628 5V altrimenti andrebbe in fumo. Bene con una ricevente Hitec 40 MHz FUNZIONA!, anche se l'escursione è più corta , oscilla tra i 55 e i 191, mentre il servo test da 1 a 255 esatti, diciamo che il servo test ha una buona escursione.
Detto questo però cambio ricevente passo ad una OPTTIMA 2,4GHz pur alimentandola con 6v niente.
Per cui credo che la difficoltà stia nell'impedenza dei Pin dell'16F628 troppo alta da non permettere l'ingresso del segnale, insomma l' '1' lo legge come uno zero.... che fare?

torno su MSchiepp:
grazie per il suggerimento , tieni presente che i commenti sono copiati da altri sorgenti, per cui si trovano incollati senza aderenza alla vera istruzione!

per le porte nessun problema conosco bene i registri TRISB e TRISA , per cui ..anzi adesso ho messo la DEFINE in modo che con una sola modifica posso cambiare la porta di ingresso , ho letto il tuo codice, ottimo, prenderò spunto di lavorare anche con timer1 visto che ha 2 byte anzichè uno, credo che per l'estensione possa essere utile.
a dopo
fausto


Citazione:

Originalmente inviato da MSchiepp (Messaggio 2327764)
Deve funzionare... controlla di essere collegato sul pin giusto e con la massa del ricevitore collegata alla massa del micro; nei commenti hai scritto bit 0 di PORTB, ma tu testi il bit 2!

visto che usi il 628 che ha anche il timer1, è più facile fare la lettura così:

MAIN
CLRF TMR1L
CLRF TMR1H
BTFSS PORTA,2
GOTO $-1
BSF T1CON,0
BTFSC PORTA,2
GOTO $-1
BCF T1CON,0

(valore dell'impulso in timer1)

Se vuoi misurare solo dopo 1 mS, carichi il timer1 a -1000 (0xFC17) in modo che vada in overflow dopo 1ms e ricomincia a contare da zero.


Michele


faustog_2 01 dicembre 10 01:11

ok
 
salve a tutti ringraziandovi vi spiego un po come è andata,

ho messo un 78L05 in cui l'uscita alimenta il PIC (5v) mentre l'ingresso con una tensione di 5,5 v alimenta la ricevente, funziona anche con la 2,4GHz, tutto bene .
Adesso sicomme sono rompi pal.. continuo voglio l'output sul PC, bene, tutto ok per il servo test mentre nuovamente guai con la radio!! stavolta pur offrendo la corrente come con i led .. niente.. devo lavorare con le resistenze, come suggerito da jujila

ecco la routine:

MAIN BTFSS PULSEIN ; IF (bit 0 di PORTA è = 1)
GOTO $-1

MOVLW 178 ; 1uS |
MOVWF CL ; 1uS | 4uS
GOTO $+1 ; 2uS | ****** ATTESA DI 0.9 mS ******
GOTO $+1 ; 2uS |
DECFSZ CL,F ; 1uS | 5uS * (178 - 1) = 885uS + 4 + 2 = 891 uS circa
GOTO $-2 ; 2uS |

XX BTFSS PULSEIN ; 2uS
GOTO SHOW

INCF COUNT,F ; attesa di 1uS
GOTO XX ; attesa di 2uS totale 5uS

SHOW MOVF COUNT,W
CALL send
CLRF COUNT
GOTO MAIN

faustog_2 01 dicembre 10 14:02

oscilloscopio
 
allora eccomi oggi ho fatto delle prove con il prof. di elettronica, in sostanza il servo test crea dei segnali ad onda quadra simili a quelli che offre una ricevente, con la differenza che se alimento il servo test con un voltaggio di 5 volt allora il picco del segnale avrà appunto 5 v , tale da fa scattare la soglia attraverso la quale il PIC 16F628 legge " uno " infatti il risultato è sorprendende, ottengo 1 se il servo test è al minimo e ottengo 254 se il servo è al massimo, insomma quello che desideravo.
Invece la ricevente pur alimentadola con 5,5 volt offre un segnale d'onda quadra con picchi da 3,44 v probabilmente insufficienti, a far leggere al PIC che è arrivato un " uno ".
Allora le cose da fare sono due o aumentiamo il voltaggio di questi picchi d'onda quadra, oppure abbassiamo la soglia attraverso la quale un Microcontrollore legge il valore come uno invece che zero.

Come aumentare il picco ? serve un transistor, come dimensionarlo?

Come abbassare la soglia di impedenza di un piedino di ingresso di un PIC?

a voi i commenti
fausto

faustog_2 01 dicembre 10 17:08

forse si
 
allora serve un amplificatore operazionale ad alimentazione singola da 5 volt.. in sostanza con un regolatore di tensione diamo all'operazionale una Vrif di 3 volt , una Vin che sarà il segnale della ricevente , poi abbiamo la Vdd da 5 Volt infine l'uscita che va al pin del 16F628 .. credo che così possa funzionare la pagina 68 del datasheet del 16F628 dovrebbe dare conferma con il buffer rappresentato in figura..

a dopo

faustog_2 02 dicembre 10 10:48

Funziona
 
allora vi aggiorno, usando un semplice 78L05 ho risolto il problema, adesso con la tx rx 2,4 GHz benissimo leggo i numeri prodotti dai counter..

e stato sufficinete alimentare la RX con 6 volt, sempre i 6 volt li metto all'ingresso del 78L05 , all'uscita dello stesso invece (5 v) metto l'ingresso del PIC , il gioco e' fatto!

benissimo alla posizione piu bassa incrementa fino a 34, nella posizione massima 207, adesso comincio a scrivere due software uno che non fa uso del timer l'altro invece con uno dei timer, o lo zero oppure timer 1


vedremo..

marcosinatti 02 dicembre 10 14:30

Credo che il problema non sia legato all'impedenza di ingresso ma dal tipo di porta.
Se ho capito bene hai usato la PORTA che ha ingressi a Trigger di Schmitt quindi riconosce il livello alto solo a 0,8xVDD quindi a 5V di VDD la soglia è a 4V per la salita e a 0,2xVDD=1v in discesa.
Se usi la PORTB invece essendo TTL legge già il livello alto a 2-2,2V e il livello basso sotto 0,8V.
In alternativa, se devi usare per forza la PORTA, puoi provare a mettere una resistenza da 1K in serie al segnale della rx e una di pull-up da 4,7K tra il pin di ingresso e il +5V.

illez 02 dicembre 10 14:33

Citazione:

Originalmente inviato da marcosinatti (Messaggio 2331598)
Credo che il problema non sia legato all'impedenza di ingresso ma dal tipo di porta.
Se ho capito bene hai usato la PORTA che ha ingressi a Trigger di Schmitt quindi riconosce il livello alto solo a 0,8xVDD quindi a 5V di VDD la soglia è a 4V per la salita e a 0,2xVDD=1v in discesa.
Se usi la PORTB invece essendo TTL legge già il livello alto a 2-2,2V e il livello basso sotto 0,8V.
In alternativa, se devi usare per forza la PORTA, puoi provare a mettere una resistenza da 470ohm in serie al segnale della rx e una di pull-up da 4,7K tra il pin di ingresso e il +5V.

Questa cosa non la sapevo.. :approved:
ottimo, grazie!

marcosinatti 02 dicembre 10 14:34

Di niente, ho modificato il valore delle resistenze sul messaggio precedente...

illez 02 dicembre 10 14:38

Mi era sfuggita questa differenza tra PORTA e PORTB
Mi sembra abbastanza importante:wink:

Mrk89 02 dicembre 10 14:44

Citazione:

Originalmente inviato da marcosinatti (Messaggio 2331598)
....In alternativa, se devi usare per forza la PORTA, puoi provare a mettere una resistenza da 1K in serie al segnale della rx e una di pull-up da 4,7K tra il pin di ingresso e il +5V.

Domanda: hai provato questa soluzione ??

Ammesso e non concesso che la ricevente porti il segnale esattamente a 0V, si avrebbe un partitore con tensione all'ingresso del PIC di 5/(4.7+1)*1 = 0.88V circa... Io metterei la resistenza di pull up più grande, 5.6Kohm per esempio.:wink:

marcosinatti 02 dicembre 10 19:23

Se lo avevo provato io non dicevo a lui di provarlo, ma di farlo direttamente... :wink:
Comunque il concetto è chiaro, adesso si tratta di provare, e quindi correggere eventualmente i valori.

Mrk89 02 dicembre 10 21:38

Citazione:

Originalmente inviato da marcosinatti (Messaggio 2331992)
Se lo avevo provato io non dicevo a lui di provarlo, ma di farlo direttamente... :wink:
Comunque il concetto è chiaro, adesso si tratta di provare, e quindi correggere eventualmente i valori.

Mi ero perso il "prova"...:P

faustog_2 03 dicembre 10 13:38

ok
 
grazie marcosinatti, però voorei precisare che fronte di salita o discesa si attivavo con i bit opportuni

quinidi T0OC deve essere= 1 ovvero Counter mode, e poi x fronte di salita
T0SE = 1 , T0SE = 0 fronte di discesa , che io però non ho mai attivato.


La portb in effetti uso solo le porte 7 e 8 per la rx e tx seriale, in modo che faccio il debug, pero le altre in effetti sono libere potrei usarle.
grazie ancora appena riesco ad ottenere il primo servo extends vi comunico qui stesso vi posto il codice..

a dopo
fausto

Citazione:

Originalmente inviato da marcosinatti (Messaggio 2331598)
Credo che il problema non sia legato all'impedenza di ingresso ma dal tipo di porta.
Se ho capito bene hai usato la PORTA che ha ingressi a Trigger di Schmitt quindi riconosce il livello alto solo a 0,8xVDD quindi a 5V di VDD la soglia è a 4V per la salita e a 0,2xVDD=1v in discesa.
Se usi la PORTB invece essendo TTL legge già il livello alto a 2-2,2V e il livello basso sotto 0,8V.
In alternativa, se devi usare per forza la PORTA, puoi provare a mettere una resistenza da 1K in serie al segnale della rx e una di pull-up da 4,7K tra il pin di ingresso e il +5V.


marcosinatti 03 dicembre 10 14:05

Sul fatto che la scelta del fronte viene determinata via software, non ci sono dubbi, ma se lo stadio di ingresso non è in grado di discriminare i livelli di tensione puoi abilitare quello che vuoi, lui non lo sente!

faustog_2 03 dicembre 10 17:36

ok
 
ok quindi attivando dovremmo avere una migliore diciamo sensibilità o meglio un impedenza più bassa tale da permettere l'uso delle nostre riceventi in aeromodellismo.

comunque bello poter coniugare aeromodellismo con elettronica.. molto affascinante, ci sto battendo da poco tempo , però mi rendo conto che molto interessante a presto
fausto

Citazione:

Originalmente inviato da marcosinatti (Messaggio 2332924)
Sul fatto che la scelta del fronte viene determinata via software, non ci sono dubbi, ma se lo stadio di ingresso non è in grado di discriminare i livelli di tensione puoi abilitare quello che vuoi, lui non lo sente!


marcosinatti 03 dicembre 10 20:23

Nooo :axe:
:lol::lol::lol:
L'impedenza non c'entra niente, il problema è sulle soglie di tensione e basta.
Poi sicuramente avranno anche impedenze diverse, ma comunque talmente alte che non influiscono di certo sulla tensione dei segnali provenienti dalla rx.

faustog_2 06 dicembre 10 13:22

ci sono riuscito
 
ciao marcosinati..

come in oggetto ci sono riuscito , attualmente il servo extends lavora su un 25, 30% di escursione in più ..
quello che ho ottenuto , come volevo è un semplice algoritmo, che non facesse uso dei timer, per motivi di didattica, devo spiegare a dei ragazzi di 3 industriale, che ne pensi?

Il cuore dell'algoritmo è la seguente formula

HALF = 118 + (ATTESA/2)

DOVE ATTESA E IL TEMPO TRASCORSO DA DOPO IL PRIMO MILLISECONDO DAL SEGNALE IN INGRESSO,
ATTESA VARIA DA circa 34 A 201 CIRCA, HO USATO UN HITEC OPTIMA7 2,4 GHz

quindi da un estremo half vale 135... dall'altro 228, mentre il tempo medio si sa è di 178

se hai un idea migliore fammi sapere.. anche perchè questa soluzione non offre un parametro tale che se applicato si può aumentare o diminuire l'escursione.


ecco il sorgernte

;-----------------------------------------------------
; EXTENDS.ASM - Dimostrativo di semplice estensione escursione servocomando
;
; created by Fausto Giudice
; www.openflight.it
;-----------------------------------------------------
PROCESSOR 16F628
RADIX DEC
INCLUDE "P16F628.INC"
__CONFIG 11110100010000B

ATTESA EQU 32
CL EQU 33
HALF EQU 34
H_COUNT EQU 35
L_COUNT EQU 36

#DEFINE PULSEIN PORTB,5
#DEFINE PULSEOUT PORTB,0

ORG 0

BSF STATUS,RP0 ; ** GO TO BANK 1

MOVLW b'00000000'
MOVWF TRISA

movlw b'11110010'
movwf TRISB

BCF STATUS,RP0 ; ** RETURN BANK 0
;
; _________________________________________
;
; START PROGRAM
; ------------------------------------
;
LOOP BTFSS PULSEIN ; FINCHE NON LEGGE 1 RIMANE QUI
GOTO $-1

CALL PP ; ATTENTE UN MILLI SECONO

YY BTFSS PULSEIN ;
GOTO SHOW
INCF ATTESA,F ; INCREMENTA COUNT
GOTO YY

SHOW MOVF ATTESA,W
MOVWF HALF
BCF STATUS,C
RRF HALF,F
MOVLW 118
ADDWF HALF,F

CALL PULSE_OUT ; ATTESA
CALL DELAY_20 ; IMPULSO ESTESO
CLRF ATTESA ; RESETTA COUNT
GOTO LOOP ; TORNA A LEGGERE DALLA PORTA DI INGRESSO
; _________________________________________
;
; END PROGRAM
; ------------------------------------
; _________________________________________
;
; GENERA UN IMPULSO PIU ESTESO SU PORTA1 RISPETTO A QUELLO ENTRANTE IN PORTA0
; ------------------------------------
;
; 900 + 5 * ATTESA = da 900uS se ATTESA è = 0 , a max 2000uS se ATTESA = 200

PULSE_OUT BSF PULSEOUT
movf HALF,W ; 1uS |
movwf CL ; 1uS | 4uS
goto $+1 ; 2uS |

goto $+1 ; 2uS |
decfsz CL,F ; 1uS | 5uS * (178 - 1) = 885uS
goto $-2 ; 2uS |

nop ; 1uS

movf ATTESA,W ; 1uS
movwf CL ; 1uS
btfsc STATUS,Z ; 1uS nel caso in cui ATTESA = 0 allora salta alla fine
RETURN ; 2uS

goto $+1 ; 2uS

goto $+1 ; 2uS |
decfsz CL,F ; 1uS | 5uS * (ATTESA - 1) =
goto $-2 ; 2uS |
BCF PULSEOUT

RETURN
;
; _________________________________________
;
; GENERA UN RITARDO DI 1 mS
; ------------------------------------
;

PP MOVLW 178 ; 1uS |
MOVWF CL ; 1uS | 4uS
GOTO $+1 ; 2uS | ****** ATTESA DI 0.9 mS ******
GOTO $+1 ; 2uS |
DECFSZ CL,F ; 1uS | 5uS * (177 - 1) = 885uS + 4 + 2 = 891 uS circa
GOTO $-2 ; 2uS |
RETURN
;
; _________________________________________
;
; GENERA UN RITARDO DI 20 mS
; ------------------------------------
;

DELAY_20 movlw 20
movwf H_COUNT
movlw 10
movwf L_COUNT
decfsz L_COUNT,F
goto $-1
decfsz H_COUNT,F
goto $-3

RETURN

END


Citazione:

Originalmente inviato da marcosinatti (Messaggio 2333447)
Nooo :axe:
:lol::lol::lol:
L'impedenza non c'entra niente, il problema è sulle soglie di tensione e basta.
Poi sicuramente avranno anche impedenze diverse, ma comunque talmente alte che non influiscono di certo sulla tensione dei segnali provenienti dalla rx.



Tutti gli orari sono GMT +2. Adesso sono le 12:40.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002