analogWrite zhavaruje sketch?!

Odpovědět
Doc Bogeyman
Příspěvky: 7
Registrován: 08 čer 2017, 02:34

analogWrite zhavaruje sketch?!

Příspěvek od Doc Bogeyman » 31 kvě 2018, 04:13

Mám problém s následujících sketchem. Je to součást většího projektu, ale tato část má po stisknutí VOL+ na dálkovém ovladači pomalu rozsvítit diodu. Po stisknutí VOL- nebo po uplynutí 5 sec od úplného rozsvěcení se dioda zase pomalu zhasne.
Vše funguje, jak má, dokud jsou všechny příkazy analogWrite v hlavní smyčce v komentech. Jakmile jsou aktivní, sketch způsobí po prvním stisknutí VOL+ zamrznutí klonu Arduina Uno. Kde je chyba??? :x :x :x
Zkusil jsem pro kontrolu digitalWrite, které normálně funguje.
Řádka "Serial.println(svitivost); // pro debuggovací účely" se ještě provede a vypíše "1", takže havárie nastane někdy potom a před dalším provedením cyklu.

Kód: Vybrat vše

#include <IRremote.h>

// pin 2 ... IČ senzor
// pin 11 ... diody

IRrecv irrecv(2);
decode_results results;

long rozsvitit=16754775; // VOL+
long zhasnout=16769055; // VOL-

int svitivost=0;
unsigned long cas=0;
int pokynDioda=0;

void setup()
{
pinMode(11, OUTPUT);
analogWrite(11, svitivost);
pinMode(2, INPUT);
irrecv.enableIRIn();

// debugging
Serial.begin(9600);
}

void loop()
{

// nejdrive nacist signal
if(irrecv.decode(&results))
{
irrecv.resume();
if(results.value == zhasnout) pokynDioda=0;
if(results.value == rozsvitit) pokynDioda=1;
}

// dioda
if(pokynDioda==1)
{
  // rozsvitit
if(svitivost==254) {
  svitivost++;
  analogWrite(11, svitivost);
  cas=millis();
}
if(svitivost<254) {
  svitivost++;
  analogWrite(11, svitivost);
}
}

Serial.println(svitivost); // pro debuggovací účely

if (svitivost==255) 
{
if ((cas+5000)<millis()) {
  pokynDioda=0;
}
}



if(pokynDioda==0)
{

  // zhasnout
if(svitivost>0) {
  svitivost--;
  analogWrite(11, svitivost);
} 
}



delay(100);
  
}
Naposledy upravil(a) Doc Bogeyman dne 31 kvě 2018, 04:29, celkem upraveno 1 x.

Doc Bogeyman
Příspěvky: 7
Registrován: 08 čer 2017, 02:34

Re: analogWrite zhavaruje sketch?!

Příspěvek od Doc Bogeyman » 31 kvě 2018, 04:15

Doplněk ... na téže desce jsem zkusil čítankový příklad s analogWrite a rozsvěcením diody. Fungovalo to, takže deska obecně zvládá analogWrite. Zkusím ještě originální Uno, ale jinak už nevím ...
Doplněk 2 ... originální Arduino Uno dělá totéž. :cry:

pgerla
Příspěvky: 349
Registrován: 11 dub 2013, 00:17

Re: analogWrite zhavaruje sketch?!

Příspěvek od pgerla » 31 kvě 2018, 07:15

AnalogWrite na pinu11 využívá Timer2 ...
Knihovna irRemote.h využívá Timer2 ...

Kód: Vybrat vše

Aqrduino pin   timer channel
   3             2       B
   5             0       B
   6             0       A
   9             1       A
  10             1       B
  11             2       A

Doc Bogeyman
Příspěvky: 7
Registrován: 08 čer 2017, 02:34

Re: analogWrite zhavaruje sketch?!

Příspěvek od Doc Bogeyman » 31 kvě 2018, 11:49

Aha! To jsem nevěděl. Dík.
Samozřejmě jsem v rámci ladění zkusil i jiný pin; na potvoru právě pin 3, pro který platí to samé.

Projekt je robotizovaný plyšák. Pomocí dálkového ovládání se mu rozsvěcují a zhasínají oči a otáčí hlava na servu (musel jsem plyšáka kvůli tomu pitvat). Na tělíčku má plyšák několik děr, ze kterých vykukuje kovový endoskelet, takže z plyšáka je terminátor! :D
Samozřejmě má i jednu plyšovou packu pryč a místo ní má kovovou ruku.

Vladimir66
Příspěvky: 265
Registrován: 02 dub 2014, 15:30

Re: analogWrite zhavaruje sketch?!

Příspěvek od Vladimir66 » 31 kvě 2018, 18:37

ano, to by mohla byt kolize na Timeru2, kde se pere o timer knihovna a pwm.
zkus tu led pripojit na pin9 (pokud tam nemas treba Servo.h - vyuziva Timer1)
nebo pouzit softwarove pwm, ktere nevyuziva zadny timer.

to je zaklad pro kazdy projekt vedet, jake zdroje (timery, EEPROM adresy, preruseni apod.) vyuziva kazda konkretni pouzita knihovna.
kdyz uz se musi sdilet timer, tak se treba nastavi jinak a po pouziti se nastavi zpatky. ale nemuze se vyuzit soucasne pro dve odlisne
veci ve stejny okamzik.

ke kodu bych mel take pripominky ale jsou tu povolanejsi.
urcite bych zkusil pro odladeni/kontrolu misto tech analogwrite sepnout jen digitalwrite(13,HIGH a podivat se, jestli rozsvitis ledku na arduinu.
pokud ano tak pridej i funkci zhasnuti a musi ti fungovat on/off pri Vol+/Vol-
potom teprve zapoj to rozsiceni ledky (pwm), a nakonec pridej to zhasnuti.





-V.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti