2013-07-16 9 views
0

У меня есть PIC18F87J11 с MPLAB C18. Я пытаюсь ограничить потребление батареи устройством, вынудив его заснуть. Я заметил, что при входе в спящий режим timer0 перестает подсчитываться до пробуждения. Также единственный метод, который я знаю, чтобы разбудить устройство, - это когда он получает сообщение от другого узла, так как у меня есть трансивер MRF89XA.Таймер не рассчитывает на спящий режим с PIC18F?

Чтобы перевести свое устройство в режим сна, я просто назвал его этой функцией, которая определена в заголовочном файле компилятора.

Sleep(); 

Q1: Как я могу просыпаться, кроме как получая сообщение с какого-либо узла? В DataSheet сказано, что EXIT BY INTERRUPT или EXIT BY RESET, но как вы это делаете, если нет таймера?

Прочитав DataSheet, он заявил, что Timer1 должен использоваться, чтобы контролировать время, действительно ли это так?

Все, что я действительно хочу, это максимально снизить потребление батареи и сохранить работу таймера в режиме ожидания.

Спасибо!

ответ

1

Да, Timer1 - единственный таймер, который может работать в спящем режиме. Из таблицы:

Ввод в спящий режим из любого другого режима не требуется . Это связано с тем, что никакие часы не нужны , когда контроллер вступил в режим сна. Если выбран WDT , то источник INTRC будет продолжать работать до . Если генератор Timer1 включен, он также будет продолжать работу .

Для запуска таймера с минимальной потребляемой мощностью используйте режим сна и таймер 1.

Если вы хотите использовать другие периферийные устройства, такие как Timer0, в то время как в режиме питания управляемого, есть альтернатива в спящий режим называется Idle режим:

Если бит IDLEN установлен в ‘1’ когда SLEEP команда , периферийные устройства будут синхронизироваться с тактовых импульсов источник, выбранный с использованием SCS < 1: 0> бит; однако CPU не будет синхронизирован. Биты состояния источника синхронизации равны . Установка IDLEN и выполнение команды SLEEP обеспечивает быстрый способ переключения с заданного режима работы в соответствующий режим ожидания.

Чтобы установить бит IDLEN 1, добавить OSCCON |= 0b10000000; где-то до выдачи Sleep();.

Очевидно, что режим ожидания будет потреблять немного больше энергии, чем спящий режим, поскольку периферийные устройства остаются в рабочем состоянии.

+0

Вы ответили на мой вопрос, что мне нужно Timer1, но я не полностью понимаю ваш ответ. Как в чем разница между timer0 и timer1? Какой из них более точным? Также как вы устанавливаете IDLEN в '1'? Как и где именно в коде? Эти мелочи действительно путают меня, это не ваша вина, я не очень понимаю, как настраивать контакты. Если вы можете объяснить немного дальше, это было бы хорошо. Благодаря! – Ammar

+0

Устройство имеет пять модулей таймера. Оба Timer0 и Timer1 способны к 16-разрядной точности. Timer0 может быть настроен для работы в 8-битном или 16-битном режиме. Timer1 - это 16-разрядный таймер. Изучите таблицу, чтобы узнать о других различиях. – mizo

+0

У меня есть Timer0, работающий отлично без спящего режима, если бы я должен был реализовать timer1, что было бы основным для изменения кода? – Ammar

0

У меня была эта точная проблема, но это был небольшой надзор за меня. Timer1 может иметь/имеет бит синхронизации, называемый примерно так:

T1CONbits.nT1SYNC = 1; // Timer1 бит синхронизации синхронизации внешнего таймера.

Это синхронизирует таймер 1 с основными часами. Поскольку основные часы не работают в спящем режиме, он не может синхронизировать и, следовательно, Timer1 не работает. Все, что мне нужно было сделать, это убедиться, что я не синхронизирую Timer1 с первичными часами. настройте его в правильном спящем режиме, то есть не глубокий сон или простоя или vBAT, и все сработало.

Я использовал MPLABx и XC8 с PIC18F97j94

 Смежные вопросы

  • Нет связанных вопросов^_^