Alapvetően az a véleményem, hogy az MCU státuszregiszterei vannak némileg elbarmolva (ez nem a te hibád, de csak te tudod rendbeszedni őket). Javaslom még azt, hogy a wdt_enable() mellett a wdt_reset() is legyen meghívva még a setup vége felé.
eddig barmivel probaltam, mindig az volt a vegeredmeny, hogy latszolag probal ujraindulni, de ott mindig lefagy.
Most ezzel probalom.
A setup-ban eloszor letiltom, utana varok 1000ms-ot, a led-et kikapcsolom, utana engedelyezem ujra a wdt-t.
Az indulaskor meg is csinalja szepen, 3x gyorsan villogtatja a ledet, majd kb. meg 2x 1mp-es kesleltetessel, utana indulna ujra, de mar a led-et sem tudja lekapcsolni, odaig sem jut el.
Probaltam ugy is, hogy az ujraindulaskori led kikapcsolast tettem rogton a setup elso soraba, de ugyanez tortent akkor is.
===
#include <Arduino.h> #include<avr/wdt.h> const int onboardLED = 13;
void setup() { wdt_disable();
digitalWrite(onboardLED, LOW); delay(1000); wdt_enable (WDTO_4S); pinMode(onboardLED, OUTPUT); int k; pinMode(13,OUTPUT); pinMode(onboardLED, OUTPUT); for (k = 1; k <= 3; k = k + 1) { digitalWrite(onboardLED, HIGH); delay(250L); digitalWrite(onboardLED, LOW); delay(250L); } }
A felállást úgy kell érteni, hogy hogyan van a projektbe építve a watchdog. Milyen időközönként avatkozik be, mennyi ideig vár ki stb.
Ezzel a kóddal valószínűleg mindenen meg fog állni induláskor. A korábban általad küldött mintában elég egyértelműen le van írva pár szabály, amit érdemes betartani:
-- setup alatt ki kell kapcsolni (ha a void setup nem fut le, ott azért súlyos bajok vannak),
-- kivárás az élesítés előtt (wathdog, hogy ne forduljon végtelen reset-körbe a kártya és kelljen bootloadertől újra húzni),
-- megfelelő időközönként nullázni kell a watchdogot.
Igen, erre gondoltam, hogy mit csinálsz éppen a kontrollerrel.
Ami a kódot illeti. A loop-on belüli while(1) nem tudom, honnan jött, de teljesen felesleges. A loop() az Arduino keretrendszerben while(1)-ként funkcionál. A kódnak kb. 8 mp-ig kellene futnia, utána reset. Én elvetném egyelőre a Serial.print-et, és helyette a ledet villogtatnám (mint a példaprogramban). Ahogy azt nálam hozzáértőbbek néhányszor már alaposan kitárgyalták a Serial (így a Serial Monitor megnyitása) nem várt hatásokhoz vezethet.
E mellett még megpróbálnám a példaprogramban írt megoldást (wdt_disable(); a setup-ban), illetve ha már ragaszkodsz hozzá, több és informatívabb kiírást (Serial.print) mindenféle helyeken, különös tekintettel az időre ( millis() ). Ha reset után történik a baleset, tisztázni kellene, hogy mikor és mi történik, valóban van-e reset (tehát elindul újra a program a setup-tól vagy sem).
> Az jó, ha most nem számít. De mit is jelent? És ezt a Nanoból kapta vissza? Akkor valami kommunikáció már van, vagy ez még nem jelenti azt?
A nano, mint minden Arduino, két fő részből áll. A cél mikrokontrollerből, ami itt ATmega 328P-PU, és a soros USB illesztő mikrokontrollerből, ami itt CH340. Tehát ez az információ semmi mást nem jelent, mint azt, hogy sikeresen lekérdezte USB kapcsolaton az illesztő VID/PID párosát.
Nincs rajta bootloader. Megoldás: Tegyél rá. (Van működő Arduinod?)
UNO bootloader van rajta. Megoldás: Válaszd az UNO-t a board listából.
Zárlatos / szakadt a panel. Megoldás: Javítsd meg.
Döglött az MCU. Megoldás: Dobd ki.
> Programmer-nek "USBasp"-t
Ez itt nem játszik, mindegy.
Egyet rendeltél? 2 dolláros termékről van szó, érdemes többet rendelni, mint újra várni hetekig, ha hibás. Mondjuk én eddig még nem találkoztam hibással.
Rendeltem egy Nano V3.0 ATmega328 16M kínai klónt CH340G USB vezérlővel, hogy ismerkedjem az Ardunio rendszerrel. Első próbálkozásként letöltöttem és telepítettem hozzá az IDE-t (v. 1.8.1), és a CH430 USB driver-t. XP alatt látszik mint COM6, ezt, és a Nano-t, processzort (328) beállítottam az IDE-ben. Programmer-nek "USBasp"-t.
A panelen a zöld Power LED világít, egy piros villog. (Ez azt jelzi, hogy a Boot loader várja az infót az USB-n?)
Elsőként a minták közül kiválasztottam a "Blink"-et. A fordítás lefutott, de a letöltés nem:
"Arduino: 1.8.1 (Windows XP), Board: "Arduino Nano, ATmega328" Sketch uses 2068 bytes (6%) of program storage space. Maximum is 30720 bytes. Global variables use 186 bytes (9%) of dynamic memory, leaving 1862 bytes for local variables. Maximum is 2048 bytes. avrdude: stk500_recv(): programmer is not responding avrdude: stk500_recv(): programmer is not responding avrdude: error reading signature data for part "ATmega328P", rc=-1 avrdude: error reading signature data, rc=-1 avrdude: error reading signature data, rc=-1
A "Get board info"-ra ezt kaptam:
"BN: Unknown board VID: 1A86 PID: 7523"
Rossz lehet a panel, vagy valami még hiányzik a beállításokból?
Sketch uses 26364 bytes (81%) of program storage space. Maximum is 32256 bytes. Global variables use 1528 bytes (74%) of dynamic memory, leaving 520 bytes for local variables. Maximum is 2048 bytes.
Sketch uses 26602 bytes (82%) of program storage space. Maximum is 32256 bytes. Global variables use 1662 bytes (81%) of dynamic memory, leaving 386 bytes for local variables. Maximum is 2048 bytes. Low memory available, stability problems may occur.
A kód, amiből lehetne gyomlálni
[code] /*Arduino Uno, ATmega328 Multiple DS18B20 Temperature Sensors DS18B20 Pinout (Left to Right, pins down, flat side toward you) - fekete = Ground - sárga = Signal (Pin 2): (with 3.3K to 4.7K resistor to +5 or 3.3 ) - zöld = +5 or +3.3 Displayed on 4x20 character LCD display DS3231 RTC MAX6675 + K' thermocouple DS1624 Temperature Sensors */ #include <SPI.h> #include <SD.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DS1624.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <MAX6675.h> DS1624 temperature1(0x48); DS1624 temperature2(0x4E); DS1624 temperature3(0x4D); DS1624 temperature4(0x4F); #define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } /*-----( Declare Constants and Pin Numbers )-----*/ // Data wire is plugged into port 2 on the Arduino (can be changed) #define ONE_WIRE_BUS 2 // NOTE: No ";" on #define #define SZV1START 3 // relay1 #define SZV2START 4 // relay2 #define PUFFER 5 // relay3 #define LAKAS1 6 // relay4 #define BYPASS 7 // relay5 #define LAKAS2 8 // relay6 /*-----( Declare objects )-----*/ // Setup a oneWire instance to communicate with any OneWire devices // (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS);
// Pass address of our oneWire instance to Dallas Temperature. DallasTemperature sensors(&oneWire);
// Start the LCD display library LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display int LED1 = 13; // Status LED Pin int CS = 10; // CS pin on MAX6675 int SO = 11; // SO pin of MAX6675 int SCLK = 9; // SCLK pin of MAX6675 int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F) float fusthofok = 0.0; // Temperature output variable float lakaskW = 0.0; float kazankW = 0.0; // Initialize the MAX6675 Library for our chip MAX6675 temp(CS,SO,SCLK,units);
// Setup Serial output and LED Pin // MAX6675 Library already sets pin modes for MAX6675 chip! /*-----( Declare Variables )-----*/ // Assign the addresses of your 1-Wire temp sensors. // See the tutorial on how to obtain these addresses: // http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#Read%20individual