RockDok Postat Februarie 28, 2017 Partajează Postat Februarie 28, 2017 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
Vizitator Postat Februarie 28, 2017 Partajează Postat Februarie 28, 2017 (editat) 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 Februarie 28, 2017 de Vizitator Link spre comentariu
RockDok Postat Februarie 28, 2017 Partajează Postat Februarie 28, 2017 (editat) 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 Februarie 28, 2017 de nico_2010 Link spre comentariu
RockDok Postat Februarie 28, 2017 Partajează Postat Februarie 28, 2017 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum