AtmelStudio 6.1
C nicht c++
AtMega8A
Int Osc 8MHz
Moin moin,
ich möchte mir die Neustartgründe des Controllers im EEProm merken
bzw hochzählen. Das funktioniert soweit auch ganz gut für
1. Forcierten Jump über den Programcode hinaus, dann ist MCUCSR==0
2. Forcierter Endlosschleife mit Watchdog, dann ist MCUCSR==(1<<WDRF )
aber mit eingeschalteter Brownout-det, bekomme ich bei jeweils
-Reset per Resetpin,
-Power off/on
-Spannung unter brownout-U Regeln
immer aller 3 Bits gesetzt, dh.:
MCUCSR ==(1<<BORF ) | (1<<EXTRF) | (1<<PORF ) ==0x07
und ohne Brownout-Fuse gesetzt immer:
MCUCSR == (1<<EXTRF) | (1<<PORF ) ==0x03
Mir geht es vor allem darum, eventuell Brownout-Resets im Betrieb
auf die Schliche zu kommen. Ich kann aber scheinbar an der
Spannungsversorgung und am Resetpin drehen was ich will,
ich bekomme nie separat gesetzte untere Bits.
Ich lese MCUCSR als erste Instruktion in main.
Der Staretupcode dürfte, da reines C, MCUCSR auch nicht verändern.
(btw.: Weiß jemand, wie man VOR der main mit dem AtmelStudio im
Simulator debuggen kann? Man kann zwar den Speicherort eines Breakpoint
per Hand setzen, aber anscheinend werden alle vor der main ignoriert)
Änderungen der Startuptime (8MHz + 64ms .. 8Mhz + 4ms o.ä) bringen
auch kein anderes Verhalten.
Hat jemand eine Idee/Lösung dazu, oder kennt das Phänomen?
1 | uint8_t g_nLastReset;
|
2 | ..
|
3 | int main()
|
4 | {
|
5 |
|
6 | g_nLastReset = MCUCSR;
|
7 | EEParam_SetDefaults(&g_Param);
|
8 | ReadEEProm();
|
9 | if(g_nLastReset == 0 ) {g_Param.m_eResetCntZero____ ++; eeprom_write_byte( &EE.g_EEParam[g_eeBlockNr].m_eResetCntZero____, g_Param.m_eResetCntZero____);}
|
10 | if(g_nLastReset & (1<<WDRF )) {g_Param.m_eResetCntWatchDog ++; eeprom_write_byte( &EE.g_EEParam[g_eeBlockNr].m_eResetCntWatchDog, g_Param.m_eResetCntWatchDog);}
|
11 | if(g_nLastReset & (1<<BORF )) {g_Param.m_eResetCntBrownOut ++; eeprom_write_byte( &EE.g_EEParam[g_eeBlockNr].m_eResetCntBrownOut, g_Param.m_eResetCntBrownOut);}
|
12 | if(g_nLastReset & (1<<EXTRF)) {g_Param.m_eResetCntExternal ++; eeprom_write_byte( &EE.g_EEParam[g_eeBlockNr].m_eResetCntExternal, g_Param.m_eResetCntExternal);}
|
13 | if(g_nLastReset & (1<<PORF )) {g_Param.m_eResetCntPowerOn_ ++; eeprom_write_byte( &EE.g_EEParam[g_eeBlockNr].m_eResetCntPowerOn_, g_Param.m_eResetCntPowerOn_);}
|
14 | MCUCSR &= (1<<WDRF ) | (1<<BORF ) | (1<<EXTRF) | (1<<PORF );
|
15 | ..
|
16 | + für Testzwecke: SerielleAuagabe( g_nLastReset );
|
Schiko