leonardo: conflitto di porte? scrivo su A1 mi spegne D10

buonasera... ho questo problema con leonardo, non ho potuto testarlo su altri arduino, mi si presenta una specie di conflitto di porte che non riesco a spiegarmi:
Questo è il codice "minimo".

void setup() {
  // put your setup code here, to run once:
pinMode(A1,OUTPUT);
pinMode(10,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly: 
analogWrite(10,128);
//*************digitalWrite(10,HIGH);
delay(2000);
digitalWrite(A1,0);

delay(1000);

  
}

in pratica scrivo un valore analogico sul pin 10 che infatti sale a 2,5 volt (mezzo dutycycle del pin pwm numero 10) ma dopo che scrivo su A1 un valore digitale il pin 10 mi va a zero volt.
Ho provato, stupidamente, a scrivere sul pin 19 (che su leonardo mi pare di capire che sia un alias di A1) sperando che ci fosse una specie di errore nei #declare di leonardo.... ma il risultato è lo stesso.
Ho invece notato che sostituendo l'analogWrite con il digitalWrite il programma sembra avere il comportamento sperato alzando il piedino a 5volt ed ivi rimanendovi.
Ho in un altro programma fatto il pwm scrivendo direttamente sui registri e forzando il valore di dutycycle scrivendo direttamente sul registro OCR1B ed ho visto che questo registro non viene toccato dalla scrittura digitale su A1... sparo una cazzata ma sembra come se il digitalwrite su A1 mi stacchi l'interrupt che gestisce il pwm sul piedino 10... scambiando A1 con A3 mi pare che vada...Io mi sono un po' letto qua e la le mappature delle porte di leonardo ma sinceramente non mi pare di sbagliare... (si... be... le ultime parole famose di ogni programmatore :grin:)

Dove mi sto perdendo?
Succede uguale sull'arduino Uno?
come viene tradotto in assembler il digitalWrite su A10?

sicuramente stai sbagliando tu a dichiarare i pin analogici
un sistema corretto per usare A1 come autput è

pinMode(14, OUTPUT);

digitalWrite(14, HIGH);

digitalWrite(14, LOW);

Ti posso confermare che sulla Uno questo non accade, mentre invece avevo notato qualcosa di strano su una leonardo compatibile ( Olimexino 32U4) quando mesi fa' la testavo con uno sketch che usavo per un controllo di Led RGB.
Pero' avevo impuntato il tutto a errori derivanti da diverse numerazioni di pin .

Visto che mi hai fatto venire il dubbio, ho controllato anche io ed e' come dici tu.... scrivere sull' A1 ( o 19 ) e' come scrivere sull' A10 ( o 28 ) che corrisponde al D10.

e' notte, indaghiamo prossimanente

gingardu:
sicuramente stai sbagliando tu a dichiarare i pin analogici

Sicuramente non hai letto che sta utilizzando una Leonardo dove la mappatura dei pin è diversa rispetto alla UNO.

astrobeed:

gingardu:
sicuramente stai sbagliando tu a dichiarare i pin analogici

Sicuramente non hai letto che sta utilizzando una Leonardo dove la mappatura dei pin è diversa rispetto alla UNO.

Quoto. I pin A6..A11 sono mappati sui pin D4, D6, D8, D9, D10 e D12.

Quindi A10 corrisponde proprio a D10.
Basta girare la schedina per vedere sul retro la mappatura delle funzioni addizionali di alcuni pin

Ri-ciao a tutti.
Anzitutto grazie per l'intervento veramente tempestivo.

Mi sono dimenticato di scrivere l'ambiente di sviluppo: è 1.0.1 ma ieri sera mi sono accorto che c'è anche la versione .2: l'ho installata e picche uguale.

volevo stamattina provare a scrivere anzichè col digitalWrite direttamente sulla porta... però, dato che è un'analogica sono caduto in uno stato lievemente di imbarazzo: non so su che registro scrivere :blush:

... per l'applicazione mi sono spostato di pin: ho un po' il timore che lo stesso problema possa ripresentarsi "quasi random" su altre porte ma ho notato che deve essere un qualcosa che centra con l'uso in pwm+ l'uso dell'analogica come "digitale"

una cosa giusto per capirsi: A10 è "normale" che muova D10 sul leonardo: questo è stato puntualizzato un po' da tutti... il problema è che io sto usando A1 che non dovrebbe impattare su nessuno.

Ho riguardato ora la mappatura dei pin nel file pins_arduino.h per la Leonardo, pare tutto a posto.

Allora, ho ripreso il tuo codice:

void setup() {
  // put your setup code here, to run once:
pinMode(A1,OUTPUT);
pinMode(10,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly: 
analogWrite(10,128);
//*************digitalWrite(10,HIGH);
delay(2000);
digitalWrite(A1,0);

delay(1000);

  
}

Ho collegato 1 LED su D10.
Il pin su D10 resta acceso a metà intensità e non si spenge mai.
Non so perché a te non funzioni.

Che SO usi? Io ho Linux e non uso la toolchain distribuita con l'IDE ma l'ultima di Atmel.

leo72:
Ho collegato 1 LED su D10.
Il pin su D10 resta acceso a metà intensità e non si spenge mai.
Non so perché a te non funzioni.

Che SO usi? Io ho Linux e non uso la toolchain distribuita con l'IDE ma l'ultima di Atmel.

io vado di oscilloscopio o tester... parte a fare il pwm e poi quando fa la scrittura crolla basso... hai provato su leonardo o su uno?
come so uso win ... ide 1.0.1 sicuro me lo fa e me lo fa su 1.0.2 installato ieri notte (...però il sonno era tanto...)
... addirittura posso dire che me lo fa in entrambe i leonardo che ho acquistato contemporaneamente.

mi puoiispiegare cosa intendi per la "toolchain" di Atmel? ( sono newbe....)

La toolchian (Toolchain - Wikipedia) è un insieme di strumenti utilizzati sequenzialmente per trasformare in codice macchina il codice scritto nel linguaggio di Arduino (C/C++).
Essa è formata dal compilatore e dal linker ed è integrata nell'IDE di Arduino. Per i sistemi Linux è possibile usare la toolchain presente nel sistema invece di quella distribuita insieme all'IDE e inoltre sia per Linux che per Windows è possibile aggiornarla all'ultima versione distribuita da ATmel (produttore del Chip montato su Arduino).
Nella sezione Megatopic trovi le istruzioni per l'aggiornamento per linux --> http://arduino.cc/forum/index.php/topic,97237.0.html
o per windows --> http://arduino.cc/forum/index.php/topic,96976.0.html

PaoloP:
Nella sezione Megatopic trovi le istruzioni per l'aggiornamento per linux --> http://arduino.cc/forum/index.php/topic,97237.0.html
o per windows --> http://arduino.cc/forum/index.php/topic,96976.0.html

Grazie per la dritta: ho provveduto a fare un ambiente 1.0.2 e scassarlo con il toolchain aggiornato della Atmel come da istruzioni che mi hai linkato.
Il problema si è risolto come per magia.
Non so se posso azzardare ma questo implica che l'1.0.2. originale di arduino.cc con leonardo ha qualche problema... c'è qualcosa che sfugge...

Per ostinazione mi sono messo a leggere il codice "assembler" generato dall'ide.... questa è la sola parte generata per la procedura setup():

   0:	83 e1       	ldi	r24, 0x13	; 19
   2:	61 e0       	ldi	r22, 0x01	; 1
   4:	0e 94 00 00 	call	0	; 0x0 <setup>
   8:	8a e0       	ldi	r24, 0x0A	; 10
   a:	61 e0       	ldi	r22, 0x01	; 1
   c:	0e 94 00 00 	call	0	; 0x0 <setup>
  10:	08 95       	ret

Si vede che A1 il precompilatore lo traduce come 19 ed il digitale 10 come 10... e mi pare giusto... è dopo il digitalWrite sul 19 che fa casino su D10 e non so il perchè.

qsecofr:
mi puoiispiegare cosa intendi per la "toolchain" di Atmel? ( sono newbe....)

qsecofr:
Per ostinazione mi sono messo a leggere il codice "assembler" generato dall'ide....

E meno male che eri un niubbo :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Tornando a noi, la versione dell'IDE non dovrebbe influenzare la cosa dato che da quel che so l'IDE di Arduino usa la stessa toolchain da un sacco di tempo.

PS:
io proverei a segnalare la cosa nella sezione internazionale per vedere se qualcun altro ha avuto il tuo stesso problema.

qsecofr:
Il problema si è risolto come per magia.

Non è magia, è che nella distro Arduino c'è una vecchia release del compilatore avr-gcc che oltre ad avere vari limiti ha diversi bug, la toolchain Atmel è nettamente migliore e non ha gli stessi limiti, sopratutto per quanto riguarda l'ATmega2560.

leo72:
E meno male che eri un niubbo :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Tornando a noi, la versione dell'IDE non dovrebbe influenzare la cosa dato che da quel che so l'IDE di Arduino usa la stessa toolchain da un sacco di tempo.

PS:
io proverei a segnalare la cosa nella sezione internazionale per vedere se qualcun altro ha avuto il tuo stesso problema.

:blush: ... e va be ma basta leggere qua e la: non è esattamente farina del mio sacco... la documentazione alla fine non manca... casomai il problema è come trovarla in mezzo al fienile...

Quanto alla pubblicazione sul forum internazionale stavo pensando che se è un problema della 1.0.2 (a qualsiasi livello) in qualche modo andrebbe segnalato per metterlo a posto nella prossima versione però io ragazzi non ho alba di come pormi in questo contesto... sono un newbe con 7 messaggi di cui il primo scritto mezza giornata fa e gesticolo un inglese maccheronico, sono timido, sono imbranato e non so se ci sono sezioni apposite per queste segnalazioni... quindi magari se qualcuno di voi volesse farsi avanti o quantomeno dirmi dove è il caso di riportare il problema mi farebbe un piacere grande.

Potresti provare su "Installation & troubleshooting":
http://arduino.cc/forum/index.php/board,2.0.html

Sarebbe meglio che tu lo facessi tu perché se poi chiedono qualcosa, un altro che gli risponde? :wink:

Grazie per la dritta: ho provveduto a fare un ambiente 1.0.2 e scassarlo con il toolchain aggiornato della Atmel come da istruzioni che mi hai linkato.
Il problema si è risolto come per magia.

e' bello collegarsi e trovare la pappa pronta....

e aggiorniamo pure la toolchain......