Leggere registri di un Arduino Nano Every

Per una mia realizzazione sto utilizzando sia Arduino Nano (normale 328) che degli Arduino Nano Every. Con i primi non ho problemi utilizzando i comandi DDRX PORTX e PINX per settare in scrittura/lettura i registri B, C e D; i programmi vengono normalmente compilati , caricati e quindi eseguiti senza problemi. Con i Nano Every non ci sono stati problemi fin quando si è trattato di utilizzare i comandi DDRX e PORTX per settare i pin di uscita e operare dei relè. Purtroppo, quando vado a leggere gli stessi registri, settati come ingressi, il compilatore mi da errore sul comando PINX. Faccio notare che lo stesso programma gira tranquillamente su un Arduino NANO (328) logicamente tenendo conto della differenza dei pin fisici. I comandi DDRX sono posti nel “setup” mentre le letture sono nel “loop”. Cosa posso fare per non buttare via i NANO Every e passare tutto su NANO 328 ( al di là del fatto di buttar via dei componenti, devo operare delle variazioni di cablaggio). Grazie per i vs suggerimenti. Saverio

Arduino Nano: ATMega328P

Arduino Nano Every: ATMega4809

... sono due cose completamnete differenti pur essendo entrambi della famiglia AVR ... il primo un prodotto del 2008, il secondo nel 2018 ... capisci bene che sono due cose ben differenti e NON compatibili al 100%.

... STUDIARTI il datasheet del ATmega4809, vedere le differenze e capire come fare le stesse cose con i registri di tale MCU (non tutti, sulle varie MCU, hanno gli stessi nomi, anche se fanno cose simili).

Guglielmo

P.S.: Prova a dare un'occhiata a QUESTO vecchio thread ... :roll_eyes:

Io proporrei una cosa diversa

Visto che non è la prima volta che OP ha questo problema: converte una buona volta il programma per usare le "sante paroline" pinMode digitalWrite e digitalRead
E ha risolto tutti i suoi problemi
In secula seculorum

1 Like

Se non ha problemi di velocità, per cui è necessario accedere direttamente ai registri, quella è la soluzione di tutti i problemi ... non per nulla è stato fatto il "framework" Arduino, proprio per la compatibilità su tutte le piattaforme :wink:

Guglielmo

Scommettiamo?

E aggiungo
Se invece li avesse dovrebbe scegliere più oculatamente l'hardware
Studiandolo prima

Scusa eh ... ma QUI avevi detto che usavi normalmente PINx e PORTx in emulazione ATmega328P ... ora cosa hai cambiato? Perché ora non va più?

Guglielmo

Cerco di spiegare il problema e il perché di certe scelte. Sto realizzando un sistema che tramite due serie di pulsanti (11 pulsanti A e 9 pulsanti B - i numeri possono variare anche in più) viene stabilito un itinerario (da A a B o viceversa). Quindi viene stabilita la direzione e l’itinerario. In base a questi due elementi, soprattutto l’itinerario (in questo caso sono 99 i possibili itinerari) devono essere comandati un certo numero di enti (motori DC che possono ruotare in senso orario o antiorario in funzione della polarità) attraverso dei relè che fungono da invertitori. Quindi ad ogni itinerario devo stabilire quali motori/relè si attivano e in che direzione. Inoltre quando questi motori si sono mossi e sono arrivati in posizione, ricevo un feed back. Logicamente tra la posizione dei pulsanti e il luogo dei relè/motori ci possono essere diversi metri. Il sistema scelto è stato un ARDUINO UNO o MEGA (dipende dal numero dei pulsanti dal momento che non volevo impelagarmi con le varie possibilità di fare una scansione dei pulsanti) come Master , una connessione I2C e diversi ARDUINO NANO, come slave, per dare i comandi ai relè e per ricevere i feed back. Ho deciso di utilizzare i registri degli Arduino Nano, la velocità di reazione non mi interessa, per il semplice fatto che gli slave, che devono realizzare l’itinerario, ricevono un semplice codice (numero identificativo dell’itinerario) e settano i relè semplicemente in base ad una serie di “1” e “0” che indicano quali attivare, mentre gli slave, che devono controllare, ricevono sui registri informazione di “1” e “0”. Le sequenze sono eguali e vengono semplicemente confrontate creando un codice di controllo pari a “0” se tutto è OK oppure una serie di “1” e ”0” che indicano al Master quali dispositivi non hanno funzionato.

Avrei potuto facilmente usare le "sante paroline" pinMode digitalWrite e digitalRead, ma ho fatto un rapido calcolo come segue. Gli itinerari sono oltre 40, per ciascuno devo dare da 8 a 12 (in una seconda fase del progetto i numeri crescono) comandi; con una struttura “switch” sarebbero state almeno 400 righe di programma, quantità che con il resto del sw non so se riesce ad essere trattata da un Nano. Così per ogni itinerario mi basta dare 3 comandi (utilizzando i registri B, C, D), quindi solo 120 righe + il rimanente che rimane eguale.

Detto questo, la mia domanda è semplice: perché gli Every non riconoscono completamente i comandi DDRx, PORTx e PINx? A suo tempo, con la simulazione del nano 328 avevo risolto il problema per quanto riguardava i nano che settavano i relè (quindi uso di DDRx e PORTx), ora con i nano che devono leggere i feed back , sono andato in crisi con il PINx che non viene riconosciuto. La cosa mi sembra strana dal momento che questi comandi sono del IDE di Arduino e quindi dovrebbero essere sempre riconosciuti. Comunque se non trovo un modo semplice per uscire da questo impasse, la cosa più semplice sarà mettere da parte gli Every e sostituirli con dei normali Nano 328.

Grazie comunque

Saverio

NO, questi NON sono assolutamente comandi dell'IDE di Arduino e del suo "framework" ... questi sono comandi che vengono riconosciuti dal compilatore gcc e che sono relativi ad istruzioni di accesso diretto ai registri e quindi strettamente legati alla MCU e NON trasportabili da una MCU ad un altra.

Ti ho già indicato cosa fare e ti ho anche messo il link di una discussione in cui se ne parlava ... devi seguire quelle indicazioni.

Guglielmo

una gigantesca UCAS

per cominciare non credo che IIc regga “diversi metri” in una configurazione con un numero non definito di slave collegati

poi non serve fare 3 o 400 switch case, basta ragionare su cosa e come mappare

è tanto che sto pensando ad “allargare” la mia “stagione di pin remoti” aggiungendo la possibilità di collegare svariate macchine in “daisy chain” e permettendo quindi di comandare multi-master-multi-slave su lunghe distanze con possibilità che

più master comandino gli stassi slave o veceversa

una macchina possa, anche contemporaneamente, agire da slave e/o da master

e varie ed eventuali

alle volte basta cercare per trovare

Non penso di aver realizzato un UCAS, dal momento che, per risolvere il problema, non ho trovato altra strada. Logicamente se vuole suggerire in modo più approfondito la sua idea, sarò ben lieto di analizzarla e applicarla, se vedo dei miglioramenti rispetto quanto ho saputo fare.

Comunque il sistema di trasmissione I2C funziona benissimo su distanze di diversi metri (personalmente lo uso fino a circa 8 metri) impiegando adatto cavo e, soprattutto le interfacce QWIIC. In pratica parto con collegamento 4 fili (SDA, SCL,Vcc, GND) dal master (per una realizzazione uso un ARDUINO UNO, mentre per altre due uso ARDUINO MEGA per questione di pin d’ingresso) verso l’interfaccia QWIIC, da qui con cavo verso altre interfacce “MID point” con le quali arrivo ai vari NANO che agiscono come slave. Al termine chiudo con un “END point” per collegare gli ultimi slave. Una prima linea funziona senza problemi, ma ora sono bloccato sulla seconda e terza che prevedono gli ARDUINO MEGA e inizialmente i NANO Every.

Saluti

Saverio

Io ho fatto cose simili

Con 2 fili (3 contando la massa)

In seriale

Oppure anche con zero fili e una manciata di HC12

E per le uscite e gli ingressi comandati bit-mapped ho usato degli shift-register

Forse ci starebbe anche in un Attiny

Vedasi era stagione di pin remoti e termoremoto non è termometro