Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
14.01.2006, 23:08
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Режим отключения
Задача простая.
MEGA8535. На INT0(PD2) подается смещение через 10к. При питании от внешнего источника МК работает, на выходе порта С - генерация. Пропадает внешнее питание, МК питается от батареи, на INT0 - 0. Мк переходит в "Режим отключения". При появлении внешнего питания - на INT0 появляется смещение, МК просыпается, на PC - генерация.
Написал програмку в ICC. Выставил флаг I в SREG, выставил MCUCR, GIMSK. Вроде, все как в даташите. В VMLAB все работает. Генгерит, засыпает, просыпается. Прошиваю в МК. Мк генерит, засыпает, но не просыпается, хоть на INT0 поступает постоянное смещение.
Что я сделал не так?
//ICC-AVR application builder : 01.06.05 9:02:19
// Target : 8535
// Crystal: 1.0000Mhz
#include ‹iom8535v.h›
#include ‹macros.h›
#include ‹eeprom.h›
void delay(int);
void port_init(void)
{
PORTA = 0xE0;
DDRA = 0xF0;
DDRB = 0xFF;
PORTB = 0x00;
PORTC = 0x00;
DDRC = 0xFF;
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
}
void init_devices(void)
{
CLI(); //disable all interrupts
port_init();
GIMSK = 0x00;// Запретить INT0
SREG |= 0x80; //Установил флаг I разрешения внешнего прерывания
MCUCR = 0x21; // Разрешить режим выключения, пробуждение от INT0
SEI(); //re-enable interrupts
}
void main(void)
{
init_devices();
while(1)
{
if (!(PIND & 4))// Отключилось внешнее питание
{
PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; PORTD = 0x00;
//Без отключения портов ток около 3мА
MCUCR = 0x61; // Разрешить Sleep
GIMSK = 0x40; //Разрешить INT0
asm("sleep");
asm("nop");
asm("nop");
asm("nop");
asm("nop");//На всякий случай
MCUCR = 0x21;//Запретить Sleep
GIMSK = 0x00;// Запретить INT0
port_init(); // Восстановить порты
}
PORTC^=1; // PC1 change
delay(30000);
};
}
void delay(int ticks)
{
while(ticks--);
}
|
|
|
|
16.01.2006, 11:07
|
|
Гость
|
У AVRов уровень логической едининицы окло 1.25 вольта. Может здесь собака зарыта?
|
|
|
|
16.01.2006, 14:39
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,976
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: Режим отключения
Сообщение от delay
|
Задача простая.
MEGA8535. На INT0(PD2) подается смещение через 10к. При питании от внешнего источника МК работает, на выходе порта С - генерация. Пропадает внешнее питание, МК питается от батареи, на INT0 - 0. Мк переходит в "Режим отключения". При появлении внешнего питания - на INT0 появляется смещение, МК просыпается, на PC - генерация.
Написал програмку в ICC. Выставил флаг I в SREG, выставил MCUCR, GIMSK. Вроде, все как в даташите. В VMLAB все работает. Генгерит, засыпает, просыпается. Прошиваю в МК. Мк генерит, засыпает, но не просыпается, хоть на INT0 поступает постоянное смещение.
|
Судя по программе - засыпает МК в режим Power Down. Прерывание - по любому изменению входа INT0. И не проснется. Ибо из PowerDown режима можно выйти только прерыванием low level! См. даташит. И не доверяйте особо всяким эмуляторам...
|
|
|
|
16.01.2006, 23:02
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Да, действительно, сделал на INT0 инверсию на транзистре, сделал просыпние от 0 на INT0 и МК проснулся. Не знаю почему, но этого я в даташите не встретил. Но прежде чем задать вопрос я просматривал несколько даташитов, пытлся разобраться. Спасибо! В режиме сна ток получился микроамперы. Очень долго я этого добивался.
Тут появилась другая проблема. Добавил перед командой sleep и отключением портов запись в EEPROM
if (PIND & 4)// Отключилось внешнее питание
{
EEPROM_WRITE(0x00, A);
EEPROM_WRITE(0x08, B);
PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; PORTD = 0x00;
MCUCR = 0x60; // Разрешить Sleep
GIMSK = 0x40; //Разрешить INT0
asm("sleep");
Ток в режиме сна получился 3 мА. Такой же ток я получал и без режима Power down. Только за счет отключения портов и прерываний.
Что я опять напутал? Ведь режим Power down я не менял. Может стандартная функция записи в EEPROM что-то меняет?
|
|
|
|
17.01.2006, 01:20
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,976
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Сообщение от delay
|
Да, действительно, сделал на INT0 инверсию на транзистре, сделал просыпние от 0 на INT0 и МК проснулся. Не знаю почему, но этого я в даташите не встретил.
|
да есть, есть это в даташите... Просто пропустил. Да я и сам бывает некоторые веши пропускаю - вот недавно от других программеров узнал, что совсем новые меги умеют ОДНОЙ КОМАНДОЙ асм-а пин порта инвертировать. Был удивлен. А ведь в даташите было... Просто не было в старых - и в новых внимания не обратил.
Цитата:
|
Тут появилась другая проблема. Добавил перед командой sleep и отключением портов запись в EEPROM
|
Ну, тут надо листинг смотреть - как он в епром пишет... Даже собственно не листинг - как пишет, а саму процедуру записи (во блин выразился... короче листинг библиотеки)
|
|
|
|
17.01.2006, 22:08
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Пробывал вместо функции записи из библиоеки ICC использовать функцию по датшиту.
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write*/
while(EECR & (1‹‹EEWE))
;
/* Set up Address and Data Registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1‹‹EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1‹‹EEWE);
}
Получил теже 3мА. Подставлял вместо строк записи в EEPROM другие операции (арифметические, управление портами, чтение из EEPROM) получал микроамперы.
Видимо, я что-то упустил, но где не могу понять. Задача стандартная. В МК же часто используется запись в EEPROM перед переходом в экономичный режим. Может кто сталкивался с этим?
|
|
|
|
18.01.2006, 00:42
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,976
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Сообщение от delay
|
Видимо, я что-то упустил, но где не могу понять. Задача стандартная. В МК же часто используется запись в EEPROM перед переходом в экономичный режим. Может кто сталкивался с этим?
|
Единственное что приходит в голову - запись операция довольно длительная. В процедуре - проверка готовности - ДО начала записи. То есть запись стартует и тут же в слип. Но при записи наверняка работает какая-то часть схемы - она не может быть остановлена - и так и остается в работе...
Попробуйте после записи в епром либо дождаться окончания (готовности), либо просто задержку не менее чем на 9 мс вставить.
|
|
|
|
18.01.2006, 09:43
|
|
Гражданин KAZUS.RU
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Да, это первое, что мне пришло в голову, когда сегодня проснулся. Где-то в даташите была рекомендация дождаться окончания записи в EEPROM. Сделал задержку получил долгожданные микроамперы. Надо будет еще просмотреть даташиты, чтобы не забивать МК задержкой, а использовать регистр. По-моему такая опция должна быть. В самом проекте это пока не получилось. Буду дальше разбираться. Главное, что сам процесс получился.
Спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:11.
|
|