ATmega32 se resetuje,jakmile program naroste na vice než 50%

Zdravím, dělám s megou32 už celkem dlouho, ale nyní jsem narazil na neobvyklý problém. Jakmile má program víc jak 50% a nahraju ho do mikrokontroléru, pak projede pouze část a resetuje se a to dělá stále dokola.

Nevíte někdo, kde by mohla být chyba?

:arrow_right: administrator: přejmenováno z "atmega32 reset"

Ahoj.
Co pouzivas za vyvojove prostredi a cim to nahravas do uC?
Co pouzivas za programator?
Muzes nakreslit schema zapojeni tveho programatoru k uC?
Zmenilo se cokoliv od posledni doby?

Jako vývojové prostředí používám AVR studio 4.16 (zkoušel jsem i 4.16 i 5.1 i 6.0) a nahrávat jsem zkoušel i přes avrdude. Programátor mám tento: narrow.vzap.eu/elektrotechnika/atmely/13-programator-atmel-do-usb Zatím jsem s ním nikdy neměl žádný problém. A co myslíš tou změnou?

Nemas zapnuty watchdog? Mozno ho mas aktivovany a neosetrujes ho…

Ne watchdog zapnutý nemám a navíc, kdybych měl, tak by to nefunguvalo ani předtím, ale mě to přestalo fungovat až když jsem přidal pár proměnných a tím obsadil kapacitu FLASH paměti na víc jak 50%.

Mas kolem Megy nejakou bizuterii, nebo je samotna a mas pouze pripojene napajeni?
Mas zapojene vsechna napajeni? VCC a AVCC GND a AGND apod?
Pouzivas mezi MISO, MOSI SCK odpory?
Jinak ja si opravdu nevim rady, spis bych videl neco shnileho s tim programatorem.

Ked to skusas a resetuje sa ti to, mas pripojeny programator, mas na RESET pin pripojeny rezistor voci UCC, mas 100nF kondik na napajani blizko megy?

rezistor na reset ano, ale nemám připojený pin AVCC, to by mohl být problém? a odpory mezi miso, mosi a sck taky ne…

AVCC bys měl mít připojený tak jako tak.

Dělá ti to pouze jeden kus, nebo více ?
Zkoušels i jiný typ?

Měl jsem podobný problém - u emga644p - program šel v pohodě nahrát do mcu, ale při debugu přes AVR dragon v určitém bodě taky šl do resetu - nevěděl jsem co stím - študoval jsem disasembler, jestli to překladač nějak nezkonil - kolikrát je schopný při optimalizaci vyházet dvě ze tří volání stejných funkcí jdoucích po sobě, ale s jinými parametry.

Nakonec jsem zkusil jenom nahrát program - a při verifikaci flash mi to hodilo chybu - v určité části paměti byly po přečtení jiné hodnoty, na což jsem v debugeru nepřišel, protože tam se obsah paměti neverifikuje.
Vše vyřešila nová součástka - takže typuju, že i tvá mega32 je mrtvá.

zkoušel jsem i jinou megu a verifikaci provádím při každém nahrátí, takže tady asi chyba nebude. Zkusím ještě sehnat jiný (komerční) programátor, třeba to bude tím…

a mas spravne nastaveny konec ramky?

konec ramky? o tom jsem nikdy neslyšel? kde se to nastavuje? a jak?

Asi najskor Ti pretekaju data v RAM do zasobniku, ktory je tiez v RAM.
Predpokladam, ze vacsi program pouziva viac premennych :slight_smile:
S programatorom to nebude mat nic spolocne. Skresaj polia, co najviac vyuzivaj premenne aby neboli “static” a uvidis, pozitivny vysledok sa hned dostavi.
Aby si si overil tuto teoriu, mozes si jednak skontrolovat co ti robia data v simulatore - teda kam az zajdu oporti zasobniku, a jednak si moze kupit ATmega644P alebo Atmega1284P ktory maju RAM habadej. Ak ten problem prestane, tak to bolo tym, ze sa Ti podarilo zaplnit RAMku :slight_smile:
RAMku samozrejme nastavovat nijako nemusis, teda ak pracujes v C.

a pokud pracujes v asm, tak je nutne dat na zacatek programu toto

ldi R16,LOW(RAMEND)
out SPL,R16
ldi R16,HIGH(RAMEND)
out SPH,R16

jo kdysi v ASM jsem něco takového dělal… a už mi to funguje. Bylo to asi těmi proměnnými. Měl jsem tam příliš mnoho řetězců. Už je to OK. Děkuji za pomoc :slight_smile:

Jesli ti program havaroval s větším množstvím řetězců, tak patrně pouze proto, že je nemáš ve FLASH, ale v RAM jak ti tu signalizovali ostatní. Podívej se do manuálu překladače, jak je do FLASH umístit (u GCC je to pomocí PROGMEM). Řetězce(konstantní) do RAM na jednočipu nepatří - je jí málo.

Jestli to správně chápu tak závěr je moc lokálních proměnných nebo co? Zajímá mě to z toho důvodu, že mě vždycky děsí, že budu mít mnoho lokálních proměných a program se zhroutí…to že se zhroutí mi je jasné, ale nevím jak se to bude projevovat.

chapes to spatne. lokalni promene jsou vporadku, nicmene jejich obsah je prilis velky.

Vobec nejde len o to aby boli premenne lokalne. Ak chces setrit pamat, tak musia byt nie len lokalne ale hlavne nie “static”. Inak zaberu presne tolko miesta ako globalne. Texty maju byt vo Flash a musia sa pouzivat tak, aby sa aj napriek tomu, ze su vo Flash nekopirovali do RAM. Napriklad takto:


//.....
const char txt_m01_eepr]  PROGMEM = "EEpr";
const char txt_m01_min]  PROGMEM = "LLLL";
const char txt_m01_max]  PROGMEM = "HHHH";
const char txt_m01_nuly]  PROGMEM = "000000";
const char txt_m01_minusy]  PROGMEM = "------";
const char txt_m01_6bodka] PROGMEM = "bbbbbb";
const char txt_m01_6sustava] PROGMEM = "cccccc";
//.....



//.....
memcpy_P((char *)polozka->p_pole_zobraz, (char *)txt_m01_6bodka, pocet_znakov_cisla); 
//.....

to znamena, ze pri prenose do displaya pouzivas RAM, ale len ako pole na aktualne zobrazovany text/znak.

p_pole_zobraz je ukazatel na to urcene pole v RAM z ktoreho ina funkcia posle udaje do displaya v pre neho vhodnej forme.

memcpy_P najdes popisanu v avrlib