Qualcuno sperimenta con Arduino? - BaroneRosso.it - Forum Modellismo

Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 16 aprile 12, 09:34   #1 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ok

Il registro TFR1 è il timer 1 appunto da 16 bit ICF1 è il bit del registro in causa

il seguente controllo sapresti commentarmelo?

if (TIFR1 & (1<<ICF1)) {

leggendo il datasheet mi sono accorto che è corredato di esempi in assembler.. meglio dei datasheet dei Pic.. il problema che in questi gg ho poco tempo libero.. cci vuole tempo per leggere con attenzione .. mi viene facile capire perchè faccio riferimento al lavoro fatto con i Pic.. molte cose coincidono cambiano solo i nomi dei registri.. mi sono accorto che ci sono istruzioni in assembler che sommano e sottraggono su registri a 16 bit si distinquono perchè finiscono queste istruzioni con la W ..fantastico.. poi scopro cose che per farle con i Pic devi sudare! anche i PWM hanno prescaler da 1023 !
faustog_2 non è collegato   Rispondi citando
Vecchio 16 aprile 12, 10:28   #2 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
Il registro TFR1 è il timer 1 appunto da 16 bit ICF1 è il bit del registro in causa

il seguente controllo sapresti commentarmelo?

if (TIFR1 & (1<<ICF1)) {

leggendo il datasheet mi sono accorto che è corredato di esempi in assembler.. meglio dei datasheet dei Pic.. il problema che in questi gg ho poco tempo libero.. cci vuole tempo per leggere con attenzione .. mi viene facile capire perchè faccio riferimento al lavoro fatto con i Pic.. molte cose coincidono cambiano solo i nomi dei registri.. mi sono accorto che ci sono istruzioni in assembler che sommano e sottraggono su registri a 16 bit si distinquono perchè finiscono queste istruzioni con la W ..fantastico.. poi scopro cose che per farle con i Pic devi sudare! anche i PWM hanno prescaler da 1023 !
ICF1 è una costante numerica che rappresenta il valore posizionale del BIT ICF1,
1<<ICF1 esegue un left shift di 1 di ICF1 posizioni, a quel punto viene fatto un & con il registro del timer e se il risultato è vero (!=0) viene eseguito il codice.

PS: Consiglio, lascia perdere l'assembler con gli AVR usa il C e un buon compilatore (AVR-GCC 4.7.0) il codice risultante è meglio di quello che puoi fare tu....
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 17 aprile 12, 23:16   #3 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ok

Ok ho capito!

quindi in pratica è come eseguire :

BTFSC REGISTRO,BIT
SE NON è ZERO
SE E' ZERO

qui invece sinttatticamente significa spostati di ICF1 posizioni a partire da quella a zero, (estrema destra) e piazza un 1 (uno) , quindi se facendo l'AND ovvero

per esempio ICF1 = 2 allora sposta un 1 (uno) in posizione 2 a sinistra, poi esegui una AND e valuta il risultato

0110.0101
0000.0100 Vero


oppure

0110.0001
0000.0100 Falso

Altra osservazione, partendo dalla tua osservazione in merito agli interrupt, mi sembra strano che però con il convertitore ADC non ci siano questi brutti effetti!
In sistanza facendo la prova non mi dà nessuna imperfezione.

leggi qui:
Arduino - Knob


Servo myservo;

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}









Citazione:
Originalmente inviato da romoloman Visualizza messaggio
ICF1 è una costante numerica che rappresenta il valore posizionale del BIT ICF1,
1<<ICF1 esegue un left shift di 1 di ICF1 posizioni, a quel punto viene fatto un & con il registro del timer e se il risultato è vero (!=0) viene eseguito il codice.

PS: Consiglio, lascia perdere l'assembler con gli AVR usa il C e un buon compilatore (AVR-GCC 4.7.0) il codice risultante è meglio di quello che puoi fare tu....

Ultima modifica di faustog_2 : 17 aprile 12 alle ore 23:21
faustog_2 non è collegato   Rispondi citando
Vecchio 17 aprile 12, 23:48   #4 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
alternativa

un alternativa potrebbe essere quello che facevo con i Pic

in questo caso dovrei usare la funzione digitalRead
____ _____
_____| |__________________| |_______


while (digitalReadA==Down)
[

]

while(digitalRead==HIGH)
[
conta milli secondi
]

adesso vado a nanna sto iniziando a delirare!
faustog_2 non è collegato   Rispondi citando
Vecchio 18 aprile 12, 00:22   #5 (permalink)  Top
User
 
L'avatar di gawain
 
Data registr.: 18-04-2008
Residenza: milano
Messaggi: 405
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
un alternativa potrebbe essere quello che facevo con i Pic

in questo caso dovrei usare la funzione digitalRead
____ _____
_____| |__________________| |_______


while (digitalReadA==Down)
[

]

while(digitalRead==HIGH)
[
conta milli secondi
]

adesso vado a nanna sto iniziando a delirare!

una sccansione di questo tipo ti da un errore che è dipendente dal tempo di scansione...
la lettura di ICR1 ti permette di leggere con un scansione che puo essere il 99% dellintervallo piu corto ovvero molto lenta senza inficiare la precisione..
la lettura di quel registro necessita un tempo costante che quindi nelle letture differenziali non genera errore
gawain non è collegato   Rispondi citando
Vecchio 18 aprile 12, 00:13   #6 (permalink)  Top
User
 
L'avatar di gawain
 
Data registr.: 18-04-2008
Residenza: milano
Messaggi: 405
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
Ok ho capito!

quindi in pratica è come eseguire :

BTFSC REGISTRO,BIT
SE NON è ZERO
SE E' ZERO

qui invece sinttatticamente significa spostati di ICF1 posizioni a partire da quella a zero, (estrema destra) e piazza un 1 (uno) , quindi se facendo l'AND ovvero

per esempio ICF1 = 2 allora sposta un 1 (uno) in posizione 2 a sinistra, poi esegui una AND e valuta il risultato

0110.0101
0000.0100 Vero


oppure

0110.0001
0000.0100 Falso

Altra osservazione, partendo dalla tua osservazione in merito agli interrupt, mi sembra strano che però con il convertitore ADC non ci siano questi brutti effetti!
In sistanza facendo la prova non mi dà nessuna imperfezione.

leggi qui:
Arduino - Knob


Servo myservo;

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}

la libreria servo forza periodicamente l'azzeramento del contatore che ti impedisce ti utilizzarlo senza glitch nella lettura del ppm...
i metodi usati in ppm.h non non modificano mai il valore del contatore, solo cosi riesci a ottenere piu funzioni indipendenti come lettura ppm e driver servi.
inoltre il driver dei servi basato su una una lookup table e sul xor tra due byte garantisce una omogeneita di timing tra canali assoluta e le uniche operazioni diverse avvengono durante il segnale di sincro quindi senza effetto.
gawain non è collegato   Rispondi citando
Vecchio 18 aprile 12, 07:47   #7 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ok

credo di aver capito.... ....dammi un feedback

quindi il controllo
if (TIFR1 & (1<<ICF1))
serve per capire se il timer è arrivato a fondo scala ?

PPM.h lascia scorrere il timer 1 .. e si regola facendo differenze matetmatiche.. lo zero diventa il punto di partenza.. X, poi da esso si sviluppa il treno di PPM..

quindi non lo azzera.. anche perchè appena arriva in fondo a 65.000 scala e ricomincia da zero..

..ho realizzato tempo fa un sistema su Pic che fa lo stesso lavoro, un gruppo di registri li utilizzo , uno per ogni canale, gestito con FSR, il tmr0 quando scadeva in modo naturale, 16 mS , ricominciava.. finchè non scadevano i 16 mS leggevo la seriale & il sensore infrarosso.. appena scaduti i 16 mS allora eseguiva il treno di impulsi secondo quello che trovava nel buffer.. precedentemente riempito durante l'attesa.. quindi non c'erano tempi morti..

In pratica la libreria Servo è una cosa relativamente affidabile! però è strano perchè nei sorgenti di ARDUPILOT si fa uso della libreria Servo.. magari loro raggirano il problema ..chi sa in che modo.. devo studiare tanto.. ancora sono un principiante!



Citazione:
Originalmente inviato da gawain Visualizza messaggio
la libreria servo forza periodicamente l'azzeramento del contatore che ti impedisce ti utilizzarlo senza glitch nella lettura del ppm...
i metodi usati in ppm.h non non modificano mai il valore del contatore, solo cosi riesci a ottenere piu funzioni indipendenti come lettura ppm e driver servi.
inoltre il driver dei servi basato su una una lookup table e sul xor tra due byte garantisce una omogeneita di timing tra canali assoluta e le uniche operazioni diverse avvengono durante il segnale di sincro quindi senza effetto.

Ultima modifica di faustog_2 : 18 aprile 12 alle ore 07:52
faustog_2 non è collegato   Rispondi citando
Vecchio 18 aprile 12, 09:52   #8 (permalink)  Top
User
 
L'avatar di gawain
 
Data registr.: 18-04-2008
Residenza: milano
Messaggi: 405
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
credo di aver capito.... ....dammi un feedback

quindi il controllo
if (TIFR1 & (1<<ICF1))
serve per capire se il timer è arrivato a fondo scala ?

PPM.h lascia scorrere il timer 1 .. e si regola facendo differenze matetmatiche.. lo zero diventa il punto di partenza.. X, poi da esso si sviluppa il treno di PPM..

quindi non lo azzera.. anche perchè appena arriva in fondo a 65.000 scala e ricomincia da zero..

..ho realizzato tempo fa un sistema su Pic che fa lo stesso lavoro, un gruppo di registri li utilizzo , uno per ogni canale, gestito con FSR, il tmr0 quando scadeva in modo naturale, 16 mS , ricominciava.. finchè non scadevano i 16 mS leggevo la seriale & il sensore infrarosso.. appena scaduti i 16 mS allora eseguiva il treno di impulsi secondo quello che trovava nel buffer.. precedentemente riempito durante l'attesa.. quindi non c'erano tempi morti..

In pratica la libreria Servo è una cosa relativamente affidabile! però è strano perchè nei sorgenti di ARDUPILOT si fa uso della libreria Servo.. magari loro raggirano il problema ..chi sa in che modo.. devo studiare tanto.. ancora sono un principiante!
no, l bit ICF1 va a 1 quando l'input cambia stato, l'ICR1 memorizza il valore di TCNT1
al cambio di stato.
il test if (TIFR1 & (1<<ICF1))
serve quindi a vedere se c'è un nuovo valore memorizzato su ICR1
gawain non è collegato   Rispondi citando
Vecchio 19 aprile 12, 13:50   #9 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ok

ho avuto 5 minuti son andato a spulciare sul datasheet, ecco il risultato :
il Counter sarebbe il registro TCNT1H and TCNT1L – Timer/Counter1, registro a 16 bit , infatti arriva oltre i 65.000 ovvero 2 elevato a 15.

a pagina 139 presenta il registro TIFR1:
TIFR1 – Timer/Counter1 Interrupt Flag Register

http://www.atmel.com/Images/doc8161.pdf

Quindi è il registro degli interrupt del timer.. se leggiamo il bit 5 dice:
the ICF1 Flag is set when the counter reaches the TOP value.

quindi ICF1 è il bit 5 del registro TIFR1 ... e quando cambia di stato? quando il timer raggiunge fondo scala.. in pratica volendo fare un paragone con i Pic

BTFSS INTCON,T0IF
GOTO $-1 ;attende overflow timer
BCF INTCON,T0IF ;resetta bit overflow.

in questo caso INTCON è il registro degli interrupt del TMR0, quindi il bit T0IF di posto non ricordo! sarà 1 se arriva a fondo.. ovviamente tutto dipende da quale punto parte TMR0 e il prescaler impostato.

Mikia ma dico, non c'è un modo più semplice per intervistare un bit? che occorre fare una operazione così complessa?

if (TIFR1 & (1<<ICF1))

RIMPIANGO L'ASSEMBLER DEI PIC ! SEMPLICE E POTENTE!

a dopo
fausto










Citazione:
Originalmente inviato da gawain Visualizza messaggio
no, l bit ICF1 va a 1 quando l'input cambia stato, l'ICR1 memorizza il valore di TCNT1
al cambio di stato.
il test if (TIFR1 & (1<<ICF1))
serve quindi a vedere se c'è un nuovo valore memorizzato su ICR1
faustog_2 non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
Coassiale mixed controller con arduino catman Circuiti Elettronici 12 01 aprile 11 23:17
quadricottero con arduino 2009 sailormann26 Aeromodellismo Progettazione e Costruzione 0 27 dicembre 10 23:12



Tutti gli orari sono GMT +2. Adesso sono le 07:31.


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