Sari la conținut
ELFORUM - Forumul electronistilor

Problema arduino


loleksibolek

Postări Recomandate

La un Arduino UNO R3, dupa instructiunea Serial.end(), setez toate porturile digitale pe OUTPUT ( mai putin P2 pe care am un senzor IR), dupa care le aduc in HIGH. Ledurile conectate la porturi ar trebui sa lumineze continuu. Asta nu se intimpla. Doar led-urile de pe 13 si 12 ramin aprinse, celelalte P0-P11 clipesc nesincronizate, cu oarecare intirzieri intre ele, cu o frecventa de aprox 1Hz. Daca setez doar un port dintre P0-P11 pe HIGH si celelalte pe LOW, acesta se comporta la fel, anume clipeste la aprox 1Hz.

Singurul motiv pe care il suspectez ar fi o defectiune pe placa. Sint curios daca cineva a mai intilnit un fenomen asemanator si poate stie alta cauza decit placa defecta.

Multumesc mult.

 

void setup()
{
Serial.end();

pinMode( 0, OUTPUT);
pinMode( 1, OUTPUT);
pinMode( 2, INPUT_PULLUP);
pinMode( 3, OUTPUT);
pinMode( 4, OUTPUT);
pinMode( 5, OUTPUT);
pinMode( 6, OUTPUT);
pinMode( 7, OUTPUT);
pinMode( 8, OUTPUT);
pinMode( 9, OUTPUT);
pinMode( 10, OUTPUT);
pinMode( 11, OUTPUT);
pinMode( 12, OUTPUT);
pinMode( 13, OUTPUT);

digitalWrite( 0, HIGH);
digitalWrite( 1, HIGH);
digitalWrite( 3, HIGH);
digitalWrite( 4, HIGH);
digitalWrite( 5, HIGH);
digitalWrite( 6, HIGH);
digitalWrite( 7, HIGH);
digitalWrite( 8, HIGH);
digitalWrite( 9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}

void loop()
{
}

Link spre comentariu
  • Răspunsuri 48
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

incearca si asa

void setup()
{
  for (int i=0;i<13;i++){
    if (i!=2) {
      pinMode(i,OUTPUT);
      digitalWrite(i,1);
    }
  }
  pinMode( 2, INPUT_PULLUP);
}

void loop()
{
}


nu ai de ce sa folosesti Serial.end(); daca o folosesti , atunci renunti la D0 si D1

odata ce faci apelarea functiei bibliotecii Serial, activezi pe D0 si D1 ca fiind Rx/Tx

 

 

daca totusi vrei sa faci alte smecherii in codul tau si acest cod a fost doar un exemplu, poti totusi folosi D0 si D1 in soft, dar trebuie sa dezactivezi întreruperile pe serial. ceva de genul

void endSerial()
{
   uint8_t oldSREG = SREG;
   cli();
   cbi(UCSRB, RXEN);
   cbi(UCSRB, TXEN);
   cbi(UCSRB, RXCIE);
   serialFlush();
   SREG = oldSREG;  
}

apoi cand vrei sa re-folosesti serial-ul dai comanda Serial.begin(<baudrate>);

L.E: si nu uita de sei()

Editat de Vizitator
Link spre comentariu

Am folosit Serial.end din urmatorul motiv: https://www.arduino.cc/en/Serial/End

Codul este doar pentru exemplificare, evident mai simplu cu for... dar si asa tot clipeste!

void setup()
  {
  Serial.end();
 
  for (int i=0;i<13;i++)
    {
    if (i!=2)
      {
      pinMode(i,OUTPUT);
      digitalWrite(i,1);
      }
    }
  pinMode( 2, INPUT_PULLUP);
  }

void loop()
  {
  }

Lucram frumos la codul urmator ( citire coduri telecomanda IR), cind am obervat faptul ca ledurile volMinPin si volMaxPin clipesc, absolut inacceptabil.

Oricum ajung la mine doua bucati nano, sa am ce strica...

 

//--------------------------------------------------------------------

const byte MSG_IDLE = 0;
const byte NOTIFY_IR_REMOTE_INPUT_CHANGE = 1;
const byte WAIT_TRAIL = 2;
const byte APPLY_IR_CODE = 3;

const byte interruptPin = 2;
const byte ledPin = 13;
const byte powerOnPin = 12;
const byte volMaxPin = 11;
const byte volMinPin = 10;
const unsigned long IR_OnOff = 0x2CAC;
const unsigned long IR_VolMin = 0x32B2;
const unsigned long IR_VolMax = 0x32CA;

volatile byte msg = MSG_IDLE;
unsigned long loopMicrosOld = 0;
unsigned long loopMicrosNew = 0;
unsigned long eta;
unsigned long IRCode;

boolean ledPinStatus = LOW;
boolean powerOnPinValue = LOW;
boolean volMaxPinValue = LOW;
boolean volMinPinValue = LOW;

byte maxIRInputLoops;

//--------------------------------------------------------------------

void setup()
  {
  Serial.end();
 
  pinMode( 0, OUTPUT);
  pinMode( 1, OUTPUT);
  pinMode( interruptPin, INPUT_PULLUP);
  pinMode( 3, OUTPUT);
  pinMode( 4, OUTPUT);
  pinMode( 5, OUTPUT);
  pinMode( 6, OUTPUT);
  pinMode( 7, OUTPUT);
  pinMode( 8, OUTPUT);
  pinMode( 9, OUTPUT);
  pinMode( volMinPin, OUTPUT);
  pinMode( volMaxPin, OUTPUT);
  pinMode( powerOnPin, OUTPUT);
  pinMode( ledPin, OUTPUT);

  digitalWrite( 0, LOW);
  digitalWrite( 1, LOW);
  digitalWrite( 3, LOW);
  digitalWrite( 4, LOW);
  digitalWrite( 5, LOW);
  digitalWrite( 6, LOW);
  digitalWrite( 7, LOW);
  digitalWrite( 8, LOW);
  digitalWrite( 9, LOW);
  digitalWrite( volMinPin, volMinPinValue);
  digitalWrite( volMaxPin, volMaxPinValue);
  digitalWrite( powerOnPin, powerOnPinValue);
  digitalWrite( ledPin, ledPinStatus);
 
  attachInterrupt( digitalPinToInterrupt( interruptPin), IRInterrupt, CHANGE);
 
  msg = MSG_IDLE;
  }

//--------------------------------------------------------------------

void loop()
  {
  switch( msg)
    {
    case MSG_IDLE:
      {
      Reset_eta();
      break;
      }
    case NOTIFY_IR_REMOTE_INPUT_CHANGE:
      {
      Notify_IR_Remote_Input_Change();
      break;
      }
    case WAIT_TRAIL:
      {
      Wait_Trail();
      break;
      }
    case APPLY_IR_CODE:
      {
      Apply_IR_Code();
      break;
      }
    }
  }

//--------------------------------------------------------------------

void Notify_IR_Remote_Input_Change()
  {
  ledPinStatus = !ledPinStatus;
  digitalWrite( ledPin, ledPinStatus);
 
  loopMicrosNew = micros();
 
  eta = loopMicrosNew - loopMicrosOld;
 
  if  ( maxIRInputLoops > 3)
      {
      if  ( maxIRInputLoops < 20)
        {
        IRCode = ( IRCode << 1);
        if  ( eta > 900)
          {
          ++IRCode;
          }
        }
      }
  ++maxIRInputLoops;
  loopMicrosOld = loopMicrosNew;
  msg = WAIT_TRAIL;
  }

//--------------------------------------------------------------------

void Wait_Trail()
  {
  loopMicrosNew = micros();
 
  eta = loopMicrosNew - loopMicrosOld;
 
  if  ( eta > 100000)
    {
    msg = APPLY_IR_CODE;
    return;
    }
  }

//--------------------------------------------------------------------

void Apply_IR_Code()
  {
  switch( IRCode)
    {
    case IR_OnOff:
      {
      powerOnPinValue = !powerOnPinValue;
      digitalWrite( powerOnPin, powerOnPinValue);
      break;
      }
    case IR_VolMin:
      {
      volMinPinValue = !volMinPinValue;
      digitalWrite( volMinPin, volMinPinValue);
      break;
      }
    case IR_VolMax:
      {
      volMaxPinValue = !volMaxPinValue;
      digitalWrite( volMaxPin, volMaxPinValue);
      break;
      }
    }
  IRCode = 0;
  maxIRInputLoops = 0;
  msg = MSG_IDLE;
  }
//--------------------------------------------------------------------

void Reset_eta()
  {
  loopMicrosNew = micros();
 
  eta = loopMicrosNew - loopMicrosOld;
 
  if  ( eta > 100000)
    {
    loopMicrosOld = loopMicrosNew;
    }
  }


//--------------------------------------------------------------------

void IRInterrupt()
  {
  msg = NOTIFY_IR_REMOTE_INPUT_CHANGE;
  }

Postarea a fost editata.

Te rog ca pe viitor sa folosesti butonul "<>" pentru formatarea codului, altfel sterg postarea.

Editat de nico_2010
Link spre comentariu

Problema este rezolvata led-urile care nu clipeau erau unul alb si unul galben. Cele care clipeau erau rosii. Crunt sa fii ramas de carutza, cind or fi aparut led-uri clipitoare? le-am schimbat pe cele rosii cu galbene si totul merge OK. In proces am trecut de la uno la nano, evident inainte de a inlocui led-urile si a pogori cite o binecuvintare asupra fiecaruia. M-am prins si ce-i cu bumbu "<>" . Ascult si ma supun...

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări