Go Down

Topic: gestione OUTPUT PWM (Read 9485 times) previous topic - next topic

PaoloP


vorrei che non mi accendesse i pin digitali


Basta che metti un if e gli dici di saltare i pin digitali.
Crei un array dei pin PWM e se non è tra quelli lo salta.

Il codice dell'AnalogWrite è questo:
Code: [Select]
void analogWrite(uint8_t pin, int val)
{
// We need to make sure the PWM output is enabled for those pins
// that support it, as we turn it off when digitally reading or
// writing with them.  Also, make sure the pin is in output mode
// for consistenty with Wiring, which doesn't require a pinMode
// call for the analog output pins.
pinMode(pin, OUTPUT);
if (val == 0)
{
digitalWrite(pin, LOW);
}
else if (val == 255)
{
digitalWrite(pin, HIGH);
}
else
{
switch(digitalPinToTimer(pin))
{
...........................
                        // OMISSIS
                        ...........................

case NOT_ON_TIMER:
default:
if (val < 128) {
digitalWrite(pin, LOW);
} else {
digitalWrite(pin, HIGH);
}
}
}
}

lollo1100

#31
Mar 12, 2013, 04:45 pm Last Edit: Mar 12, 2013, 06:08 pm by lollo1100 Reason: 1


vorrei che non mi accendesse i pin digitali


Basta che metti un if e gli dici di saltare i pin digitali.
Crei un array dei pin PWM e se non è tra quelli lo salta.

Il codice dell'AnalogWrite è questo:
Code: [Select]
void analogWrite(uint8_t pin, int val)
{
// We need to make sure the PWM output is enabled for those pins
// that support it, as we turn it off when digitally reading or
// writing with them.  Also, make sure the pin is in output mode
// for consistenty with Wiring, which doesn't require a pinMode
// call for the analog output pins.
pinMode(pin, OUTPUT);
if (val == 0)
{
digitalWrite(pin, LOW);
}
else if (val == 255)
{
digitalWrite(pin, HIGH);
}
else
{
switch(digitalPinToTimer(pin))
{
...........................
                       // OMISSIS
                       ...........................

case NOT_ON_TIMER:
default:
if (val < 128) {
digitalWrite(pin, LOW);
} else {
digitalWrite(pin, HIGH);
}
}
}
}



guarda ti scrivo il codice di come faccio io

Code: [Select]


 for ( int j = 0; j < 8; j++ ){
   if ( MSK[j] == 1 && CMD[6] == 0x0d )
     analogWrite( LED[j], valore2 );
 }


questo sta dentro il loop. MSK [j] va da 0 a 7 e i gli indici che sono pwm sono j == 0 j==4 j==6 valore2 viene incrementato di 5 da 0 a 255 quando legge 130 mi si accende giustamente per come è fatto analogwrite così come mi si spegne quando legge 125 i pin digitali

lollo1100

come posso fare a evitare di accendere i pin digitali in modalità dimmer ovvero non fargli vedere duty cycle maggiori 128 o minori di 128 in fase di spegnimento ???

poi se volessi inserire la password sulla connessione telnet e far si che si colleghi solo con la password corretta ??

leo72


come posso fare a evitare di accendere i pin digitali in modalità dimmer ovvero non fargli vedere duty cycle maggiori 128 o minori di 128 in fase di spegnimento ???

Non ho capito.... un pin digitale accetta o 1 o 0, 1 per High e 0 per Low.
Non ha stati intermedi, quelli puoi averli solo sui pin PWM pilotati con analogWrite.

lollo1100



come posso fare a evitare di accendere i pin digitali in modalità dimmer ovvero non fargli vedere duty cycle maggiori 128 o minori di 128 in fase di spegnimento ???

Non ho capito.... un pin digitale accetta o 1 o 0, 1 per High e 0 per Low.
Non ha stati intermedi, quelli puoi averli solo sui pin PWM pilotati con analogWrite.


leo anche io pensavo ciò solo che quando gli arriva un valore maggiore uguale a 128 il digitale si accende e considera come se gli avessi mandato 255 xk come posso fare
il pin digitale si accende non va bene cioè va bene fino ad un certo punto appena vede 130 come duty si accende

leo72

Qualunque valore che non sia 0 viene interpretato come 1.
Questo è il codice della digitalWrite interessato all'analisi del valore passato:

Code: [Select]

if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}

lollo1100


Qualunque valore che non sia 0 viene interpretato come 1.
Questo è il codice della digitalWrite interessato all'analisi del valore passato:

Code: [Select]

if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}



Leo io faccio AnalogWrite(pin,value) se value >= 128 per un pin digitale quello è ON altrimenti  se <128 è OFF capisci che intendo?

leo72

Ah, ok. Ma il succo non cambia.
Ecco cosa fa l'analogWrite:

Code: [Select]

case NOT_ON_TIMER:
default:
if (val < 128) {
digitalWrite(pin, LOW);
} else {
digitalWrite(pin, HIGH);
}

Tutto ciò che uguale o sopra a 128 diventa HIGH.

Go Up