Jump to content

    
Sign in to follow this  
Vny4ek

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

Recommended Posts

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

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

Edited by Vny4ek

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Пипец 40 просмотров и 0 ответов

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

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

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

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

 

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

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

Share this post


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

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

Edited by sargein

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by Vny4ek

Share this post


Link to post
Share on other sites
проц PIC16F913 сильно не пинайте пытаюсь программировать как хобби чтоли

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Edited by Vny4ek

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
Забыл еще спросить как в двух словах можно по наименованию пика определить примерно его функционал

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

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

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

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

CR - масочные

F - флэш

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

Share this post


Link to post
Share on other sites

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

Edited by Genius1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this