Sto utilizzando un Nano Every settando direttamente i registri in uscita.
Nel setup ho posto le seguenti istruzioni:
DDRB=B11111111;
DDRD=B11111111;
DDRE=B11111111;
per poi utilizzare l'istruzione tipo PORTB=B10101010
per comandare dei relè.
In fase di "compilazione" mi vengono dati i seguenti errori:
'DDRB' was not declared in this scope
e lo stesso per gli altri registri.
Come posso fare per eliminare il problema?
Faccio presente che in modo analogo su un NANO questo software funziona perfettamente.
Grazie
Buonasera e benvenuto nella sezione Italiana del forum,
cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. ![]()
Appunto Registri, che sono dipendenti dalla architettura della MCU. La nano Every monta una MCU ATMega4809 che non conosco per niente, ma se quello è l'errore vuole dire che il registro di nome DDRB non esiste.
'DDRB' was not declared in this scope
Prova ad aprire il datasheet e cerca i nomi dei registri I/O.
Ciao.
Come ti ha spiegato Maurotec, il fatto che si chiamino entrambi Arduino Nano NON significa che siano due prodotti tra loro simili ... sono simili SOLO nel formato, per il resto sono totalmente differenti (montano due MCU diverse, di due diverse generazioni).
Il programma che hai trovato/scritto è un programma che, purtroppo, effettua operazioni a basso livello, accedendo ai registri della MCU e, in tal modo, si lega mani e piedi alla MCU per cui è stato scritto ed è intrasportabile su MCU con diversa architettura.
L'unica cosa che puoi fare è prendere in mano il datasheet del ATmega328P (Arduino Nano), quello del ATmega4809 (Arduino Nano Every) e vedere nel primo le funzionalità dei registri che il tuo programma usa e poi cercare nel secondo come fare le stesse cose.
E' un lavoraccio, ma è l'unica possibilità quando si ha un programma che lavora a livello dei registri invece che usare il framework Arduino (di cui è abbastanza garantita la compatibilità).
Guglielmo
Ringrazio per le info; comunque sapendo che i due MCU sono diversi ho controllato sui datasheet dei pin per andare a vedere quali registri fossero disponibili e avevo trovato che sul Every era disponibile il registro B, il registro D ed il registro E (disponibili perchè collegati ad un pin esterno e utilizzabili per operazioni di I/O. Il fatto che mi risulta strano è che sembra non riconoscere i registri già in fase di dichiarazione (nel Setup). Quale documento accessibile tratta l'utilizzo dei registri? Io non sono riuscito a trovarlo nel vasto sito Arduino. Grazie
NO, quelli non sono i registri, sono, probabilmente, le porte disponibili, i nomi dei registri sono nel datasheet ... vai sulla parte che riguarda i pin di I/O e guarda come si imposta la direzione dei pin di una porta ... si fa in modo totalmente diverso che sul vecchio ATmega328P.
Ribadisco, le due MCU sono totalmente diverse e non puoi sperare che le cose a basso livello per una vadano sull'altra.
Guglielmo
P.S.: oltre tutto, il ATmega328P aveva le periferiche collegate in modo fisso, da disegno, ai pin, il ATmega4809 ha le periferiche dinamicamente assegnabili ai pin quindi una logica tutta diversa.
Ecco questo è il datasheet dlla famiglia megaAVR 0: megaAVR 0-series Family Data Sheet.pdf (2.7 MB) ...
... se vai nella sezione 15 (I/O Pin Configuration (PORT)) e te la studi tutta (anche per capire come impostare i pin come pin di I/O ... ricorda che qui i vari pin vanno configurati dinamicamente), trovi anche le sezioni che parlano Data Direction e dei relativi registri.
Ma perché ti stai incasinando con l'accesso a basso livello? Non puoi usare il framework Arduino? Devi fare operazioni così veloci sui pin che il classico I/O di Arduino è troppo lento? O cosa?
Guglielmo
Spiego la ragione del fatto che sto utilizzando i registri interni.
Ho un Arduino UNO o un Mega che agisce da master e si interfaccia con l'operatore attraverso una serie di pulsanti. In base ai pulsanti premuti (due prima di un pulsante "accetta") viene stabilito un codice numerico che viene inviato tramite I2C ad una serie di Arduino Nano (gli slaves) che per ogni codice comandano una serie di relè (12 per esempio) chiudendoli o meno in funzione del codice stesso. Ad ogni codice corrisponde una serie di "1" o "0" che viene caricata nel relativo registro e quindi attuata. I relè manovrano ciascuno un motore che con un micro interruttore mi da il feedback; se tutti i motori hanno manovrato o meno in modo corretto ho una serie di feedback composta da "1" o "0" identica a quella predisposta. Se la corrispondenza è completa il master riceve un segnale di "OK", altrimenti riceve l'informazione di quale motore non si è mosso correttamente. Non so se sono riuscito a descrivere bene il sistema. Per ora grazie, leggo i data sheet per vedere che cosa non funziona; altrimenti sono costretto a sostituire i Nano Every con dei Nano normali dal momento che un sistema analogo è già in funzione. Grazie ancora
Nulla che non si può fare con il normale framework Arduino senza scomodare i registri e rendere il tutto non trasportabile.
I registri si scomodano quando le tempistiche sono dell'ordine dei msec. ... e con i relè di mezzo dubito che ci siano tali tempistiche. ![]()
Guglielmo
Però con un solo PORT piloti una porta intera...
Infatti ho scelto questa strada perché con un solo comando PORTx piloto tutta la porta "x"da 8bit, ma soprattutto perché con il comando PINx leggo la stessa porta e ottengo una variabile costituita dai segnali di feedback dei motori azionati (tramite relè) che ha la stessa configurazione di bit della predisposizione. Con un semplice test tra configurazione inviata e quella del feedback so se tutti i motori sono stati azionati correttamente, oppure ottengo subito il motore/i che son si sono mossi correttamente.
Comunque ho cambiato il comando "DDRE" con "DDRC" e scelto di simulare i registri del Nano Every come fosse un Nano AT328 e sembrerebbe funzionare. Infatti compila senza errori il programma e lo carica. Ora devo verificare che i pin di uscita operino correttamente. Ciao
Errore di battitura: ..... "oppure ottengo subito il motore/i che NON si son mossi correttamente"........ Scusate l'errore
Dopo vari tentati, sono riuscito a far lavorare un Arduino Nano Every come fosse un Arduino Nano AT328, in modo da poter utilizzare i registri interni direttamente senza utilizzare i normali comandi "DigitalRead" e/o "DigitalWrite". Praticamente caricato la libreria per controllare il Nano Every, ho scelto di emulare il AT328 e ho caricato il programma che avevo a suo tempo preparato per il Nano normale. Unica avvertenza ho utilizzato dei pin diversi per collegare le uscite verso i relè. Utilizzati i registri B C D per un totale di 12 uscite (praticamente 4 per ogni registro) per evitare di utilizzare Pin che potessero interferire con altre funzioni tipo TX o RX o con i collegamenti SDA SCL del protocollo I2C che utilizzo per far parlare tra di loro i vari MCU. Grazie per i vari consigli che via via mi hanno indirizzato verso la soluzione (dimostratesi più semplice di quello che inizialmente avevo pensato).
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.