Uno Minima R4 - clock su pin

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?

Probabilmente devi usare un timer e vedere su quali piedini hai le uscite ...
... Renesas RA4M1 Group.pdf (1.7 MB)

QUI trovi un esempio di configurazione di uno dei timers.

Guglielmo

Grazie mille !! Ci studio e vedo cosa riesco a capire !!!
Grazie

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. :frowning_face:

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 :roll_eyes:

TimerOne-1.1.1.zip (14.0 KB)

Studiatela e vedi un po se può servire ...

Guglielmo

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 :roll_eyes:

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.