Перейти к содержанию
    

Простецкий код на си подскажите где туплю

Подскажите пожалуйста начал разбираться с мплаб и 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
}

заранее спасибо

Изменено пользователем Vny4ek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пипец 40 просмотров и 0 ответов :)

Я понял в чем ошибка, порта А сконфигурировать надо, вывел на B порт кнопку все заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, выключите аналоговые функции порта А

Во-вторых, разве T0IF = 1 не является сигналом переполнения? Вы проверяете если T0IF = 0 и тут же ему присваиваете 0 :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну я пытаюсь проверить переполнился ли таймер (дотикал до 255) затем делаю что то и снова сбрасываю флаг переполнения в ожидании следующего такого события. ну тоесть прерывание для того что бы вызывать определенные функции через заданные промежутки времени. и фоном пока таймер не переполнился что то могло еще выполняться

А по порту А действительно Вы правы дело в аналоговых функциях порта

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пипец 40 просмотров и 0 ответов

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

Я понял в чем ошибка, порта А сконфигурировать надо, вывел на B порт кнопку все заработало

А я в дцатый раз перечитываю - вроде такая простая фраза, но ниасилил.

Возможно, Вы хотели сказать, что заглянули в даташит и обнаружили, что RA3 может работать только входом?

 

Во-вторых, разве T0IF = 1 не является сигналом переполнения? Вы проверяете если T0IF = 0 и тут же ему присваиваете 0 :05:

ТС работает над какой-то "рыбой", в которой предполагается, что прерывание может произойти только по TMR0, и "bad_intr = 1;", если прерывание приключилось от чего-то ещё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... предполагается, что прерывание может произойти только по TMR0, и "bad_intr = 1;", если прерывание приключилось от чего-то ещё.

Когда таймер переполняется, то T0IF станет равным 1. А ТС проверяет его на равенство 0. О чем и сказал предыдущий участник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда таймер переполняется, то T0IF станет равным 1. А ТС проверяет его на равенство 0. О чем и сказал предыдущий участник.

 

Совершенно верно, и для меня остается непонятным смысл программы "Если х = 0, то присвоим иксу 0" :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там по проверке выполняется только bad_intr = 1;

А дальше счетчик инкрементируется уже сам по себе всегда...

И T0IF сбрасывается постоянно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а кстати по таймеру, тут нигде явно не задается сколько тактов будет считать таймер (PS2..PS0) и значение TMR0 нигде не обнуляется, и на фоне всего сказанного всеми ранее, вот это:

вывел на B порт кнопку все заработало

для меня вообще сплошная загадка

 

зы. ну и напоследок, наверное, еще неплохо было бы от дребезга избавится :)

Изменено пользователем sargein

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

"вывел на B порт кнопку все заработало" :) ну входом с кнопки сделал не RA0 а RB3

До дребезга, как и до чего то путного еще очень далеко, начал только разбираться изучаю :)

проц PIC16F913 сильно не пинайте пытаюсь программировать как хобби чтоли

Изменено пользователем Vny4ek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проц PIC16F913 сильно не пинайте пытаюсь программировать как хобби чтоли

Может стОит начать с контроллера попроще? Приведённая программа будет одинаково (не-)работать и на PIC12F629, но читать в разы меньше, и хоть узнаете про CONFIG, OPTION и прочие базовые для мелких пиков глупости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну то что имею по этому и взялся за этот проц

CONFIG регистр я посмотрел там все в принципе понятно, но как сконфигурировать порт А как обычный цифровой порт с входами выходами не догоняю

если не сложно подскажите куда смотреть

Забыл еще спросить как в двух словах можно по наименованию пика определить примерно его функционал

ну то что 12 16 18 это как тини мега хмега у авр условно я понял

но что значит C или F и цифры после них не особо ясно у Авр понятней хотя может просто с неривычки и незнания так

Изменено пользователем Vny4ek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотреть в даташит :)

 

пункт 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыл еще спросить как в двух словах можно по наименованию пика определить примерно его функционал

По наименованию, имхо, никак. Если нужно подобрать контроллер под задачу, то как обычно - параметрический поиск на сайте производителя.

ну то что 12 16 18 это как тини мега хмега у авр условно я понял

но что значит C или F и цифры после них не особо ясно у Авр понятней хотя может просто с неривычки и незнания так

C - OTP (OneTimeProgrammable); про исключение PIC16C84 можно забыть

CR - масочные

F - флэш

LF - флэш с потенцией к низкому потреблению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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!
}

Изменено пользователем Genius1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...