Datel
|
Napsal: stř 22.10.2014 14:10 |
|
Zkušený debatér
|
|
|
Registrován: 19.6.2009 Příspěvky: 225 Bydliště: Plzeň, ČR
|
ta konstrukce by měla udělat jen to, že po resetu z watchdogu nebo brown-out nebo power-on by to mělo jít rovnou na start aplikace. Jinak se spouští load programu.
_________________ Toro900,SuperZoom,Siesta,Trempík,Fantasy TopmodelCZ,Multiwii QC Optic 6 Sport 2,4GHz FrSky modul
|
|
Nahoru |
|
|
jaroslav.falcon
|
Napsal: stř 22.10.2014 14:14 |
|
Mazák
|
|
|
Registrován: 8.10.2012 Příspěvky: 1539 Bydliště: Kladno
|
tak jsem zkusil zakomentovat mcusr=0, ale to bootloader nefunguje
|
|
Nahoru |
|
|
Datel
|
Napsal: stř 22.10.2014 14:38 |
|
Zkušený debatér
|
|
|
Registrován: 19.6.2009 Příspěvky: 225 Bydliště: Plzeň, ČR
|
Protože to čeká na load kódu. Ten nepřichází a tak to resne watchdog v bootloaderu. A tak pořád dokola.
_________________ Toro900,SuperZoom,Siesta,Trempík,Fantasy TopmodelCZ,Multiwii QC Optic 6 Sport 2,4GHz FrSky modul
|
|
Nahoru |
|
|
jaroslav.falcon
|
Napsal: stř 22.10.2014 14:50 |
|
Mazák
|
|
|
Registrován: 8.10.2012 Příspěvky: 1539 Bydliště: Kladno
|
moc nerozumím tomu co píšeš. WD není v defaultu aktivní ? a mcusr by mel byt 0 ?
no a nemáš nějaký nápad jak to udělat ?
|
|
Nahoru |
|
|
Drondys
|
Napsal: stř 22.10.2014 14:50 |
|
Mazák
|
|
|
Registrován: 22.2.2010 Příspěvky: 11876 Bydliště: ČR Obrázky: 1
|
Při tom zakomentování MCUSR = 0; na začátku funkce main v bootloaderu zkus dát jedno volání MCUSR = 0; do svého zdrojáku aplikace přímo na začátek funkce setup() s tím, že si stav před vynulováním nejprve uložíš do své globální proměnné takto: Kód: uint8_t MyRstFlags;
void setup() { MyRstFlags = MCUSR; MCUSR = 0; .... a kromě toho ještě v tom bootloaderu další volání MCUSR = 0; pod řádek s tím podmínečným voláním appStart takto: Kód: ... ch = MCUSR; // MCUSR = 0; if (ch & (_BV(WDRF) | _BV(BORF) | _BV(PORF))) appStart(ch);
MCUSR = 0;
... Po resetu z watchdogu nebo brown-out nebo power-on by to mělo jít rovnou na start aplikace a tím se načte do MyRstFlags stav MCUSR po tom konkrétním resetu. Jinak se MCUSR vynuluje a pak se spustí load programu.
|
|
Nahoru |
|
|
jaroslav.falcon
|
Napsal: stř 22.10.2014 15:23 |
|
Mazák
|
|
|
Registrován: 8.10.2012 Příspěvky: 1539 Bydliště: Kladno
|
to nulovani dat pod podminku jsem take testnul a to nejde. Nulovat MCUSR v hlavnim codu take nejde protoze ho tam nenahrajes. Prelozim bootloader flasnu pres ISP a tim koncim.
do appstart(ch) se predava to ch a to se urcite nejak musi precis
|
|
Nahoru |
|
|
Datel
|
Napsal: stř 22.10.2014 15:24 |
|
Zkušený debatér
|
|
|
Registrován: 19.6.2009 Příspěvky: 225 Bydliště: Plzeň, ČR
|
MCUSR se ale naplní tu _BV(WDRF) | _BV(BORF) | _BV(PORF) nebo se pletu? Nějak mi uniká přesný význam téhle části
if (ch & (_BV(WDRF) | _BV(BORF) | _BV(PORF)))
podle mě to nejdřív vyhodnotí, zda je nastaven některý z bitů (WDFR nebo BORF nebo PORF) registru MCUSR a podle toho buď spustí aplikační kód nebo load kódu do paměti. A pak tyto bity nastaví na 1.
D.
_________________ Toro900,SuperZoom,Siesta,Trempík,Fantasy TopmodelCZ,Multiwii QC Optic 6 Sport 2,4GHz FrSky modul
|
|
Nahoru |
|
|
jaroslav.falcon
|
Napsal: stř 22.10.2014 15:31 |
|
Mazák
|
|
|
Registrován: 8.10.2012 Příspěvky: 1539 Bydliště: Kladno
|
MCUSR je registr kde jednotlive bity urcuji typ restartu,
WDRF) | _BV(BORF) | _BV(PORF toto je jako maska kde se vyhodnocuji jednotlive bity
aspon teda doufam
WDRF to je ten co mne zajima 3 bit, pokud je zde 1 tak je to prizna WDT coz je 8, ale ja vzdy prectu 8 i po HW resetu.
|
|
Nahoru |
|
|
jaroslav.falcon
|
Napsal: stř 22.10.2014 15:35 |
|
Mazák
|
|
|
Registrován: 8.10.2012 Příspěvky: 1539 Bydliště: Kladno
|
nemelo by byt to nulovani v rutine ktera udela restart kdyz app neni a zustane to vyset . to odpovida i tomu ze to nemaka kdyz je nulovani za podminkou
|
|
Nahoru |
|
|
Drondys
|
Napsal: stř 22.10.2014 15:43 |
|
Mazák
|
|
|
Registrován: 22.2.2010 Příspěvky: 11876 Bydliště: ČR Obrázky: 1
|
Datel píše: MCUSR se ale naplní tu _BV(WDRF) | _BV(BORF) | _BV(PORF) nebo se pletu? Ne. Podmínka if (ch & (_BV(WDRF) | _BV(BORF) | _BV(PORF))) nic nenaplňuje. Je to pouze test zda proměná ch je nenulová a současně zda je nastaven některý z bitů WDRF, BORF nebo PORF a pokud ano tak se zavolá funke appStart.
|
|
Nahoru |
|
|
Datel
|
Napsal: stř 22.10.2014 15:53 |
|
Zkušený debatér
|
|
|
Registrován: 19.6.2009 Příspěvky: 225 Bydliště: Plzeň, ČR
|
podle mě není rozdíl v tom, jestli je to vynulování před nebo za podmínkou.
_________________ Toro900,SuperZoom,Siesta,Trempík,Fantasy TopmodelCZ,Multiwii QC Optic 6 Sport 2,4GHz FrSky modul
|
|
Nahoru |
|
|
Datel
|
Napsal: stř 22.10.2014 15:55 |
|
Zkušený debatér
|
|
|
Registrován: 19.6.2009 Příspěvky: 225 Bydliště: Plzeň, ČR
|
Drondys píše: MCUSR se ale naplní tu _BV(WDRF) | _BV(BORF) | _BV(PORF) nebo se pletu? Ne. Podmínka if (ch & (_BV(WDRF) | _BV(BORF) | _BV(PORF))) nic nenaplňuje. Je to pouze test zda proměná ch je nenulová a současně zda je nastaven některý z bitů WDRF, BORF nebo PORF a pokud ano tak se zavolá funke appStart. makro _BV() by ale přece ty bity mělo naplnit. proč by to tam jinak bylo?
_________________ Toro900,SuperZoom,Siesta,Trempík,Fantasy TopmodelCZ,Multiwii QC Optic 6 Sport 2,4GHz FrSky modul
|
|
Nahoru |
|
|
Drondys
|
Napsal: stř 22.10.2014 15:57 |
|
Mazák
|
|
|
Registrován: 22.2.2010 Příspěvky: 11876 Bydliště: ČR Obrázky: 1
|
jaroslav.falcon píše: do appstart(ch) se predava to ch a to se urcite nejak musi precis Problém je v tom, že v bootloader ve funkci appstart to nelze vložit do žádné proměnné přímo tvého programu jelikož ty pro bootloader nejsou přístupné a tak se to ukládá do registru R2. Jenže uchování hodnoty v registru R2 zřejmě není zaručeno do doby než se zavolá kód tvé aplikace. Takže v době kdy se zavolá kód tvé aplikace je zřejmě už hodnota registru R2 přepsaná. Ještě mě napadá možnost zkusit zapsat v bootloaderu ve funkci appstart tu hodnotu na nějakou pevně definovanou adresu v EEPROM a tu pak načíst ve tvém programu.
|
|
Nahoru |
|
|
Drondys
|
Napsal: stř 22.10.2014 16:03 |
|
Mazák
|
|
|
Registrován: 22.2.2010 Příspěvky: 11876 Bydliště: ČR Obrázky: 1
|
Datel píše: makro _BV() by ale přece ty bity mělo naplnit. proč by to tam jinak bylo? Ne. Makro _BV() nenaplňuje MCUSR nýbrž pouze pro test vůči proměnné ch v těle podmínky IF vrací hodnotu 1 bitově posunutou o počet bitů odpovídající v parametru makra předané hodnotě viz níže je deklarace toho makra. Kód: #define _BV(bit) (1 << (bit))
|
|
Nahoru |
|
|
Kdo je online |
Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 9 návštevníků |
|
Nemůžete zakládat nová témata v tomto fóru Nemůžete odpovídat v tomto fóru Nemůžete upravovat své příspěvky v tomto fóru Nemůžete mazat své příspěvky v tomto fóru Nemůžete přikládat soubory v tomto fóru
|
|
|