Keresés

Részletes keresés

Törölt nick Creative Commons License 2017.01.23 0 0 2793

Conclusions:
Free Memory functions for Arduino are a little bit voodoo magic, don’t take the absolute value for granted!

Előzmény: Törölt nick (2792)
Törölt nick Creative Commons License 2017.01.23 0 0 2792

Minden azonos.

 

Az 1.6.4v tölti fel az üzemelő vezérlőre a  RAM vizsgálatát nem tartalmazó kódot, az I2C LCD csak azzal jeleníti meg helyesen a karaktereket.

 

[code]
//Sketch uses 26 502 bytes (86%) of program storage space. Maximum is 30 720 bytes.
//Global variables use 1 528 bytes (74%) of dynamic memory, leaving 520 bytes for local variables. Maximum is 2 048 bytes.

/*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"
#include "Timer.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

// WP 1
DeviceAddress pufferfent = { 0x28, 0xAC, 0xFA, 0x26, 0x06, 0x00, 0x00, 0x8C }; // "T1"
DeviceAddress puffer1_3 = { 0x28, 0x61, 0xBB, 0x26, 0x06, 0x00, 0x00, 0x7D }; // "T2"
DeviceAddress puffer2_3 = { 0x28, 0x99, 0x10, 0x26, 0x06, 0x00, 0x00, 0xED }; // "T3"
DeviceAddress pufferlent = { 0x28, 0x15, 0x1F, 0x28, 0x06, 0x00, 0x00, 0x00 }; // "T4"
DeviceAddress kintihofok = { 0x28, 0x49, 0xFE, 0x26, 0x06, 0x00, 0x00, 0x51 }; // "T9"
float T1 = 0;
float T2 = 0;
float T3 = 0;
float T4 = 0;
float T9 = 0;
float kW1 = 0;
float kW = 0;
float szazalek = 0;
float T5 = 0;
float T6 = 0;
float T7 = 0;
float T8 = 0;
float lakaskW1 = 0;
float kazankW1 = 0;

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void kiolvas_t()
{
//puffer hőfok DS18B20-ból
sensors.requestTemperatures(); // Send the command to get temperatures
T1 = sensors.getTempC(pufferfent);
T2 = sensors.getTempC(puffer1_3);
T3 = sensors.getTempC(puffer2_3);
T4 = sensors.getTempC(pufferlent);
T9 = sensors.getTempC(kintihofok);
kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
kW = kW1*1.2771 ;
szazalek = kW/64*100;

//hőfok kiolvasása DS1624-ből
T5 = temperature1.getTemp();
T6 = temperature2.getTemp();
T7 = temperature3.getTemp();
T8 = temperature4.getTemp();
lakaskW1 = (T5-T6)*0.001161*12.5*60;
kazankW1 = (T7-T8)*0.001161*28*60;
//lakástermosztát fűtésre kapcsol= A3=5V
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
//hőfok kiolvasása MAX6675-ből
fusthofok = temp.read_temp();
if (LAKASFUTES > 0)
{
lakaskW = lakaskW1;
}
else
{
lakaskW = 0;
}
if(T7 > 47)
{
kazankW = kazankW1;
}
else
{
kazankW = 0;
}
}
void serial_print()
{
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
Serial.println(LAKASFUTES);
Serial.println(fusthofok);
Serial.println(T1);
Serial.println(T2);
Serial.println(T3);
Serial.println(T4);
Serial.println(T5);
Serial.println(T6);
Serial.println(T7);
Serial.println(T8);
Serial.println(T9);
Serial.println(kW);
Serial.println(szazalek);
}
void sd_iras()
{
SD.begin(A0);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);

// Lakástermosztát fűtésre kapcsol= A3=5V
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);

String dataString ="";
//dataString.reserve(150);
Serial.println(freeRam());
dataString += String(dayOfMonth, DEC);
dataString += ';';
Serial.println(freeRam());
dataString += String(hour, DEC);
dataString += ';';
Serial.println(freeRam());
dataString += String(minute, DEC);
dataString += ';';
Serial.println(freeRam());
dataString += String(second, DEC);
dataString += ';';
Serial.println(freeRam());
dataString += String(LAKASFUTES);
dataString += ';';
Serial.println(freeRam());
dataString += String(fusthofok);
dataString += ';';
Serial.println(freeRam());
dataString += String(T1);
dataString += ';';
Serial.println(freeRam());
dataString += String(T2);
dataString += ';';
Serial.println(freeRam());
dataString += String(T3);
dataString += ';';
Serial.println(freeRam());
dataString += String(T4);
dataString += ';';
Serial.println(freeRam());
dataString += String(T5);
dataString += ';';
Serial.println(freeRam());
dataString += String(T6);
dataString += ';';
Serial.println(freeRam());
dataString += String(T7);
dataString += ';';
Serial.println(freeRam());
dataString += String(T8);
dataString += ';';
Serial.println(freeRam());
dataString += String(T9);
dataString += ';';
Serial.println(freeRam());
dataString += String(kazankW);
dataString += ';';
dataString += String(lakaskW);
dataString += ';';
Serial.println(freeRam());
dataString += String(kW);
dataString += ';';
Serial.println(freeRam());
dataString += String(szazalek);
dataString += ';';
Serial.println(freeRam());
dataString.replace('.',',');
File dataFile = SD.open("datalog.csv", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
}
void lcd_idopont ()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(5,0);
lcd.print("20");
lcd.setCursor(7,0);
lcd.print(year, DEC);
lcd.setCursor(9,0);
lcd.print('.');
lcd.setCursor(10,0);
lcd.print(month, DEC);
lcd.setCursor(12,0);
lcd.print('.');
lcd.setCursor(13,0);
lcd.print(dayOfMonth, DEC);
lcd.setCursor(15,0);
lcd.print('.');
lcd.setCursor(5,1);
lcd.print(hour, DEC);
lcd.setCursor(7,1);
lcd.print(':');
lcd.setCursor(8,1);
lcd.print(minute, DEC);
lcd.setCursor(10,1);
lcd.print(':');
lcd.setCursor(11,1);
lcd.print(second,DEC);
lcd.setCursor(1,3);
lcd.print(dayOfWeek);
lcd.setCursor(2,3);
lcd.print('.');
lcd.setCursor(5,3);
lcd.print(F("nap a heten"));
}
void lcd_puffer ()
{
lcd.clear();
lcd.home(); lcd.backlight();
lcd.setCursor(8,0);
lcd.print(F("PUFFER"));
lcd.setCursor(0,1);
lcd.print(F("T1="));
lcd.setCursor(4,1);
lcd.print(T1);
lcd.setCursor(11,1);
lcd.print(F("T2="));
lcd.setCursor(14,1);
lcd.print(T2);
lcd.setCursor(0,2);
lcd.print(F("T3="));
lcd.setCursor(4,2);
lcd.print(T3);
lcd.setCursor(11,2);
lcd.print(F("T4="));
lcd.setCursor(14,2);
lcd.print(T4);
lcd.setCursor(0,3);
lcd.print(F("kW="));
lcd.setCursor(4,3);
lcd.print(kW);
lcd.setCursor(11,3);
lcd.print(F("%="));
lcd.setCursor(14,3);
lcd.print(szazalek);
}
void lcd_teljesitmeny()
{
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print(F("LAKAS:"));
lcd.setCursor(11,0);
lcd.print(lakaskW);
lcd.setCursor(0,1);
lcd.print(F("T5="));
lcd.setCursor(4,1);
lcd.print(T5);
lcd.setCursor(11,1);
lcd.print(F("T6="));
lcd.setCursor(14,1);
lcd.print(T6);
lcd.setCursor(4,2);
lcd.print(F("KAZAN:"));
lcd.setCursor(11,2);
lcd.print(kazankW);
lcd.setCursor(0,3);
lcd.print(F("T7="));
lcd.setCursor(4,3);
lcd.print(T7);
lcd.setCursor(11,3);
lcd.print(("T8="));
lcd.setCursor(14,3);
lcd.print(T8);
}
void lcd_fusthofok()
{
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(8,0);
lcd.print(F("FUSTHOFOK"));
lcd.setCursor(0,1);
lcd.print(F("fusthofok="));
lcd.setCursor(11,1);
lcd.print(fusthofok);
lcd.setCursor(8,2);
lcd.print(F("KINTIHOFOK"));
lcd.setCursor(0,3);
lcd.print(F("kintihofok="));
lcd.setCursor(12,3);
lcd.print(T9);
}
void szabalyozas()
{
if(T7 > 55 && fusthofok > 130)
{

digitalWrite(LAKAS1,LOW );
digitalWrite(SZV1START,HIGH);
digitalWrite(PUFFER, HIGH);
}
else
{
if(T7 > 47)
{
digitalWrite(PUFFER, LOW);
digitalWrite(LAKAS1, HIGH);
digitalWrite(SZV1START, HIGH);
}
else
{
digitalWrite(PUFFER, LOW);
digitalWrite(LAKAS1, HIGH);
digitalWrite(SZV1START, LOW);
}
}
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
if ( LAKASFUTES > 4 && szazalek >1)
{
digitalWrite(BYPASS, HIGH);
digitalWrite(LAKAS2, LOW); // 6. RELÉ 8d
digitalWrite(SZV2START, HIGH); // 2. RELÉ 4d
}
else
{
digitalWrite(LAKAS2, HIGH);
digitalWrite(BYPASS, LOW); // 5. RELÉ 7d
digitalWrite(SZV2START, LOW); // 2. RELÉ 4d
}
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
int fr = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
Serial.print("Free ram: ");
Serial.println(fr);

}
Timer t;
void setup() {
lcd.init(); // initialize the lcd
lcd.backlight();
Serial.begin(115200);
// set the initial time here:
//DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(30,12,11,13,13,04,16);

//------- Initialize the Temperature measurement library--------------
sensors.begin();
// set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
sensors.setResolution(pufferfent, 10); //T1
sensors.setResolution(puffer1_3, 10); //T2
sensors.setResolution(puffer2_3, 10); //T3
sensors.setResolution(pufferlent, 10); //T4
sensors.setResolution(kintihofok, 10); //T9
temperature1.start();
temperature2.start();
temperature3.start();
temperature4.start();
pinMode(LED1, OUTPUT);
pinMode(SZV1START, OUTPUT);
pinMode(LAKAS1, OUTPUT);
pinMode(PUFFER, OUTPUT);
pinMode(SZV2START,OUTPUT);
pinMode(LAKAS2,OUTPUT);
pinMode(BYPASS,OUTPUT);
digitalWrite(SZV1START, HIGH); // szv1 áll
digitalWrite(LAKAS1, HIGH);
digitalWrite(PUFFER, HIGH); // pufferre állítja az irányváltó1-et
digitalWrite(SZV2START, HIGH); // szv2 áll
digitalWrite(LAKAS2, HIGH);
digitalWrite(BYPASS, HIGH); // bypassra állítja irányváltó2-őt

kiolvas_t();

t.every(5*1000, kiolvas_t); //5 másodpercenként
t.every(5*1000, serial_print); //5 másodpercenként
t.every(15*1000, sd_iras); //15 másodpercenként
t.every(6*1000, szabalyozas); //6 másodpercenként
t.every(4*1000, lcd0); //sorban 4 másodpercenként a 4 kijelzési kép

pinMode(A0, OUTPUT);
SD.begin(A0);
if (!SD.begin(A0)) {

Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");

if (SD.exists("datalog.csv")) {
Serial.println("datalog.csv exists.");
}
else {
Serial.println("datalog.csv doesn't exist.");
}
}
void loop()
{
t.update();
}
void lcd0()
{
static int c = 0;
if (c==0) lcd_idopont();
if (c==1) lcd_puffer();
if (c==2) lcd_teljesitmeny();
if (c==3) lcd_fusthofok();
c=(c+1) % 4;
}

[/code]

Előzmény: titusz99 (2791)
titusz99 Creative Commons License 2017.01.23 0 0 2791

Úgy látom lehet összehasonlítgatni a két verziót.

Változtattál valamit a core-n belül?

Sok az a kb. 140 byte különbség.

Előzmény: Törölt nick (2790)
Törölt nick Creative Commons License 2017.01.23 0 0 2790

IDE 1.6.4

Sketch uses 30 296 bytes (93%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 530 bytes (74%) of dynamic memory, leaving 518 bytes for local variables. Maximum is 2 048 bytes.

Free ram: 437

5
Free ram: 431
5
Free ram: 431
5
Free ram: 425
5
Free ram: 424
5
Free ram: 417
5
Free ram: 408
5
Free ram: 398
5
Free ram: 388
5
Free ram: 378
5
Free ram: 370
5
Free ram: 365
5
Free ram: 360
5
Free ram: 355
5
Free ram: 350
5
Free ram: 342
5
Free ram: 332
5
Free ram: 324
5
Free ram: 316

 

IDE 1.8.0

Sketch uses 27080 bytes (83%) of program storage space. Maximum is 32256 bytes.
Global variables use 1540 bytes (75%) of dynamic memory, leaving 508 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.

Free ram: 255
5
Free ram: 249
5
Free ram: 249
5
Free ram: 243
5
Free ram: 242
5
Free ram: 235
5
Free ram: 226
5
Free ram: 216
5
Free ram: 206
5
Free ram: 205
5
Free ram: 204
5
Free ram: 199
5
Free ram: 194
5
Free ram: 189
5
Free ram: 184
5
Free ram: 183
5
Free ram: 173
5
Free ram: 172
5
Free ram: 171
5

Előzmény: titusz99 (2789)
titusz99 Creative Commons License 2017.01.23 0 0 2789

Azt már jeleztem, hogy az SD-re írásod kritikus.

Azt a részt át kell írni, mert nagyon sok RAM-ot eszik.

A "reserve(200)" lehet, hogy sok, ki kell számolni, de jobban jársz ha beállítod.

Javaslom, hogy serialra írasd ki a freemem értékét minden egyes sor előtt.

Akkor kiderül, hogy mi a helyzet.

Az "= String(valami);" helyett "=valami;".

 

(Kevés RAM esetén a String-ek nem működnek. Ilyenkor üresek lesznek.)

Előzmény: Törölt nick (2787)
Törölt nick Creative Commons License 2017.01.23 0 0 2788

Sketch uses 26730 bytes (82%) of program storage space. Maximum is 32256 bytes.
Global variables use 1530 bytes (74%) of dynamic memory, leaving 518 bytes for local variables. Maximum is 2048 bytes.

 

Viszont különbözik a méret az verziótól függően is, a fenti IDE 1.8.0v, az előbbi  IDE 1.6.4v volt.

Viszont csak IDE 1.6.4v-val jeleníti meg helyesen a 4x20 soros I2C lcd a karaktereket.

Előzmény: Törölt nick (2787)
Törölt nick Creative Commons License 2017.01.23 0 0 2787

Sketch uses 29 816 bytes (92%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 520 bytes (74%) of dynamic memory, leaving 528 bytes for local variables. Maximum is 2 048 bytes.

Át kellett írni a kódot, az SD kártyára nem írt ki adatot:

 

void sd_iras()
{
SD.begin(A0);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);

// Lakástermosztát fűtésre kapcsol= A3=5V
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);

String dataString =""; //String dataString; helyett
//dataString.reserve(200);
dataString += String(dayOfMonth, DEC);

Előzmény: titusz99 (2753)
titusz99 Creative Commons License 2017.01.23 0 0 2786

A hiba (reset probléma) a soros programozáskor fordulhat elő (16u2 irányából).

Programozó használatát nem érinti.

A 10 V-os ütés a reset lábon egy kicsit túlzás.

Azért van a védődióda a felhúzó-ellenállással párhuzamosan.

Talán egy zéner jobb lett volna.

Ezek szerint a szerzőnél lévő példány hibás volt, akkor elképzelhető, hogy az uno programozása hibára futott.

 

Előzmény: Vargham (2784)
323i Creative Commons License 2017.01.23 0 0 2785

Szerintem igen, nekem segitett.

Előzmény: nagyharcos (2781)
Vargham Creative Commons License 2017.01.23 0 0 2784

>Ez a kondenzátoros reset nekem vakításnak tűnik.

Ezt hogy érted?

https://rheingoldheavy.com/arduino-from-scratch-part-11-atmega328p-dtr-and-reset/

Előzmény: titusz99 (2783)
titusz99 Creative Commons License 2017.01.23 0 0 2783

Az 1.7.11-es Arduino IDE mega bootlodere szerint (stk500v2) kezeli a wdt-t.

Ezért azt javaslom, hogy próbáld azt feltölteni.

Ha a teszt ezek után is lefagy akkor vagy fordítasz vagy keresel hozzá való bootloader-t ami jó.

Ez a kondenzátoros reset nekem vakításnak tűnik.

A programozó egyik kimenetével pisztergálja a reset lábat.

Szóval kimenetet terhelsz egy kondival.

Előzmény: nagyharcos (2781)
titusz99 Creative Commons License 2017.01.23 0 0 2782

Ha lefagy, elszáll a wdt használata(tesztje) során akkor igen, olyan bootloader-re ami kezeli a wdt-t.

Előzmény: nagyharcos (2781)
nagyharcos Creative Commons License 2017.01.23 0 0 2781

Szia!

Kipróbáltam a kína megámaon a WDT-t. Nálam is kifagy!  Egyébként minden oké... Ezek szerint nekem is le kéne cserélnem a bootloadert?

Előzmény: 323i (2780)
323i Creative Commons License 2017.01.23 0 0 2780

Sikerult a bootloader frissites!

Tegnap linux alatt probaltam, ott vmiert nem ment; ma win alatt (ugyanugy kabelezve mint tegnap), elore megcsinalta.

Feltoltottem a wdt-t es szepen ujrainditgatja magat a mega.

 

Tehat az unorol a mega bootloader frissites megy; visszafele azt a hibat irja ki, amit a kondi hianya okoz. Ha sikerul ez is, megirom.

 

Addig is koszonom mindenkinek aki probalt segiteni!

Előzmény: titusz99 (2775)
323i Creative Commons License 2017.01.22 0 0 2779

Nalam mega/uno szinten ugyanugy fagy.

Ha megvagyok a bootloader update-tel, jelzem es bizom benne hogy mukodni fog a wdt.

Előzmény: Törölt nick (2778)
Törölt nick Creative Commons License 2017.01.22 0 0 2778

https://bigdanzblog.wordpress.com/2014/10/23/installing-the-optiboot-loader-on-an-arudino-nano-to-fix-the-watch-dog-timer-wdt-issue/

https://bigdanzblog.wordpress.com/2014/10/24/arduino-watchdog-timer-wdt-example-code/

https://learn.sparkfun.com/tutorials/installing-an-arduino-bootloader

Ezek alapján a nanon sikerült bekapcsolni a wdt funkciót, a nano uno-ként viselkedik.

Nem lettem előrébb, a lefagyás wdt-vel is teljes, az az elektronikai rész is lefagy, csak a tápfeszültség ki-be kapcsolás oldja meg az újra indítást.

Az igen erős mágneses zavar, pl. egy induktív kapcsolás üti ki a magyarázatok szerint, azt kerülni kell.

A kódban is lehetnek hibák, nálam a delay(); időzítés elmaradása határozott stabilitás javulást eredményezett.

Előzmény: 323i (2776)
323i Creative Commons License 2017.01.22 0 0 2777

Ez alapjan kotottem ossze a mega-t es az uno-t. 2:12-nel van az, amikor inditja a bootloader feltoltest, nekem akkor hibat ir ki, amire ezt talaltam itt: "2. When getting this error:  avrdude: stk500_getsync(): not in sync: resp=0x00
You did not put an 100nF capacitor between +5v and RESET pin on the Arduino Mega 2560". Szo szerint nem ez a hibauzenet amit kapok, de ugyaningy kezdodik. Szoval a jovo heten vmikor kiprobalom 100n-s kondit a +5 es a reset koze, ahogy irjak.

Előzmény: titusz99 (2775)
323i Creative Commons License 2017.01.22 0 0 2776

Ezek sajnos nem segitettek, marad a bootloader csere.

Előzmény: Prof (2772)
titusz99 Creative Commons License 2017.01.22 0 0 2775

Van egy usbasp-om ilyen esetekre.

A bootloader, ami az arduino ide része.

Annyi, hogy kicsit át kell írni a boards.txt-t.

Az interneten rengeteg anyag van ezzel kapcsolatban.

Arról is, hogy hogyan lehet egyik arduinoval a másik bootloaderét cserélni vagy egyszerűen csak programozni.

Előzmény: 323i (2774)
323i Creative Commons License 2017.01.22 0 0 2774

Masik Arduino-val frissitetted a bootloadert?

Honnan toltotted le hozza az optiboot-ot?

 

Ezt en sem ertem, azert (is) vettem nano/uno/megat, hogy valamelyiken csak jo lesz, de nem. A masik ok pedig az, hogy igy egyikkel tudjam a masikon frissiteni a bootloadert.

 

A bootloader-t verziojat ki lehet valahogyan olvasni, vagy pl. ezzel a wdt-s teszttel lehet tudni hogy nem a legutolso verzio?

Előzmény: titusz99 (2773)
titusz99 Creative Commons License 2017.01.22 0 0 2773

Ha bármelyik wdt tesztet futtatva lefagy, akkor bootloadert kell cserélni.

Csere után, lehet tesztelni.

Miattad a NANO-mat teszteltem.

Lefagyott, optiboot-ra lecseréltem.

A teszt sikereses futott.

 

Én csak azt nem értem, hogy ennyi év után még most is a régi bootloader-rel árulják a modulokat.

Egyébként az alap bootloader tartalmazza a wdt kezeléséhez szükséges kódsorokat.

Csak ahhoz úgy kell lefordítani.

A legújabb arduino ide is csak a régi bootloadert tartalmazza. Kiprobáltam.

Előzmény: 323i (2771)
Prof Creative Commons License 2017.01.22 0 0 2772

Szia!

Try-and-error...

http://forum.arduino.cc/index.php?topic=176329.0

És innen hivatkozva:

http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/

 

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

Előzmény: 323i (2771)
323i Creative Commons License 2017.01.22 0 0 2771

Szia,

 

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);
  }
}

void loop(){
  delay(1000);
  digitalWrite(onboardLED, HIGH);
  delay(1000);
  digitalWrite(onboardLED, LOW);
}

===

 

Az elozo kodot (while(1)) amit kuldtem, az in-en talaltam, azert probaltam ki azt is, mert amit eredetileg probaltam es kuldtem, azzal sem mukodott.

A serial.print azert kerult bele az egyik peldaba, hogy lassam meddig jut el a wdt utan.

 

Itt talaltam egy reset teszet: https://github.com/Optiboot/optiboot/tree/master/optiboot/examples/test_reset -et, aminek van egy ilyen resze:

 

===

 if (resetFlags != 0x00)
  {
    // It should never enter here
    Serial.print(" Unknown");
  }

===

 

nalam persze rafut ide es ki is irja a serial.monitoron. Szoval nem vagyok meg elobbre.

 

Valamiert azt gondolom (ill. inkabb csak megerzes), hogy az optiboot-os bootloader update oldana meg a problemamat...

 

Zaraskent kiprobaltam meg millis-sel:

 

===

#include <Arduino.h>
#include<avr/wdt.h>
const int onboardLED = 13;

void setup() {
  wdt_disable();
  Serial.begin(9600);
  digitalWrite(onboardLED, LOW);
  delay(1000);
  wdt_enable (WDTO_8S);
  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);
  }
}

void loop(){
  unsigned long Time1 = 0;
  unsigned long Time2 = 0;

  Time1 = millis();
  delay(500);
  Time2 = millis();
  Serial.print(Time1);
  Serial.print("       ");
  Serial.println(Time2);
  delay(100);
 
  delay(1000);
  digitalWrite(onboardLED, HIGH);
  delay(1000);
  digitalWrite(onboardLED, LOW);
}

===

 

7700 es 8200-ig jut el az egyik es a masik szamlalo, akkor jon(ne) a reset es onnaltol semmi sem tortenik.

Előzmény: Prof (2770)
Prof Creative Commons License 2017.01.21 0 0 2770

Szia!

 

Igen, szoftver.

 

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 eredeti példaprogram működik?

Előzmény: 323i (2769)
323i Creative Commons License 2017.01.20 0 0 2769

Szia,

 

hogy a kerdeseidre valaszoljak:

- gondolom szoftver

- ezt a kerdest nem ertem

- ezzel a koddal Unon ugyanugy megall ujraindulaskor:

- milyen hw-es kornyezetre gondolsz? Nincs semmi az Unon.

 

Nalad milyen koddal mukodik?

 

===

#include<avr/wdt.h>
int i=0;

void setup() {
pinMode(13,OUTPUT);
Serial.begin(9600);
wdt_enable (WDTO_8S);
}

void loop(){
while(1){
i++;
delay(500);
Serial.println(i);
}
}

===

Előzmény: Prof (2706)
Vargham Creative Commons License 2017.01.20 0 0 2768

Szerintem ennél többet távgyógyításban nehéz mondani.

 

Kimérheted még multiméterrel:

  • rx-tx láb között nincs-e zárlat
  • rx, tx és GND, Vcc között nincs-e zárlat
  • CH340 rx, tx lába és az AVR rx, tx lába között nincs-e szakadás

 

+1 ötlet:

Próbáld meg másik gépen, amin nem XP van. (Az XP-t amúgy is érdemes lecserélni.)

Előzmény: szla0056 (2767)
szla0056 Creative Commons License 2017.01.20 0 0 2767

Rendben, akkor "ezzel" nem foglalkozom.

De azt azért továbbra is jó lenne tudni, hogy miért nem megy.

Előzmény: Vargham (2766)
Vargham Creative Commons License 2017.01.20 0 0 2766

> Gondolom a BN-re is illene valamit kapnia, ezt már a kontrollertől, igaz?

Nem, az marad unknown. Ne foglalkozz vele. Mondtam már, hogy nem jelent semmit.

Előzmény: szla0056 (2765)
szla0056 Creative Commons License 2017.01.20 0 0 2765

Igazad van, gugliban tényleg megtaláltam a VID/PID-et.

Gondolom a BN-re is illene valamit kapnia, ezt már a kontrollertől, igaz?

 

A reset-nyomós indítást is próbáltam már, eredmény ugyanaz.

 

Előzmény: Vargham (2764)
Vargham Creative Commons License 2017.01.20 0 0 2764

> Bocs az értetlenkedésért, de ezek szerint ez a kommunikáció csak az illesztővel történt eddig?

Igen

 

> És mit takar a VID, a PID és a BN?

Google? (USB hardver azonosító: Vendor ID és Product ID. A BN-t pedig Arduino Board Namenek tippelem.)

 

> A bekapcsolás után folyamatosan villogó L led azt jelzi hogy fut egy bootloader?

Azt hiszem, de most nem találom az információ forrását.

 

> És a hibaüzenet szerint a kontroller nem válaszol?

Pontosan

 

Tartsd lenyomva a reset gombot, és csak akkor engedd el, amikor kiírja, hogy "Uploading..."

Előzmény: szla0056 (2763)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!