Jak resetovat AT mega 32A

Ahoj

V programu si uživatel nastavuje a ukládá do EEPROM nastavení sériového přenosu dat do PC. Počítám s variantou, že uživatel zapomene, co v MCU vlastně nastavil za parametry přenosu (přenosová rychlost, parita, data bity a stop bity) a tak bude MCU dovybaven tlačítkem, po jehož stisku se vymaže “uživatelské” nastavení přenosu v EEPROM, MCU se resetuje a během startu si z jiné části EEPROM natáhne defaultní nastavení sériové linky, které je uživateli známo a může začít zase od začátku.

A teď k problému: Jak na konci přerušovací rutiny (která je vyvolána stiskem onoho “nulovacího” tlačítka) vyvolat reset MCU?

Po zkoumání různých nápadů:

  • skok na adresu 0x0000
  • přes nějaký další pin vyvolat na reset nožičce úroveň L (snad nějakým zapojením přes tranzistor, který pin RESET uzemní ?)
  • použít Watch-dog

S watch-dogem bohužel nemám žádné zkušenosti a variantu “tranzistor” považuji za trochu komplikovanou. Takže bych chtěl zkusit ten skok na adresu 0x0000.
A teď můj lama dotaz: jak to napsat v C (Code Vision) ?
Já udělal:

goto 0x0000;

a hodilo to chybu: bad label.
Asi to musím nějak definovat přes #define, ale není mi jasné jak tu adresu zapsat a pak taky, jestli takto resetovat Atmel Mega vůbec jde ?
Máte někdo prosím i nějaký jiný nápad.

Děkuji

Co zkusit na konci nulovacího tlačítka napsat nekonečnou smyčku a počkat na Watch-dog.

RESET procesoru dělám jak psal Petr. Zapnu WatchDog, vypnu všechny přerušení a počkám na reset od WatchDogu. Aby to fungovalo, musíš na začátku programu vynulovat MCUSR registr, kde jsou příznaky resetu a vypnout WatchDog, jinak se Ti to po resetu WatchDogem bude restartovat pořád. Výhodou je, že takovýto reset je (až na nastavení WatchDogu) shodný s tím externím.

Jinak bych doporučil “default” nastavení mít součástí dat v programu a číst z programové paměti, než z EEPROM. Je to praktičtější. Když si smažeš celou EEPROMku, tak kde vezmeš hodnoty z “default” do “uživatelskýho” nastavení ?

Volání adresy 0x0000 musíš udělat přes direktivu ASM a tam dát jmp 0 nebo pak nějak takhle :

[code]void *ResetVector(void);

ResetVector=0x0000;[/code]
A volat to :

goto ResetVector;

nebo

ResetVector();

Díky za odpovědi. Zkusím tedy toho watch-doga.

Preco vobec potrebujes vyvolat “reset”?
Nejako som nepostrehol dovod. Len dufam, ze to neni ta zmena parametrov COM.
Ak predsa len ano, ako mas osetrenu potencionalnu zmenu parametrov priamo za behu v registroch?