Jednoduchý program a nastavení WTDON

Zdravím. Možná budu za blba, ale už opravdu nevím, co je špatně.
Úplný základ:

regfile = “m8def.dat”
$crystal = 1000000

Config Portd = Output

    Portd.1 = 0
    Portd.2 = 0
    Portd.3 = 0
    Portd.4 = 0

Do

Portd.1 = 1
Waitms 300
Portd.2 = 1
Waitms 300
Portd.3 = 1
Waitms 300
Portd.4 = 1
Waitms 300
Portd.1 = 0
Waitms 300
Portd.2 = 0
Waitms 300
Portd.3 = 0
Waitms 300
Portd.4 = 0
Waitms 300

Loop

end.

A ať už jsem měnil co se dalo, nebo to psal i jinak ale ve stejné podstatě,
nebží to stále do kola, ale tak po cca 2 vteřinách se cyklus přeruší a začne odznova…
Pokud někdo bude mít sílu odpovědět na triviálnost, budu rád…

:arrow_right: administrator: přejmenováno z "základ"

Po dvou vterinach to vypada ze ti uprocesor upadne, kdyz jsou rozsvicene vsechny diody.
Jak mas resene napajeni, mas regulator s kondenzatory, nebo primo 5V zdroj.
Diody maji omezovaci odpor? uC vetsinou utahne diody i bez odporu ale ty muzes byt svetla vyjimka…
Jinak nedelam v Bascomu ale program mi pripada v poradku.

Je to napájené přímoz usb programátoru. Diody mají 1,5k odpor.
Jinak jednou a kousek to proběhne v pořádku, pak se to resetne. Když změním frekvenci tak to proběhne třeba 5x, nebo jen “půl” krát…s odběrem to nesouvysí, jde s nad o nějaké přetečení nebo tak něco…zkoušel jsem i aTiny se stejným výsledkem…

Neni zapnuty watchdog?

Upřímně netuším, kde by se toto dalo nastavit…

A to “přerušení” cyklu je přesně pravidelné…

Skus pozriet nastavenie fuses, vyzera to ze ti, ako bolo vyssie spomenute, watchdog resetuje MCU

Nejjednodušší cesta, jak zjistit, jestli je to watchdogem, je dát do smyčky instrukci WDR (assembler). Do Basicu si to musíš přeloži sám. Pokud to přestane dělat, pak je to tím.

Tak Balů měl pravdu, musim si sice ještě najít co ten příkaz znamená, ale zabralo to. :slight_smile: A do pojistek jsem koukal, ale nenašel nic co by odpovídalo tomuhle nastavení. Nic méně mcu byl nový, stejně jako jiné zkoušené, tak to zřejmě má nastaveno z výroby…? Ale teď už můžu dělat chytrého :smiley: Díky moc. Dlouhán

Má rychlá radost vzala rychle za své… Pokud jsem tam měl 500000Hz tak to šlo…ale na 1MHz už se to zase seká… :cry:

Nevím, jak to dělá překladač, ale jedná se o pojistku WDTON. Pokud je naprogramovaná, pak je WatchDog vždy zapnutý. Defaultně tato pojistka není naprogramovaná, ale jestli překladač má nějaké své nastavení pojistek a to pak při programování nahrne do mcu, můžeš jí mít naprogramovanou.

Tak položka WTDON je 0. Trochu jsem to rozšířil:
Jen aby to bylo vidět na více kontrolkách…

$regfile = “m8def.dat”
$crystal = 200000

Config Portd = Output
Portd = 0

Do

wdr

Portd.1 = 1
Waitms 300
Portd.1 = 0
Waitms 300
Portd.2 = 1
Waitms 300
Portd.2 = 0
Waitms 300
Portd.3 = 1
Waitms 300
Portd.3 = 0
Waitms 300
Portd.4 = 1
Waitms 300
Portd.4 = 0
Waitms 300
Portd.5 = 1
Waitms 300
Portd.5 = 0
Waitms 300
Portd.6 = 1
Waitms 300
Portd.6 = 0
Waitms 300
Portd.7 = 1
Waitms 300
Portd.7 = 0
Waitms 300

Loop

End

Jak je to teď, krásně dokola každá blikne jak má.
Ale jak dám 500000 tak už poslední nestihne.
Při 700000už jen čtyři a pátá jen nepatrně a jede to od první…

A procesor mas urcite dobre nastaveny? Nemas nahodou ATmega 8A alebo nieco podobne? A hlavne si ten procesor definuj vzdy so vsetkym, tzn. chod no nastaveni-chip a tam si vyber tvoj MCU a daj si do ptojektu vlozit celu jeho konfiguraciu a nielen cast. To moze byt tiez dovod toho ze ti to nejde. Bascom sam o sebe nezasahuje do fuses takze ak mas WDTON vypnute tak ju sam nezapne

Nula ve fusebitech znamená “zapnuto”.

Pojistka je naprogramovaná, pokud je 0.
Program stihne do resetu od WatchDogu různý počet bliknutí podle toho, jakou nastavíš hodnotu krystalu. Ale ne proto, že by se měnila rychlost MCU. Ta je (pokud nezměníš pojistky) 1 MHz (tedy 1000000). Je to proto, že překladač příkaz Waitms 300 spočítá tak, aby zpoždění bylo 300 ms při kmitočtu hodin $crystal. Tedy pokud nastavíš $crystal na 200000, pak Waitms 300 v reálu nečeká 300ms, ale jenom 60ms, protože procesor běží 5x rychleji (1MHz), než jsi uvedl překladači (200kHz). Hodnota $crystal musí odpovídat kmitočtu MCU. Proto tam taky je - aby překladač věděl, jak rychlé jsou hodiny právě kvůli Wait funkcím. Musíš buď vypnout WatchDog ve fuses nebo prostě instrukci WDR šoupnout před každý příkaz Waitms. Doporučuji to první, pokud WatchDog nepotřebuješ. Jinak doporučuji funkce Wait používat minimálně a jenom na opravdu krátké časy. Jinak bude procesor většinu strojovýho času jenom makat na čekání. Ono při kmitočtu 1MHz znamená pro MCU čekání už 1 ms (Waitms 1) 1000 strojových cyklů - tedy provedení až 1000 instrukcí. V reálu je to samozřejmě míň, protože jsou některé instrukce i 2-3 taktové. Beru, že pro příklad, který jsi zde uvedl a na seznámení s procesorem takovéhle použití Wait nevadí.

Moc děkuji za odpovědi. Změnil jsem v pojistkách WTDON na 1 a je to v pořádku! Supr! Jinak tuším, že wait není zrovna protěžovaným příkazem, ale bylo to pro jednoduchost… Ještě jednou děkuji. Teď se můžu lopotit se složitějšíma věcma… :slight_smile: