Jump to content
ELFORUM - Forumul electronistilor

Arduino PRO-MINI problema WD


Gilbert Sparios

Recommended Posts

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 ?

 

Edited by Gilbert Sparios
Link to comment
  • Replies 7
  • Created
  • Last Reply

Top Posters In This Topic

  • Gilbert Sparios

    5

  • Mircea

    1

  • nico_2010

    1

Top Posters In This Topic

Posted Images

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 to comment

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 to comment

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 to comment
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...

Edited by Gilbert Sparios
Link to comment

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....

Edited by Gilbert Sparios
Link to comment

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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines