Sari la conținut
ELFORUM - Forumul electronistilor

Arduino PRO-MINI problema WD


Gilbert Sparios

Postări Recomandate

14534474280_2.thumb.jpg.d70bdca4357dc18e150de912580aff71.jpg

 

Cu unele pro-mini am experimentat mereu aceasi tip de eroare.

De data asta am incercat sa ma conving ce anume problema au.

 

uC este Atmega328P-AU exact ca cele cumparate de pe TME (cu care nu am avut vreodata asa problema) aparent marcate.

Practic se blocheaza daca WD reseteaza uC.

 

De exemplu acest cod

#include <avr/wdt.h>

#define LEDpin	13

void setup() {
	pinMode(LEDpin, OUTPUT);
  	for (byte i=0;i<10;i++) { // puls rapid pentru verificare reset cu WD
    		digitalWrite(LEDpin, !digitalRead(LEDpin));
		delay(100UL);         
        }
	wdt_enable (WDTO_4S);
}
  
  void loop() {
	wdt_reset ();
	digitalWrite(LEDpin, !digitalRead(LEDpin));
	delay(500UL);
                            
	if (millis()>5000UL) while(1) {delay(1);} // fortare resetare
  }

 

 

Am luat uC de pe placa si l-am pus pe o placa de ISP, cu cristal de 16MHz si verificata tot timpul. Aceasi problema. Initial credeam ca cristalul sau altceva de pe placuta pro-mini, are ceva dar..

 

Cu bootloader de UNO optiboot...

De problema asta se stie pe internet, dar spun ei ca se rezolva cu scrierea de bootloader de UNO insa mie nu mi-a rezolvat problema.

Sa fie vorba de uC clone proaste sau...ce pot face ?

 

Editat de Gilbert Sparios
Link spre comentariu
  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Gilbert Sparios

    5

  • Mircea

    1

  • nico_2010

    1

Top autori în acest subiect

Imagini postate

Update:

Cu acest cod merge:

#include <avr/wdt.h>

#define LEDpin	13

void setup() {
  	wdt_enable (WDTO_4S);
  
	pinMode(LEDpin, OUTPUT);  
  	for (byte i=0;i<10;i++) { // puls rapid pentru verificare reset cu WD
    		digitalWrite(LEDpin, !digitalRead(LEDpin));
		delay(100UL);         
        }
	/*wdt_enable (WDTO_4S); // THIS LINE MOVE ON TOP setup()*/ 
}
  
  void loop() {
	wdt_reset ();
	digitalWrite(LEDpin, !digitalRead(LEDpin));
	delay(500UL);
                            
	if (millis()>5000UL) while(1) {delay(1);} // fortare resetare
  }

 

Adica cum asa si de ce ? 

Link spre comentariu

o sa verific.. dar din câte retin am încercat si nano si ce am mai avut 328 pe acolo.. 

 

Dar ce nu înțeleg.. care ar fi Diferența, pentru ca cip-urilede pe plăcile astea sunt marcate 1:1 cu cele care merg , daca le-as amesteca nu mai faci diferența.. 

 

cred ca dacă doar scrie... altfel nu îmi explic.. 

Link spre comentariu

In prima versiune ,cu wdt_enable la sfarsit de setup(), daca pui wdt_reset() la intrarea in setup() merge ok ?
Daca merge asa, foarte posibil sa fie din bootloader.
Adica sa nu reseteze WDT si tot faca restart la repornire.
 

Link spre comentariu
Acum 3 ore, Liviu.Mihaiu a spus:

In prima versiune ,cu wdt_enable la sfarsit de setup(), daca pui wdt_reset() la intrarea in setup() merge ok ?
Daca merge asa, foarte posibil sa fie din bootloader.
Adica sa nu reseteze WDT si tot faca restart la repornire.
 

 

nu. doar cu wdt_enable la început de setup(). eu as fi vrut sa știu de ce doar uC-urile care vin pe pro-mini au problema asta. același uC cumpărat nu are probleme. uC este Atmega 328P smd-uri. 

 

am încercat cu bootloader de Arduino Nano, același rezultat..

 

Pentru mine încă rămâne un mister...

Editat de Gilbert Sparios
Link spre comentariu

Revin...cu un update important la acest topic. Din fericire, era vina mea.

Eu credeam ca daca scriu bootloaderul, se scrie undeva de la o adresa la o adresa fara sa interfereze cu un program scris.

Si atunci faceam o scriere de bootloader, apoi o scriere de soft prin "Scrie prin programator". 

 

Practic, se stergea bootloader-ul, si de acolo blocajul. Nici macar daca scrii prin programator in Arduino IDE nu s-au gandit sa scrie si bootloader-ul cu softul curent. La versiunea mai noua de Arduino IDE, poti salva HEX cu bootloader inclus dar de scris nu ai o optiune. Ma rog, se poate cu avrdude dar...

 

Revenind..am trait tot timpul cu ideea ca bootloader-ul cand il scrie Arduino IDE il scrie de la pana la adresa. De fapt, nu.

 

Totusi. Mai ramane un mister... De ce cu wdt_enable() la inceputul setup-ului mergea chiar si fara bootloader....

Editat de Gilbert Sparios
Link spre comentariu

Nu stiu cum e Arduino IDE, dar dupa ce ai incarcat bootloader-ul si te pregatesti sa scrii programul principal, nu-ti zice cata memorie a mai ramas disponibila? Daca iti zice ca toata memoria e disponibila, atunci il cam doare in cot de ce este deja scris si scrie de la inceput, deci si peste bootloader. Ceea ce ai remarcat si tu.

 

Totusi, altii care incarca un bootloader si apoi scriu programul, nu au vreun control care sa le zica "daca scriru de la adresa xx, atunci suprascriu pe ceva deja existent, vrei sa continui"?

 

Despre WDT, activarea (enable) se pune la inceputul buclei principale. Asta ca sa stii daca se blocheaza in prima instanta de rulare a buclei. Dupa ce o instanta a rulat complet - fara sa se blocheze, nu mai conteaza ca e activat la sfarsit.

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