Buonasera, ho bisogno di generare un clock a 4Mhz di sincronia su un piedino dell' uno r4 per sincronizzare un sensore di lettura angolare magnetico TLE5010.
E' un sensore SPI ma necessita di un clock intipendente, non lo genera internamente.
Su le vecchie board si usava il pin 9 ed i prescaler interni, ma non riesco a trovare come fare con uno R4.
Ho provato a cercare in rete, ma non ho trovato nulla, mi potete aiutare?
C'era una vola un utente molto in gamba che stimavo molto e che conosceva piuttosto bene la R4, tale Delta-G ... purtroppo, per vari motivi è finito definitivamente bannato.
Lui aveva modificato la libreria standard TimerOne per poter funzionare anche su UNO R4 ... dato che l'ha eliminata dal suo github, ti allego una copia che io avevo salvato ... magari può esserti utile
Ok, ho dato un occhio al volo,
Però da quello che almeno ho capito io, non é possibile creare un timer su una frequenza così alta come 4mhz.
Ora, come ricavo un po' di tempo , guardo sul PDF se c'è un prescaler programmabile dal clock della CPU
Grazie Mille x le info e la disponibilità!
Grazie
Sulla R4 Minima c'è la possibilita' di far uscire sul pin D11 un qualsiasi clock interno. Il segnale di clock può essere diviso per 1, 2, 4, 8,16,32,64 e 128.
Considerando la frequenza di clock di 48Mhz, dividendo per 16 si avrebbe una frequenza di 3Mhz, dividendo per 8 si hanno sul pin D11 6Mhz ... Per i 4Mhz non saprei... a meno che non si possa cambiare la frequenza di Arduino a 32Mhz per poi dividerla per 8 ... Allego il programma per far uscire 3Mhz sul pin D11.
/* Questo programma fa uscire sul pin P109 (D11 su UNO MINIMA R4) uno dei clock disponibili al processore, in modo da poterne misurare la frequenza esatta con un oscilloscopio
Original project is http://radiopench.blog96.fc2.com/blog-date-20240215.html*/
char cbuff[10]; // buffer di manipolazione delle stringhe
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println();
Serial.println("Start !");
// CKCOR imposta la sorgente dell'orologio e il rapporto di divisione
R_SYSTEM->PRCR = 0xA501; // Annulla la protezione del registro
R_SYSTEM->CKOCR = 0; // Azzera CKOCR
R_SYSTEM->CKOCR_b.CKOSEL = 0b000; // HOCO:000, MOCO:001, LOCO:010, MOSC:011, SOSC:100 (Clock da far uscire sul pin D11)
R_SYSTEM->CKOCR_b.CKODIV = 0b100; // Division:000 x1, 001 /2, 010 /4, 011 /8, 100 /16, 101 /32, 110 /64,111 /128 (Divisore di frequenza del clock in uscita)
R_SYSTEM->CKOCR_b.CKOEN = 1; // Abilita l'uscita sul pin
R_SYSTEM->PRCR = 0xA500; // Riproteggere il registro
viewCKOCR();
// Configura il pin D11 della R4 MINIMA come pin CLKOUT
R_PMISC->PWPR_b.B0WI = 0; // rimuove la
R_PMISC->PWPR_b.PFSWE = 1; // protezione da scrittura
R_PFS->PORT[1].PIN[9].PmnPFS = 0; // Azzera il registro
R_PFS->PORT[1].PIN[9].PmnPFS_b.PDR = 1; // D11(P109)impostato su uscita
R_PFS->PORT[1].PIN[9].PmnPFS_b.PSEL = 0b01001; // Abilita D11 come CLKOUT
R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 1; // Attiva le funzioni periferiche
R_PMISC->PWPR_b.PFSWE = 0; // riabilita la
R_PMISC->PWPR_b.B0WI = 1; // protezione da scrittura
viewD11(); // Controlla se le impostazioni sono corrette su monitor seriale
}
void loop() {
}
void viewCKOCR() { // Stampa il registro CKOCR
sprintf(cbuff, "CKOCR = 0x%02x", R_SYSTEM->CKOCR);
Serial.println(cbuff);
}
void viewD11() { // Stampa le impostazioni della porta D11 di R4 MINIMA
sprintf(cbuff, "D11(P109) = 0x%08lx", R_PFS->PORT[1].PIN[9].PmnPFS);
Serial.println(cbuff);
}
Grazie Veramente!
Guardavo i datashett della CPU é veramente complessa!
In teoria si, si può cambiare anche la frequenza di clock, ed há più generatori di clock che utilizza appunto x le periferiche interne, o sincronie varie.
Bisogna però andare a livello basso appunto.
Grazie Mille! Sei stato utilissimo! Adesso ho una risorsa in più!
Come non detto ... mi ero dimenticato che la frequenza del clock MOCO nella R4 Minima è di 8Mhz, percio' se sul pin D11 gli butti fuori il clock MOCO con divisore per 2 hai 4Mhz che ti servono.
/* Questo programma fa uscire sul pin P109 (D11 su UNO MINIMA R4) uno dei clock disponibili al processore, in modo da poterne misurare la frequenza esatta con un oscilloscopio
Original project is http://radiopench.blog96.fc2.com/blog-date-20240215.html*/
char cbuff[10]; // buffer di manipolazione delle stringhe
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println();
Serial.println("Start !");
// CKCOR imposta la sorgente di clock e il rapporto di divisione
R_SYSTEM->PRCR = 0xA501; // Annulla la protezione del registro
R_SYSTEM->CKOCR = 0; // Azzera CKOCR
R_SYSTEM->CKOCR_b.CKOSEL = 0b001; // HOCO:000, MOCO:001, LOCO:010, MOSC:011, SOSC:100 (Clock da far uscire sul pin D11)
R_SYSTEM->CKOCR_b.CKODIV = 0b001; // Division:000 x1, 001 /2, 010 /4, 011 /8, 100 /16, 101 /32, 110 /64,111 /128 (Divisore di frequenza del clock in uscita)
R_SYSTEM->CKOCR_b.CKOEN = 1; // Abilita l'uscita sul pin
R_SYSTEM->PRCR = 0xA500; // Riproteggere il registro
viewCKOCR();
// Configura il pin D11 della R4 MINIMA come pin CLKOUT
R_PMISC->PWPR_b.B0WI = 0; // rimuove la
R_PMISC->PWPR_b.PFSWE = 1; // protezione da scrittura
R_PFS->PORT[1].PIN[9].PmnPFS = 0; // Azzera il registro
R_PFS->PORT[1].PIN[9].PmnPFS_b.PDR = 1; // D11(P109)impostato su uscita
R_PFS->PORT[1].PIN[9].PmnPFS_b.PSEL = 0b01001; // Abilita D11 come CLKOUT
R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 1; // Attiva le funzioni periferiche
R_PMISC->PWPR_b.PFSWE = 0; // riabilita la
R_PMISC->PWPR_b.B0WI = 1; // protezione da scrittura
viewD11(); // Controlla se le impostazioni sono corrette su monitor seriale
}
void loop() {
}
void viewCKOCR() { // Stampa il registro CKOCR
sprintf(cbuff, "CKOCR = 0x%02x", R_SYSTEM->CKOCR);
Serial.println(cbuff);
}
void viewD11() { // Stampa le impostazioni della porta D11 di R4 MINIMA
sprintf(cbuff, "D11(P109) = 0x%08lx", R_PFS->PORT[1].PIN[9].PmnPFS);
Serial.println(cbuff);
}
La R4 Minima pero' non ha l'oscillatore esterno, percio' la frequenza in uscita notrebbe non essere molto precisa. Per ovviare a questo problema si potrebbe correggere la frequenza in uscita calibrando il registro MOCOUTCR , i dettagli sono nella sezione 8.2.22 del Renesas RA4M1 Group User's Manual: Hardware
@fox_hunter73:
... guarda che nella sezione Software del forum Italiano, ci sono varie discussioni dedicate alla UNO R4 (hanno tutte tale termine nel titolo, quindi facili da trovare), da cui potresti imparare parecchio