МК Atmega не забывает значения??
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
Здравствуйте. Господа, выявилась одна странность. У меня мк атмега 16,(собрал часы-таймер). Для операций использовал переменные типа инт. Почему после снятия питания с контроллера, а затем подачи на него питания значения переменных не обнуляются?????? Но при подаче питания на ресет все обнуляется??
- Реклама
Контроллеры тут, сюда не все по таким вопросам ходят... тему там запостил бы...
Схемы нет, программа какая там непонятно... где, во флеш или еепром?
Схемы нет, программа какая там непонятно... где, во флеш или еепром?
scio me nihil scire...
_______________________
<= Жалобная кнопка в правом нижнем углу... )
_______________________
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Конденсаторы по питанию большие есть?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Мож паразитное откуда приходит?
- Реклама
- Сообщения: 169
- Зарегистрирован: Пн мар 02, 2009 12:23:37
да было у меня мк не отключался работал через комовский програматор 

- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
Нет конденсаторов, отрубаю шнур питания(питание=0) но какого ч-а значение одной из переменных не обнуляется???(пробовал менять имя переменной-не вариант)
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
AVR. Учебный курс. Стартовая инициализацияИнициализация памяти
Мало кто подозревает о том, что при включении в оперативке далеко не всегда все байты равны 0xFF. Они могут, но не обязаны. Равно как и регистры РОН не всегда равны нулю при запуске. Обычно да, все обнулено, но я несколько раз сталкивался со случаями когда после перезапуска и/или включения-выключения питания, микроконтроллер начинал творить не пойми что. Особнно часто возникает когда питание выключаешь, а потом, спустя некоторое время, пара минут, не больше, включаешь. А всему виной остаточные значения в регистрах.
Итак, возьмите себе за правило после каждого включения, в разделе инициализации, еще даже до инициализации стека, делать зануление памяти и очистку всех регистров.
[color=#800000]Техноманьяк и IT-шаман. Танцы с бубном на дому.[/color]
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
Такое подозрение, что прога запускается не сначала, а с цикла while. Что за фигня..
- Сообщения: 169
- Зарегистрирован: Пн мар 02, 2009 12:23:37
увеличил сопротивление резисторов от програматора
вроде по 680 Ом поставил даже на ресет
а щас вообще проблем нету пользуюсь ucGoZilla 

- Сообщения: 1800
- Зарегистрирован: Вт окт 05, 2010 01:08:57
вот и ответ, при выключении/включении питания МК у вас не перезапускается. ищите причину - большие кондеры, паразитное питание, и т.д.Но сброс происходит только при перепрошивке или при ресете
Ради эксперимента замкните ноги питания контроллера секунд на 5-10, потом включите свое устройство и посмотрите на состояние переменных
KIT
- Сообщения: 150
- Зарегистрирован: Чт апр 29, 2010 10:32:32
Имхо достаточно просто тестером поглядеть питание при "выключенном" состоянии.O-LED писал(а):вот и ответ, при выключении/включении питания МК у вас не перезапускается. ищите причину - большие кондеры, паразитное питание, и т.д.Но сброс происходит только при перепрошивке или при ресете
Ради эксперимента замкните ноги питания контроллера секунд на 5-10, потом включите свое устройство и посмотрите на состояние переменных
Покажите кусок кода, где вы объявляете переменные.Alerr писал(а):Здравствуйте. Господа, выявилась одна странность. У меня мк атмега 16,(собрал часы-таймер). Для операций использовал переменные типа инт. Почему после снятия питания с контроллера, а затем подачи на него питания значения переменных не обнуляются?????? Но при подаче питания на ресет все обнуляется??
- Сообщения: 146
- Зарегистрирован: Вт май 03, 2011 20:01:23
Вот код, где я обьявляю все переменные:
#include <mega16.h>
#include <delay.h>
int flag, i, mig;
int domin,dohour, min=0, hour=0, ch, mi, fun=0, data, lok;
int a[10]={136, 190, 196, 148, 178, 145, 129, 188, 128, 144}, b[4]={1, 2, 4, 8};
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// Declare your global variables here
unsigned char h,m,s;
void main()
{
fun=0- то, что не зануляется при отключения атмели от программатора.
Конденсаторов и доп. источников питания нет.
#include <mega16.h>
#include <delay.h>
int flag, i, mig;
int domin,dohour, min=0, hour=0, ch, mi, fun=0, data, lok;
int a[10]={136, 190, 196, 148, 178, 145, 129, 188, 128, 144}, b[4]={1, 2, 4, 8};
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// Declare your global variables here
unsigned char h,m,s;
void main()
{
fun=0- то, что не зануляется при отключения атмели от программатора.
Конденсаторов и доп. источников питания нет.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Попробуйте дописать volatile. 
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Помню в CVAVR был такой косяк, что если в одну строку инициализируется несколько разных переменных, то он их пропускал. Приходилось деклалировать каждую переменную по отдельности. Но я не в курсе, может сейчас уже починили этот косяк.
прсле сброса в регистрах и/или озу произвольные или предыдущие значения , чтобы получить заранее заданные - стандартная процедура очистки/установки в модуле инициализации, а он обычно выполняется только после системного сброса ( по крайней мере так в большинстве программ "по умолчанию" )
если имеет место неполное отключение "на ходу" (аппаратное или программное) необходимо предусмотреть программно-аппаратное решение "выхода из ступора"- как минимум сброс по wdt или схеме контроля напряжения питания, а более тонко - корректную программу составить.
если причина в прерываниях -
внимательно отследить историю прерываний и стек возврата, особенно, если возможно взаимное наложение вызовов, даже если другие прерывания запрещены.
наиболее корректен вариант подстановки в качестве адреса возврата 0х0000 с последующей командой reti
к сожалению, работаю только с ассемблером - по С -не консультант...
если имеет место неполное отключение "на ходу" (аппаратное или программное) необходимо предусмотреть программно-аппаратное решение "выхода из ступора"- как минимум сброс по wdt или схеме контроля напряжения питания, а более тонко - корректную программу составить.
если причина в прерываниях -
внимательно отследить историю прерываний и стек возврата, особенно, если возможно взаимное наложение вызовов, даже если другие прерывания запрещены.
наиболее корректен вариант подстановки в качестве адреса возврата 0х0000 с последующей командой reti
к сожалению, работаю только с ассемблером - по С -не консультант...


