Manipolazione diretta delle Porte Uno R4

Buongiorno!

Ho visto questo post di @gpb01 sulla lettura diretta in memoria dei pin dell’ Uno R4 Lettura Porte R4

cos'ì , visto che avevo utilizzato un R4 come emulazione tastiera (libreria keyboard), per una matrice di pulsanti vari.. ho voluto provare a includerlo.

Ho fatto una funzioncina DdigitaRead per andare a sovrascrivere il digitalRead dell’ ide e via.

Ok sembra tutto funzionare però dopo N tempo non emula più,

mentre lo schetch originale funziona senza intoppi

F16_Matrix4b1_PCF.zip (20,8 KB) // versione lettura diretta

così ho creato un R4DIRECT prima dell’ inclusione per bypassare la lettura

ed attribuire ad DdigitalRead il digitalread dell’ide

e bypassandolo torna a funzionare.

Come faccio a capire cosà fà a cazzotti con cosa?Da dove si inizia?

Da un attento STUDIO del datasheet della MCU :wink:

Guglielmo

P.S.: volendo è utile anche lo STUDIO del manuale FSP

Grazie per la documentazione !!

Vediamo se riesco ad affrontarli per capire perchè di incolla su delle operazioni logiche fatte su i registri in memoria . Ne dubito… però se non c’è altra via

Ok ho iniziato a ‘guardare’ il manuale (stampato) , e a mio parere è un microcontrollore molto avanzato, con molti circuiti e architetture delle quali sono completamente allo scuro.

E’ un pò tanto materiale da interiorizzare per poi riuscire a capire perchè si pianta il mio sketch quando uso i define che hai scritto @gpb01, mentre con la funzione dell’ ide no, e neanche con UNOR4_digitalWriteFast.

Per me non è una questione di lavoro sia chiaro , mi piace dare un senso e capire come migliorare quello che faccio e soparttutto dove sbaglio.

Onestamente rispondo spesso anche io alla gente, leggi…. impara… perchè non mi và di buttare via tempo su argomentazioni complesse , poi solo per curiosità, lo capisco e mi rivedo molto… però fornisco sempre documentazione di supporto in modo che la persona se ha voglia si forma e se la sbriga da solo .

Se qualcunaltro può darmi una mano da che parte orientarmi ne sarei grato.

Saluti

R.Landi

Se la tua intenzione è quella di portare a 1 oppure 0 molto velocemente un PIN (perché di digitalWrite() dd Arduino è lento)… In passato ho preso spunto da QUESTA libreria Adafruit che utilizza la manipolazione diretta dei registri sulle R4. In particolare guarda il codice compreso tra la riga 3126 e la riga 3132 per configurare i registri e le righe 3156 e 3170 per portare l’uscita alta e bassa.

Sto rispondendo “al volo dal telefono”, non ho tempo di scrivere degli esempi …

NON occorre prendere spunto da nulla, ho spiegato molto chiaramente come si fa ...
... purtroppo lui usa la libreria keyboard.h e ... NON ho idea di quali siano le interazioni ... :roll_eyes:

Tutte le varie digitalRead() fanno comunque delle verifiche prima di toccare i pin, se non si fanno le dovute verifiche ... si può andare in conflitto con altre cose usate altrove ... :roll_eyes:

Per questo esistono le digitalRead() e non si usa, se non si sa ESATTAMETE a cosa si va incontro, l'accesso diretto ai pin!

Guglielmo

EDIT: ho dato un'occhiata ai sorgenti ... anche i moduli relativi ad ec11 mi sembra facciano accessi diretti ... come detto, se non si connosce a fondo cosa fa ogni parte del programma, possono saltare fuori conflitti ... :roll_eyes:

... debug ... prova a mettere Serial.print() ovunque e capire dove va a finire il codice.

Non uso l'IDE 2.x ... sicuro che non sia in grado di fare un vero debug della MINIMA?

Volendo poi, la MINIMA ha anche un connettore JTAG e, con un apposito debugger hardware esterno, si può anche fare con strumenti più complessi ... :roll_eyes:

Guglielmo

EDIT: No, anche con l'IDE 2.x occorre un debugger esterno come chiartito QUI

EDIT2: Guarda anche QUI

OK, preso già un Jtag, credevo che nel manuale indicato ci fossero 2 info, invece

c’è tutta l’architettura ed i registri punto per punto a livello HW.

Onestamente credevo che andando a leggere direttamente in memoria i registri non potesse accadere nulla eccetto più di quello che è lo scopo del registro.

Ricordo che in alcuni assembler … alle epoche paleolitiche.. erano specificato come alcune operazioni potessero affettare dei registri e fosse necessario ripulirli.

Mai fatto un debug , eccetto appunto con i print seriali, ho preso un Jlink ed un Daplink ,

visto che si pianta dopo un pò riesco a vedere un log con le righe di programma oppure mi fà un dump della memoria e arrangiati??

Grazie

Riccardo

Normalmente né una né l'altra cosa ... puoi mettere di breakpoint o fare dei trace ... ma anche con i Serial.print(), non sei riuscito a capire dove si pianta?

Guglielmo

No, purtroppo . Quando uso i define diretti che hai fatto tu, si inchioda dopo un po', mentre funziona come emulazione tastiera, se lo utilizzo in modo normale facendo serial print di debug funziona. Posso attivarle entrambe volendo usando i print sulla funzione keyboard, ma non sono riuscito a trovare uno sniffer seriale che mi faccia da monitor mentre lo uso e poi vederr i log. Se fosse sul pc mi basterebbe scrivere un file di log, ma sul controllore dovrei aggiungere roba.

La cosa che non capisco, con l’altra libreria che fá una cosa simile ma usa

gli array/define dell’ide non lo fá.

Se uso le funzioni ide tutto ok.

Un altra cosa anomala che mi fá é legata all’ Hid , e me lo fá col minima,

col leonardo no, é che mi tocca resettare la scheda a windows caricato, se si accende prima della schermata windows login rimane inchiodato.

Posso usare il jtag o il daplink con qualche software per fare uno sniffer seriale e vedere che succede?