Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Непрочитано 14.01.2006, 23:08   #1
delay
Гражданин KAZUS.RU
 
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
delay на пути к лучшему
По умолчанию Режим отключения

Задача простая.
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--);
}
Реклама:
delay вне форума  
Непрочитано 16.01.2006, 11:07   #2
Гость
 
Сообщений: n/a
По умолчанию

У AVRов уровень логической едининицы окло 1.25 вольта. Может здесь собака зарыта?
 
Непрочитано 16.01.2006, 14:39   #3
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Режим отключения

Сообщение от delay
Задача простая.
MEGA8535. На INT0(PD2) подается смещение через 10к. При питании от внешнего источника МК работает, на выходе порта С - генерация. Пропадает внешнее питание, МК питается от батареи, на INT0 - 0. Мк переходит в "Режим отключения". При появлении внешнего питания - на INT0 появляется смещение, МК просыпается, на PC - генерация.
Написал програмку в ICC. Выставил флаг I в SREG, выставил MCUCR, GIMSK. Вроде, все как в даташите. В VMLAB все работает. Генгерит, засыпает, просыпается. Прошиваю в МК. Мк генерит, засыпает, но не просыпается, хоть на INT0 поступает постоянное смещение.
Судя по программе - засыпает МК в режим Power Down. Прерывание - по любому изменению входа INT0. И не проснется. Ибо из PowerDown режима можно выйти только прерыванием low level! См. даташит. И не доверяйте особо всяким эмуляторам...
nml вне форума  
Непрочитано 16.01.2006, 23:02   #4
delay
Гражданин KAZUS.RU
 
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
delay на пути к лучшему
По умолчанию

Да, действительно, сделал на 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 что-то меняет?
delay вне форума  
Непрочитано 17.01.2006, 01:20   #5
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию

Сообщение от delay
Да, действительно, сделал на INT0 инверсию на транзистре, сделал просыпние от 0 на INT0 и МК проснулся. Не знаю почему, но этого я в даташите не встретил.
да есть, есть это в даташите... Просто пропустил. Да я и сам бывает некоторые веши пропускаю - вот недавно от других программеров узнал, что совсем новые меги умеют ОДНОЙ КОМАНДОЙ асм-а пин порта инвертировать. Был удивлен. А ведь в даташите было... Просто не было в старых - и в новых внимания не обратил.

Цитата:
Тут появилась другая проблема. Добавил перед командой sleep и отключением портов запись в EEPROM
Ну, тут надо листинг смотреть - как он в епром пишет... Даже собственно не листинг - как пишет, а саму процедуру записи (во блин выразился... короче листинг библиотеки)
nml вне форума  
Непрочитано 17.01.2006, 22:08   #6
delay
Гражданин KAZUS.RU
 
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
delay на пути к лучшему
По умолчанию

Пробывал вместо функции записи из библиоеки 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 перед переходом в экономичный режим. Может кто сталкивался с этим?
delay вне форума  
Непрочитано 18.01.2006, 00:42   #7
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию

Сообщение от delay
Видимо, я что-то упустил, но где не могу понять. Задача стандартная. В МК же часто используется запись в EEPROM перед переходом в экономичный режим. Может кто сталкивался с этим?
Единственное что приходит в голову - запись операция довольно длительная. В процедуре - проверка готовности - ДО начала записи. То есть запись стартует и тут же в слип. Но при записи наверняка работает какая-то часть схемы - она не может быть остановлена - и так и остается в работе...

Попробуйте после записи в епром либо дождаться окончания (готовности), либо просто задержку не менее чем на 9 мс вставить.
nml вне форума  
Непрочитано 18.01.2006, 09:43   #8
delay
Гражданин KAZUS.RU
 
Регистрация: 24.06.2005
Сообщений: 535
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
delay на пути к лучшему
По умолчанию

Да, это первое, что мне пришло в голову, когда сегодня проснулся. Где-то в даташите была рекомендация дождаться окончания записи в EEPROM. Сделал задержку получил долгожданные микроамперы. Надо будет еще просмотреть даташиты, чтобы не забивать МК задержкой, а использовать регистр. По-моему такая опция должна быть. В самом проекте это пока не получилось. Буду дальше разбираться. Главное, что сам процесс получился.
Спасибо!
delay вне форума  
Закрытая тема

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR SLEEP режим picavr Микроконтроллеры, АЦП, память и т.д 2 19.08.2009 15:38
Схема отключения блока питания АТ zoomersd Источники питания и свет 11 31.03.2009 07:47
Автомат отключения и включения освещения... Erl Автоматика и аппаратура связи 7 05.05.2008 09:56
Нужна схема отключения нагрузки при падении напряжения Vovka911 Источники питания и свет 4 04.07.2006 19:58
Сервисный режим montik66 Видеотехника 1 04.08.2004 20:00


Часовой пояс GMT +4, время: 13:52.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot