Program spusti wdt a prejde do hlavni smycky, kde ve while(1) testuje priznak prijeti urcityho retezce po usartu. Kdyz retezec prijde, tak se z nej vyzobou nejaky data, ktery se dal zpracujou, priznak se shodi a zresetuje se wdt. Kdyz by dlouho nic neprislo, tak by wdt mel shodit procesor. Ale bohuzel to nechodi, vypada to jakovy povoleni wdt zaroven zakazalo preruseni od usartu. Jakmile spusteni wdt vyhodim, tak to chodi dobre. Kde muze bejt problem? Podobnej algoritmus mi na Atmeze32 chodi bez problemu, ale 64 je nejaka zakleta.
administrator: přejmenováno z "Atmega 64 - problem s watchdogem"
jeste dodam - ta promenna prijateACK se meni v obsluze preruseni od USARTU1, funkce odesli posila data po USARTU0 klasicky, bez preruseni. Sei() a povoleni preruseni od prijmu USARTU1 je kousek nad spustenim watchdogu. Watchdog ma periodu asi 2s, ta promenna prijateACK se zmeni kazdejch cca 100ms, kdyz to funguje.
//nastaveni USARTU0 linka ven
myUBRR=F_CPU/16/BAUDRATE0-1;
UBRR0H = (unsigned char)(myUBRR >> ; // calculate baudrate and set high byte
UBRR0L = (unsigned char)myUBRR; // and low byte
UCSR0B = (1<<TXEN0)|(1<<RXEN0)/|(1<<RXCIE0)|(1<<TXCIE0)/; // enable transmitter and receiver
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); // 8 bit character size, 1 stop bit, no parity
//nastaveni USARTU1 snimac
myUBRR=F_CPU/16/BAUDRATE1-1;
UBRR1H = (unsigned char)(myUBRR >> ; // calculate baudrate and set high byte
UBRR1L = (unsigned char)myUBRR; // and low byte
UCSR1B = (1<<TXEN1)|(1<<RXEN1)/|(1<<RXCIE1)|(1<<TXCIE1)/; // enable transmitter and receiver
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); // 8 bit character size, 1 stop bit, no parity
mrknu na to odpoledne když tu někdo něco nenajde dřív. Každopádně u proměnných mi šlo o to, zda mají globální proměnné využívané v přerušení “volatile”.
U vektorů - jesli jsou správný názvy, s nastavením se uvidí.
Kó můžeš přiložit buď jako soubor, nebo ho vkládej do tagu “code”.
nemaji volatile, kontroloval jsem to a neni potreba.
vektory jsou spravne, bez toho watchdogu to normalne chodilo.
Uz jsem to rozhejbal, chyba byla v inicializaci wdt. Kdyz jsem pouzil makro z wdt.h wdt_enable(WDTO_2S); namisto WDTCR=0x0F; tak to chodi. Ale zaboha nemuzu prijit na to proc.