Genova
Offline
Faraday Member
Karma: 14
Posts: 2529
|
 |
« on: March 03, 2013, 03:20:03 pm » |
Sera a tutti Avrei necessità che il programma commutasse autonomamente un pin settato come input per eseguire una serie di istruzioni che verrebbero fatte premendo ugualmente un pulsante, l'istruzione come riportato nel "port manipolation" non lo consente. es: MEGA 2560 il pin 32 appartiene al PORTC bit 5 DDRC = B00100000; //pin 32 in INPUT essendo un input non posso usare digitalWrite(32, 1);
nemmeno PORTC |= _BV(PORTC5); PORTC &= ~_BV(PORTC5);
nemmeno PORTC=32;
nemmeno bitWrite(PORTC,5,1);
Queste istruzioni funzionano solo se il pin è settato come output, c'è un modo per scrivere forzatamente sul registro usando un altro sistema? grazie ciao
|
|
|
|
« Last Edit: March 03, 2013, 03:33:06 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #1 on: March 03, 2013, 03:50:07 pm » |
Avrei necessità che il programma commutasse autonomamente un pin settato come input per eseguire una serie di istruzioni che verrebbero fatte premendo ugualmente un pulsante, l'istruzione come riportato nel "port manipolation" non lo consente.
Per cambiare stato ad un pin questo deve essere settato come Output, se è un input non puoi farlo, e mi pare una cosa logica  Ovviamente nulla vieta di cambiare la direzione del pin dinamicamente durante l'esecuzione del programma compatibilmente con le condizioni hardware, ovvero non è detto che un pin utilizzato come input si possa settare come output senza fare danni.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Faraday Member
Karma: 14
Posts: 2529
|
 |
« Reply #2 on: March 03, 2013, 04:22:33 pm » |
se è un input non puoi farlo, e mi pare una cosa logica Concordo, è logico, ma quel registro diventa 1 quando l'input passa a 1, qualcosa nel core ci va a scrivere, perchè se tengo il pulsante chiuso e leggo il registro 8 bit PINC è =32, pensavo magari ci fosse qualcosa di più profondo a livello assembler. Cambiare in corsa il pinmode, si ci avevo pensato, ma non conosco l'hardware o meglio non sono tenuto a conoscerlo, so solo che quel pin è usato come output.
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #3 on: March 03, 2013, 04:47:24 pm » |
Concordo, è logico, ma quel registro diventa 1 quando l'input passa a 1, qualcosa nel core ci va a scrivere, perchè se tengo il pulsante chiuso e leggo il registro 8 bit PINC è =32, pensavo magari ci fosse qualcosa di più profondo a livello assembler.
Ti sfugge il fatto che il pin è legato a due registri, PORTx per la scrittura e PINx per la lettura, sono due cose diverse e scrivendo su PORTx non puoi cambiare PINx e non puoi scrivere su PINx perché è un registro di sola lettura.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Faraday Member
Karma: 14
Posts: 2529
|
 |
« Reply #4 on: March 03, 2013, 04:57:15 pm » |
Mi sa che è sfuggito qualcosa a te di quello che ho scritto  leggo il registro 8 bit PINC è =32, il PINx l'ho usato in lettura forse quell' = ti ha fatto sembrare che gli assegnassi un valore PORTC |= _BV(PORTC5); PORTC &= ~_BV(PORTC5); PORTC=32; bitWrite(PORTC,5,1); il PORTx l'ho usato in scrittura Sto usando da molto il PINx e il PORTx e mi trovo molto bene, nelle ultime versioni degli sketch non ho mai più usato il digitalwrite, digitalread e il pinmode uso solo i registri
|
|
|
|
« Last Edit: March 03, 2013, 05:12:21 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #5 on: March 03, 2013, 05:05:11 pm » |
Mi sa che è sfuggito qualcosa a te di quello che ho scritto  I casi sono due, o non capito quello che vuoi fare oppure tu non hai capito quello che ti ho detto. Se ho compreso correttamente il tuo problema è che vuoi simulare un input scrivendo su un pin, bene questo non è possibile farlo perché il registro di input è diverso da quello di output, scrivendo sul secondo non cambi lo stato del primo, non puoi nemmeno scrivere direttamente sul registro di input perché è solo in lettura.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #6 on: March 03, 2013, 05:08:36 pm » |
Ad esser sinceri, se setti ad 1 un pin tramite PORTx quando quel pin è settato come input da DDx, ne attivi la pull-up interna.
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #7 on: March 03, 2013, 05:11:51 pm » |
Ad esser sinceri, se setti ad 1 un pin tramite PORTx quando quel pin è settato come input da DDx, ne attivi la pull-up interna.
Si, ma non scrivi su PINx 1, ovvio che se l'input è flottante va a 1 logico per effetto della pull up, però se poi la disattivi non hai alcuna certezza sullo stato logico che va ad assumere il pin di input flottante.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #8 on: March 03, 2013, 05:22:32 pm » |
Si, ma non scrivi su PINx 1, ovvio che se l'input è flottante va a 1 logico per effetto della pull up, però se poi la disattivi non hai alcuna certezza sullo stato logico che va ad assumere il pin di input flottante.
+1
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Faraday Member
Karma: 14
Posts: 2529
|
 |
« Reply #9 on: March 03, 2013, 05:30:48 pm » |
che vuoi simulare un input scrivendo su un pin Si +/- questo, non voglio scrivere su un pin ma nel registro, cioè analizzando i passaggi logici - dall'esterno del chip metto a 1 un input (pin 32) - leggendo il reg PINC vediamo il valore 32 o meglio il bit 5 di quel registro assume val 1 mi avrebbe fatto comodo ingannare il chip dall'interno, ma se non è possibile carico i valori di PINx in un altra var e manipolo quella, poi il codice interpreterà il dovuto, grazie lo stesso Ps: il PORTx può esserie usato anche in lettura ciao
|
|
|
|
« Last Edit: March 03, 2013, 05:51:44 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17003
Don't know what I do
|
 |
« Reply #10 on: March 03, 2013, 06:40:07 pm » |
Ps: il PORTx può esserie usato anche in lettura
Sì, insieme a DDx. Solo PINx è a sola lettura.
|
|
|
|
|
Logged
|
|
|
|
|
|