Форум
 

Вернуться   Форум "Фрикер Клуб" - кодграббер своими руками > Основной раздел > Микроконтроллеры

Важная информация

Ответ
 
Опции темы Опции просмотра
Старый 23.11.2012, 12:21   #11
CodePerfect Меню Пользователя
Автор
 
Аватар для CodePerfect
 
Регистрация: 18.02.2011
Сообщений: 335
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Проц просыпается по изменению уровня на кнопке. Логичнее следать, чтобы засыпал только при отпущенной.
__________________
Ошибки в прошивках не исправляю, боевых прошивок нет, грабберами не торгую.
Подскажу по программированию на ассемблере для PIC.
CodePerfect вне форума   Ответить с цитированием
Старый 25.11.2012, 18:37   #12
sir.pomidor Меню Пользователя
Вступил в клуб
 
Регистрация: 21.09.2012
Сообщений: 19
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Цитата:
Сообщение от russo_turisto
А как проц засыпает при нажатой кнопке?

Давай код.

Добавлено через 14 минут
Может флаг прерывания после просыпания не сбрасывается програмно.

Пишу CCS, код ниже. Асемблерный код проверял, все нормально. Флаг сбрасывается перед выходом из подпрограммы прерывания.

Процессор просыпается на изменение входного порта, только это происходит на задний фронт...

#include <main.h>


///////////////////////////////////НАЗНАЧЕНИЯ ВЫВОДОВ///////////////////////////////////
#define CODE_MAX 4095
#define CODE_COUNT 4
#define DELAY 16 //ms
#define TE_CAME 320 //us TE - came
#define TE_NICE 700 //us TE - nice
#define banks 10 // 5 банка по 2 байта
#define TIME_SLEEP 160 // константа для усыпания * 125 [мc] = 30 [сек]

///////////////////////////////////Регистры////////////////////////////////////
#byte CMCON0 = 0x19 //регистр компоратора 1
#byte WPU = 0x97 //регистр подтяжки к вверху
#byte WPUDA = 0x95 //регистр направления подтяжки к вверху
#byte OPTION_REG=0x81 //

//////////////////////////////////////////////////////////////////////////////

//************************************************** ****************************
// Блок глобальных переменных *
//************************************************** ****************************
typedef enum {IDLE, SLEEP, ACTIVE} sts; // режим работы
sts status;

// int16 Counter_for_sleep; // счетчик секунд для усыпания


//************************************************** ****************************

//================================================== =======================================
void blink(unsigned int16 times)
{
int y=0;
for( y=0; y<times; y++){
output_high (LED);
delay_ms(100);
output_low (LED);
delay_ms(100);
}
}


//--------------------------------------------------------------------------
// прерывания

#INT_RA
void RA_INT(void) // прерывание RA
{

status=ACTIVE;
}

//--------------------------------------------------------------------------
// инициализация

void InitDevice() //инициализация микроконтроллера
{

setup_timer_1(T1_DISABLED);

setup_comparator(NC_NC);
setup_vref(FALSE);

disable_interrupts(INT_RA0);
disable_interrupts(INT_RA1);
disable_interrupts(INT_RA4);

// EXT_INT_EDGE(H_TO_L);
enable_interrupts(GLOBAL);
setup_oscillator(OSC_1MHZ);
}

void InitPorts() //начальная установка портов
{

SET_TRIS_A(0b00010011); //PORTA на ввод A0,A1,A4
CMCON0=7; // компоратор выключен
PORT_a_PULLUPS(0b00010011); // подтяжка
WPU = 0b00000000; // Подтжка на входа
WPUDA = 0b00010011; // Подтжка на входа

output_low (LED);
output_low (TXD); //сброс порта на передачу
}




//************************************************** **************************************
void main()
{
InitDevice();
InitPorts();

//мигнем 3 раза после включения
blink(6);

//главный цикл
while(true)
{
//------------------------- CH2 -> выгружаем из памяти -------------------
if(input(KEY_LOCK)) {blink(1); delay_ms(500);}
if(input(KEY_UNLOCK)) {blink(2); delay_ms(500);}
if(input(KEY_CH2)) {blink(3); delay_ms(500);}


output_high (LED);
delay_ms(1000);
output_low (LED);
delay_ms(200);

enable_interrupts(INT_RA0);
enable_interrupts(INT_RA1);
enable_interrupts(INT_RA4);
enable_interrupts(GLOBAL);

sleep();

disable_interrupts(INT_RA0);
disable_interrupts(INT_RA1);
disable_interrupts(INT_RA4);

output_high (LED);
delay_ms(2000);
output_low (LED);
delay_ms(200);

}
}

Добавлено через 1 минуту
Цитата:
Сообщение от CodePerfect
Проц просыпается по изменению уровня на кнопке. Логичнее следать, чтобы засыпал только при отпущенной.

В программе так и будет... Я экспериментирую....
sir.pomidor вне форума   Ответить с цитированием
Старый 26.11.2012, 10:57   #13
russo_turisto Меню Пользователя
Модератор
 
Аватар для russo_turisto
 
Регистрация: 21.08.2011
Сообщений: 1,201
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Зачем в void InitDevice() есть включение прерываний enable_interrupts(GLOBAL); ?
Получается сначала прерывания включаются а потом порты инициализируются.

Потом, зачем писать
PORT_a_PULLUPS(0b00010011); // подтяжка
это как я понял подтяжка наверх, а потом сразу идет подтяжка на ноль.
WPU = 0b00000000; // Подтжка на входа
WPUDA = 0b00010011; // Подтжка на входа

И регистр 0x97 называется WDA а не WPU.

Потом при уходе в sleep(); нужно проверять кнопки на нажатие, если нажата или прога выполняет выброс то в слип не уходим.

Полистал даташиит, не нашел где выставляется событие прерывания по изменению уровня на фронт или спад у этого камня.
В более свежем протеусе может этот контроллер есть?

Если не получиться по фронту сделать прерывание то придется из слипа выходить каждые гдето 200мсек и проверять на нажатие кнопки.

Добавлено через 41 минуту
И что за обработчик такой хитронаписаный
#INT_RA
void RA_INT(void) // прерывание RA
{

status=ACTIVE;
}
Что такое status ?
что такое ACTIV ?
И где в основном цикле идет проверка на поднятие этих флагов для выполн действий по нажатию кнопок?
Также нужно доп флаг сделать для того чтобы дребезг не обрабатывать обработчиком прерываний. Нажали кнопку - в обработчике подняли флаг. В основном цикле после выброса сбросили этот флаг. Если дребезг пошел - в обработчике проверяем этот флаг - если поднят - ничего не делаем - выходим из обработчика, если опущен - делаем свое дело.

Последний раз редактировалось russo_turisto; 26.11.2012 в 10:20.
russo_turisto вне форума   Ответить с цитированием
Старый 26.11.2012, 14:25   #14
sir.pomidor Меню Пользователя
Вступил в клуб
 
Регистрация: 21.09.2012
Сообщений: 19
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Цитата:
Сообщение от russo_turisto
Потом, зачем писать
PORT_a_PULLUPS(0b00010011); // подтяжка
это как я понял подтяжка наверх, а потом сразу идет подтяжка на ноль.
WPU = 0b00000000; // Подтжка на входа
WPUDA = 0b00010011; // Подтжка на входа

И регистр 0x97 называется WDA а не WPU.


Ассемблерный код команды PORT_a_PULLUPS(0b00010011):

.................... PORT_a_PULLUPS(0b00010011); // ïîäòÿæêà
0051: MOVLW 13
0052: BSF 03.5
0053: MOVWF 15
0054: BCF 01.7
0055: MOVLW FF
0056: MOVWF 17

Как видим после выполнения WPUDA=0x13, WDA=0xFF
А у меня работает только, когда WPUDA=0x13, WDA=0x00

Команда PORT_a_PULLUPS нужна, только для того чтобы сбросить флаг OPTION_REG.RAPU.

Название регистра перепутал правильно читать в проге WPU ->WDA

Обработчик #INT_RA это и есть подпрограмма обработки изменения состояния порта...
В конце её и происходит сброс регистра INTCON.RAIF

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

В представленном коде я пытался понять принципы работы процессора в режиме SLEEP. То что процессор засыпает я вижу по миганию светодиода, а также выход его из режима сна. В рабочей программе я конечно же не даю ему уснуть, если нажата кнопка. Для запуска своих процедур я кратковреммено нажимаю кнопку, что приводит к пробуждению камня. А потом нажимаю нужную кнопку. Если кнопки не нажимаются длительное время процессор уходит баюшки...
Как сделать чтобы он просыпался сразу при нажатии кнопки я еще не догадался

На счет дребезга не совсем понял... Кусок программы и так работает как часы. Да собственно я и не вижу как он может пакостить в моей черновой программе.

Спасибо за ответы и рекомендации

Последний раз редактировалось sir.pomidor; 26.11.2012 в 14:32.
sir.pomidor вне форума   Ответить с цитированием
Старый 26.11.2012, 20:54   #15
russo_turisto Меню Пользователя
Модератор
 
Аватар для russo_turisto
 
Регистрация: 21.08.2011
Сообщений: 1,201
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Регистра IOCA (0x96) не видно в программе.
russo_turisto вне форума   Ответить с цитированием
Старый 27.11.2012, 09:48   #16
sir.pomidor Меню Пользователя
Вступил в клуб
 
Регистрация: 21.09.2012
Сообщений: 19
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Цитата:
Сообщение от russo_turisto
Регистра IOCA (0x96) не видно в программе.

Тут тоже "все в санях" - команда enable_interrupts(INT_RAxx)
Взводит INTCON.RAIE и IOCA.IOCAxx

ассемблерный код:

.................... enable_interrupts(INT_RA0);
00D8: BSF 0B.3
00D9: BSF 03.5
00DA: BSF 16.0
sir.pomidor вне форума   Ответить с цитированием
Старый 27.11.2012, 18:42   #17
russo_turisto Меню Пользователя
Модератор
 
Аватар для russo_turisto
 
Регистрация: 21.08.2011
Сообщений: 1,201
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

sir.pomidor ничего не мешает заменить контроллер на 12F629 в брелке, который можно отлаживать в протеусе, который изучен хорошо, и есть русский даташиит. Это лучший вариант для изучения пиков. У него ноги полностью совпадают.
russo_turisto вне форума   Ответить с цитированием
Старый 03.09.2017, 23:47   #18
gafbich Меню Пользователя
Резидент клуба
 
Аватар для gafbich
 
Регистрация: 05.01.2014
Сообщений: 395
По умолчанию Re: PIC 12F635 регистр WDA и WPUDA

Есть задача написания кода на 12F635, столкнулся с проблемой с выводом из сна ULTRA LOW-POWER WAKE-UP, по прерыванию не выходит. Кто сталкивался, поделитесь идеей.
__________________
Планировалось сделать "устройство"...и снова получились часы. Бой курантов тревожит двор)
gafbich вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

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

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



Текущее время: 07:01. Часовой пояс GMT +3.


vBulletin 4.1.0 Перевод: zCarot
(C) www.phreakerclub.com
Яндекс.Метрика