Vny4ek 0 20 апреля, 2011 Опубликовано 20 апреля, 2011 (изменено) · Жалоба Подскажите пожалуйста начал разбираться с мплаб и HI-TECH такой код простой, по переполнению таймера меняет состояние одной из ножек и по нажатию кнопки (появлению там единицы) должен подать на RA3 проверяю в протеусе подцепил кнопку на RA0 подаю +5в туда но это событие не обрабатывается а если в коде меняю параметр в условии на противоположном то условие выполняется (вывод на RA3 единицу и запрет прерывания) вот сам код #include <htc.h> /* * Interrupt test for PIC * * Copyright (C)1997 HI-TECH Software. * Freely distributable. */ #define BUTTON RA0 //bit 1 of PORTC static volatile long count; static volatile bit bad_intr; void main(void) { /* setup stuff */ T0CS = 0; // Timer increments on instruction clock TRISA = 0x01; // Port A is input TRISB = 0xFE; // Port B bit 0 is output T0IE = 1; // Enable interrupt on TMR0 overflow GIE = 1; // Global interrupt enable CLRWDT(); // Idly kick the dog //RA3=1; while(1){ if (BUTTON==1){RA3=1; GIE=0;}; }; }//End of main static void interrupt isr(void) // Here be interrupt function - the name is // unimportant. { if(!T0IF) // Was this a timer overflow? bad_intr = 1; // NO! Shock horror! count++; // Add 1 to count - insert idle comment T0IF = 0; // Clear interrupt flag, ready for next PORTB ^= 1; // toggle bit 0 of Port B, to show we're alive } заранее спасибо Изменено 20 апреля, 2011 пользователем Vny4ek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vny4ek 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Пипец 40 просмотров и 0 ответов :) Я понял в чем ошибка, порта А сконфигурировать надо, вывел на B порт кнопку все заработало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
[sarge] 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Во-первых, выключите аналоговые функции порта А Во-вторых, разве T0IF = 1 не является сигналом переполнения? Вы проверяете если T0IF = 0 и тут же ему присваиваете 0 :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vny4ek 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба ну я пытаюсь проверить переполнился ли таймер (дотикал до 255) затем делаю что то и снова сбрасываю флаг переполнения в ожидании следующего такого события. ну тоесть прерывание для того что бы вызывать определенные функции через заданные промежутки времени. и фоном пока таймер не переполнился что то могло еще выполняться А по порту А действительно Вы правы дело в аналоговых функциях порта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Пипец 40 просмотров и 0 ответов Полностью соответствует осмысленности описания проблемы - контроллер не указан, даташит на него не читан, прогу вывалили как есть, даже не попытавшись убрать явные странности. Я понял в чем ошибка, порта А сконфигурировать надо, вывел на B порт кнопку все заработало А я в дцатый раз перечитываю - вроде такая простая фраза, но ниасилил. Возможно, Вы хотели сказать, что заглянули в даташит и обнаружили, что RA3 может работать только входом? Во-вторых, разве T0IF = 1 не является сигналом переполнения? Вы проверяете если T0IF = 0 и тут же ему присваиваете 0 :05: ТС работает над какой-то "рыбой", в которой предполагается, что прерывание может произойти только по TMR0, и "bad_intr = 1;", если прерывание приключилось от чего-то ещё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба ... предполагается, что прерывание может произойти только по TMR0, и "bad_intr = 1;", если прерывание приключилось от чего-то ещё. Когда таймер переполняется, то T0IF станет равным 1. А ТС проверяет его на равенство 0. О чем и сказал предыдущий участник. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
[sarge] 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Когда таймер переполняется, то T0IF станет равным 1. А ТС проверяет его на равенство 0. О чем и сказал предыдущий участник. Совершенно верно, и для меня остается непонятным смысл программы "Если х = 0, то присвоим иксу 0" :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Там по проверке выполняется только bad_intr = 1; А дальше счетчик инкрементируется уже сам по себе всегда... И T0IF сбрасывается постоянно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
[sarge] 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 (изменено) · Жалоба а кстати по таймеру, тут нигде явно не задается сколько тактов будет считать таймер (PS2..PS0) и значение TMR0 нигде не обнуляется, и на фоне всего сказанного всеми ранее, вот это: вывел на B порт кнопку все заработало для меня вообще сплошная загадка зы. ну и напоследок, наверное, еще неплохо было бы от дребезга избавится :) Изменено 21 апреля, 2011 пользователем sargein Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vny4ek 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 (изменено) · Жалоба Извините, просто поставил MPLAB и попытался задействовать прерывание, ну что бы понять как это выглядит. Использую пример с компилятора. "вывел на B порт кнопку все заработало" :) ну входом с кнопки сделал не RA0 а RB3 До дребезга, как и до чего то путного еще очень далеко, начал только разбираться изучаю :) проц PIC16F913 сильно не пинайте пытаюсь программировать как хобби чтоли Изменено 21 апреля, 2011 пользователем Vny4ek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба проц PIC16F913 сильно не пинайте пытаюсь программировать как хобби чтоли Может стОит начать с контроллера попроще? Приведённая программа будет одинаково (не-)работать и на PIC12F629, но читать в разы меньше, и хоть узнаете про CONFIG, OPTION и прочие базовые для мелких пиков глупости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vny4ek 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 (изменено) · Жалоба Ну то что имею по этому и взялся за этот проц CONFIG регистр я посмотрел там все в принципе понятно, но как сконфигурировать порт А как обычный цифровой порт с входами выходами не догоняю если не сложно подскажите куда смотреть Забыл еще спросить как в двух словах можно по наименованию пика определить примерно его функционал ну то что 12 16 18 это как тини мега хмега у авр условно я понял но что значит C или F и цифры после них не особо ясно у Авр понятней хотя может просто с неривычки и незнания так Изменено 21 апреля, 2011 пользователем Vny4ek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
[sarge] 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Смотреть в даташит :) пункт 3.1 PORTA and TRISA Registers Note 1: The CMCON0 (9Ch) register must be initialized to configure an analog channel as a digital input. Pins configured as analog inputs will read ‘0’. Дальше ищем зверя CMCON0, в частности читаем про компаратор, и там видим что СM2..CM0 = 111 соответствует выключенному модулю компаратора. По умолчанию он включен, следовательно, чтобы использовать порт А так как вы хотите, нужно вставить в код такую строчку: CMCON0 = 0x07; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 21 апреля, 2011 Опубликовано 21 апреля, 2011 · Жалоба Забыл еще спросить как в двух словах можно по наименованию пика определить примерно его функционал По наименованию, имхо, никак. Если нужно подобрать контроллер под задачу, то как обычно - параметрический поиск на сайте производителя. ну то что 12 16 18 это как тини мега хмега у авр условно я понял но что значит C или F и цифры после них не особо ясно у Авр понятней хотя может просто с неривычки и незнания так C - OTP (OneTimeProgrammable); про исключение PIC16C84 можно забыть CR - масочные F - флэш LF - флэш с потенцией к низкому потреблению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Genius1 0 23 апреля, 2011 Опубликовано 23 апреля, 2011 (изменено) · Жалоба 1. Обязательно предопределять фьюзы (CONFIG). 2. Аналоговые функции порта PORTA при ненадобности отключать. Как уже было сказано, для этого выключить компаратор в CMCON0. Во многих PIC также нужно определять PORTA как цифровой в настройках АЦП. 3. Обязательна задержка против дребезга. 4. Настройка пред/пост делителя используемого таймера. 5. В обработке прерывания от таймера видимо все-таки правильнее будет как-то так: static void interrupt isr(void) // Here be interrupt function - the name is // unimportant. { if(T0IF) { // Was this a timer overflow? count++; // Add 1 to count - insert idle comment T0IF = 0; // Clear interrupt flag, ready for next PORTB ^= 1; // toggle bit 0 of Port B, to show we're alive } else {bad_intr = 1;}// NO! Shock horror! } Изменено 23 апреля, 2011 пользователем Genius1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться