
|
![]() | #1 (permalink) Top |
User 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 ! |
![]() | ![]() |
![]() | #2 (permalink) Top | |
Adv Moderator Data registr.: 15-08-2007 Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
| Citazione:
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 | |
![]() | ![]() |
![]() | #3 (permalink) Top | |
User 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:
Ultima modifica di faustog_2 : 17 aprile 12 alle ore 23:21 | |
![]() | ![]() |
![]() | #4 (permalink) Top |
User 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! |
![]() | ![]() |
![]() | #5 (permalink) Top | |
User Data registr.: 18-04-2008 Residenza: milano
Messaggi: 405
| Citazione:
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 | |
![]() | ![]() |
![]() | #6 (permalink) Top | |
User Data registr.: 18-04-2008 Residenza: milano
Messaggi: 405
| Citazione:
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. | |
![]() | ![]() |
![]() | #7 (permalink) Top | |
User 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:
Ultima modifica di faustog_2 : 18 aprile 12 alle ore 07:52 | |
![]() | ![]() |
![]() | #8 (permalink) Top | |
User Data registr.: 18-04-2008 Residenza: milano
Messaggi: 405
| Citazione:
al cambio di stato. il test if (TIFR1 & (1<<ICF1)) serve quindi a vedere se c'è un nuovo valore memorizzato su ICR1 | |
![]() | ![]() |
![]() | #9 (permalink) Top |
User 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 |
![]() | ![]() |
![]() |
Bookmarks |
| |
![]() | ||||
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 |