if (digitalRead(10) == LOW) // ha A nyomógomb értéke alacsony akkor { digitalWrite(13, HIGH); // a LED kimenet magas, LED ON digitalWrite(11, HIGH); delay(100); Serial1.print(soros,HEX); Serial1.print(255,HEX); Serial1.print("rn"); delay(100); digitalWrite(11, LOW); delay(100);
} if (digitalRead(10) == HIGH) //ha B nyomógomb értéke alacsony akkor { digitalWrite(13, LOW); // a LED kimenet is alacsony, LED OFF
Összekötöttem az fentiek szerinti kapcsolást, a MAX485 összekötöttem egy Loxone épületfelügyelet RS485 átjárójával.
Nem találtam pontos leírás és nagyon kezdő arduino-s vagyok, de ha a lenti kis progival "írok a buszra"a Loxone monitorban megjelenik , viszont a többi rs485-ös eszköz nem működik amíg a max485 a buszon van.
Van valami ötletetek miért?
int soros = 207;
void setup() { Serial1.begin(9600); Serial.begin(9600); // Serial port beállítás
if (digitalRead(10) == LOW) // ha A nyomógomb értéke alacsony akkor { digitalWrite(13, HIGH); // a LED kimenet magas, LED ON digitalWrite(11, HIGH); digitalWrite(12, HIGH); delay(100); Serial1.print(soros,HEX); Serial1.print(255,HEX); Serial1.print("rn"); delay(100); digitalWrite(11, LOW); digitalWrite(12, LOW); delay(100);
} if (digitalRead(10) == HIGH) //ha B nyomógomb értéke alacsony akkor { digitalWrite(13, LOW); // a LED kimenet is alacsony, LED OFF
Nézd meg a bootloader-ek forrását - wdt- re kell keresni.
Ami a biteket illeti máshol kell beállítani.
Benne volt a linkelt anyagban.
ATmegaBOOT_168.c:
int main(void) { uint8_t ch,ch2; uint16_t w;
#ifdef WATCHDOG_MODS //<- Ez nincs definiálva ch = MCUSR; MCUSR = 0;
WDTCSR |= _BV(WDCE) | _BV(WDE); WDTCSR = 0;
// Check if the WDT was used to reset, in which case we dont bootload and skip straight to the code. woot. if (! (ch & _BV(EXTRF))) // if its a not an external reset... app_start(); // skip bootloader #else asm volatile("nopnt"); #endif
Befejeztem egyelőre a kisérletezést, rendeltem még 2 db nanot.
Kiszedtem a fűtésvezérlőből egy nanot, nem működik az usb csatlakozása.
ICSP csatlakozással összekötöttem a tartalék nanoval, azt előtte felprogramoztam ArduinoISP-nek IDE 1.6.7-el, arról simán működik a bootloader feltöltése.
#include <Arduino.h> #include <wdt.h> /* watchdog timer example code.
flashes LED three times quickly on boot up. Then goes thru a loop delaying an additional 250ms on each iteration. The LED is on during each delay. Once the delay is long enough, the WDT will reboot the MCU. */
const int onboardLED = 13;
void setup() {
int k;
// immediately disable watchdog timer so set will not get interrupted
wdt_disable();
// I often do serial i/o at startup to allow the user to make config changes of // various constants. This is often using fgets which will wait for user input. // any such 'slow' activity needs to be completed before enabling the watchdog timer.
// the following forces a pause before enabling WDT. This gives the IDE a chance to // call the bootloader in case something dumb happens during development and the WDT // resets the MCU too quickly. Once the code is solid, remove this.
delay(2L * 1000L);
// enable the watchdog timer. There are a finite number of timeouts allowed (see wdt.h). // Notes I have seen say it is unwise to go below 250ms as you may get the WDT stuck in a // loop rebooting. // The timeouts I'm most likely to use are: // WDTO_1S // WDTO_2S // WDTO_4S // WDTO_8S
wdt_enable(WDTO_4S);
// initialize the digital pin as an output. // Pin 13 has an LED connected on most Arduino boards:
pinMode(onboardLED, OUTPUT);
// at bootup, flash LED 3 times quick so I know the reboot has occurred.
for (k = 1; k <= 3; k = k + 1) { digitalWrite(onboardLED, HIGH); delay(250L); digitalWrite(onboardLED, LOW); delay(250L); } // delay a bit more so it is clear we are done with setup delay(750L); }
void loop() {
int k;
// this loop simply turns the LED on and then waits k*250ms. As k increases, the amount of time // increases. Until finally the watch dog timer doesn't get reset quickly enough. for (k = 1; k<= 10000; k = k + 1) { // at the top of this infinite loop, reset the watchdog timer wdt_reset(); digitalWrite(onboardLED, HIGH); delay(k*250L); digitalWrite(onboardLED, LOW); delay(250L); } }
Ez a reset kód, a nanora feltölthető, de lefagyasztja, tehát nem működik a wdt:
#include <avr/wdt.h>
void setup() { wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop Serial.begin(9600); Serial.println("Setup..");
Serial.println("Wait 5 sec.."); delay(5000); // Задержка, чтобы было время перепрошить устройство в случае bootloop wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек. Serial.println("Watchdog enabled."); }
int timer = 0;
void loop(){ // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(13, digitalRead(13)==1?0:1); delay(1);
Ez a WDT kód, a DUE-ra feltölthető, és működik a wdt:
/* Blink Turns on an LED on for one second, then off for one second, repeatedly.
Most Arduinos have an on-board LED you can control. On the Uno and Leonardo, it is attached to digital pin 13. If you're unsure what pin the on-board LED is connected to on your Arduino model, check the documentation at http://arduino.cc
This example code is in the public domain.
modified 8 May 2014 by Scott Fitzgerald */ void watchdogSetup(void) { watchdogEnable(1000); //restart idő 1000-tól }
// the setup function runs once when you press reset or power the board void setup() { // initialize digital pin 13 as an output. pinMode(13, OUTPUT); Serial.begin(115200); Serial.println ("start"); }
// the loop function runs over and over again forever void loop() { digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(13, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second Serial.println("Hello World"); delay(1000); while (1){ delay (100); // 100-tól Serial.println(millis()); watchdogReset(); } }
Mint mondtam kezdő vagyok a témában, de én vetettem fel a watch dog használatát.
Én nem az Arduino-ban lévő valamit gondoltam ide, hanem egy külső áramköri megoldásra gondoltam. Ha jól emlékszem akkor olyasmi lehet, hogy adott idő között küldeni kell rá egy jelet a loop-on belül adott lábra, mert ha nem akkor az eszköz vagy reset-jelet küld a nano felé, vagy egyszerűen lekapcsolja a tápfeszt egy időre.
Ti nem ezt csináljátok? Szerintem az lenne a tuti, ha pl 1s hosszra kikapcsolja a tápot, majd újra indul minden. Azaz az Arduino erről az IC-ről kapná a feszt. (De ilyet nem találtam, csak reset jeleset.)
Nekem van téglásodott Nano-m, valószínűleg (illetve szinte biztos) egy PROGMEM túlcsordulás verte ki a „biztosítékot”. Azt meg tudtam csinálni (egyszer), hogy sima "copy-paste" módszerrel egy másik, működő kártyáról átraktam egy működő szoftvert, ami futott is, de ezt többször nem sikerült. Mindent megnéztem rajta minden létező szoftverrel, de semmi.
Ami a watchdogot illeti.
Ezen a szinten én egyszerűen kiiktatnám a bootloadert. Ha van hozzá eszköz, a sketch direktben is feltölthető. Ennek három következménye lesz (egyszerűen fogalmazva), az egyik, hogy számottevően gyorsabb lesz a boot (nem kell a bootloadert kivárni), másrészt közvetlenebb lesz a kapcsolat a szoftver és a mikrokontroller között. A gáz az, hogy innentől csak így lehet programozni, simán USB-re dugva nem, legalábbis addig, amíg egy új bootloadert nem kap a kontroller.
Pár fórumba beleolvastam és voltak érdekességek a watchdog és a bootloader összeakadásával.