Отговори на тема  [ 29 мнения ]  Отиди на страница Предишна  1, 2
Прекъсване на цикъл 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Окт 30, 2004 5:18 am
Мнения: 691
Мнение Re: Прекъсване на цикъл
Така както си го написал трябва да се извърти целия цикъл за да ти регистрира промяна в състоянието на бутона.Трябва да си пуснеш някакъв таймер който да ти генерира прекъсване на всяка секунда примерно и да ти проверява състоянието на бутона.

_________________
Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!


Чет Окт 27, 2011 4:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Прекъсване на цикъл
Код:
#include    <pic.h>
#include        <htc.h>
#include    "delay.h"
#include    "delay.c"

#define _XTAL_FREQ 4000000
#define button RB2
#define out RB0=RB1
#define led1 RB3
#define led2 RB4
#define led3 RB5
#define led4 RB6
#define _LEGACY_HEADERS

__CONFIG(LVP_OFF & BOREN_OFF &  WDTE_OFF & PWRTE_ON & CP_OFF & FOSC_XT);

void main (void)
{

    TRISB=0b00000100;
    TXSTA = RCSTA =0;

    int a = 1;
    out=0;

    while (1) {

        if(button == 0) {
            __delay_ms(20);
            if (button == 0) {
                a++;
                if (a == 5) {
                    a = 1;
                }

                switch (a){
                case 1:
                    led1=1;led2=0;led3=0;led4=0;
                    if(button==0){
                        break;
                    }else{ out=1;DelayS(250);out=0;DelayS(50);}
                    break;
                case 2:
                    led1=0;led2=1;led3=0;led4=0;
                    if(button==0){
                        break;
                    }else{ out=1;DelayS(200);out=0;DelayS(50);}
                    break;
                case 3:
                    led1=0;led2=0;led3=1;led4=0;
                    if(button==0){
                        break;
                    }else{ out=1;DelayS(150);out=0;DelayS(50);}
                    break;
                case 4:
                    led1=0;led2=0;led3=0;led4=1;
                    if(button==0){
                        break;
                    }else{ out=1;DelayS(100);out=0;DelayS(50);}
                    break;
                }
            }
        }
    }
}



От теб се иска да седнеш и да откриеш разликите :)


Чет Окт 27, 2011 5:25 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение Re: Прекъсване на цикъл
Изображение

Ето какво се опитвам да направя:
диодите от led-1 до led-4 са индикация кой канал работи, а led_out показва времевия пакет
При включване светва по дефаут led-1(първи канал) out=1 (250s) out=0 (50s)
след еднократно натискане на bt-1 светва led-2(втори канал) out=1 (200s) out=0 (50s)
след двукратно натискане на bt-1 светва led-3(трети канал) out=1 (150s) out=0 (50s)
след трикратно натискане на bt-1 светва led-4(четвърти канал) out=1 (100s) out=0 (50s)
след четирикратно натискане на bt-1 светва led-1(пак първи канал) out=1 (250s) out=0 (50s)

И проблема е, че когато добавя в кода времевите пакети не мога да реализирам прекъсване при натиснат бутон.


Чет Окт 27, 2011 5:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Прекъсване на цикъл
Явно ще трябва да ни "светнеш" какво е времеви пакет.


Чет Окт 27, 2011 5:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение Re: Прекъсване на цикъл
michev написа:
Явно ще трябва да ни "светнеш" какво е времеви пакет.

Образно съм го написал :D out=1 (200s) out=0 (50s) 200 секунди свети led_out 50 не свети


Чет Окт 27, 2011 5:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Прекъсване на цикъл
Това означава ли че ако натисна примерно 2 пъти един след друг бутона, то първия ти "времеви пакет" ще се прекъсне и ще започне да се изпълнява 2-рия или като свръши първия тогава втория започва да се изпълнява?


Чет Окт 27, 2011 6:04 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение Re: Прекъсване на цикъл
Да трябва да се прекъсне (то това ми е проблема)


Чет Окт 27, 2011 6:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Прекъсване на цикъл
Ами седни малко и прочети как се реализират прекъсванията, настройка и четене на таймери. Като си сигурен че вече знаеш как да боравиш с тях - пиши да доизчистим идеята. Можеш да се опиташ да направиш един таймер който да извиква прекъсване на 1 секунда, което да ползваме за отправна точка на твоя проблем.


Чет Окт 27, 2011 6:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Прекъсване на цикъл
Принципно е хубаво да се стараеш да не използваш подобни закъснения. Това е загуба на машинно време. Направи го с брояч, таймер или комбинация от двете.


Чет Окт 27, 2011 7:39 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Моите 50 ст.
Код:
typedef unsigned char   UInt8;
typedef unsigned short  UInt16;


#define LED_OUT         RB0
#define BUTTON          RB2
#define PATTERN_NUM     4


typedef struct {
    UInt8   channelsMask;
    UInt8   onTime;
    UInt8   offTime;
} TPattern;


static UInt8            patternIndex;
static UInt8            timer;
static UInt8            stage;
static const TPattern   patterns[PATTERN_NUM] = {
// channelMask, onTime, offTime   
    { 0x10,     250,    50 },   // [0]
    { 0x20,     200,    50 },   // [1]
    { 0x40,     150,    50 },   // [2]
    { 0x80,     100,    50 }    // [3]
};

static void PatternManagement(void);

void main(void)
{
    // Initializations
    patternIndex = 0;
    TRISB = 0;

    // Нагласи си някой хардуерен таймер с период 1 секунда (TMR0, TMR2...)
    // Разреши си прекъсването от таймера
   
    PatternManagement();
    GIE = 1;                // Глобално разрешаване на прекъсванията

    while (1)
    {
        if (1 == BUTTON)
        {
            PatternManagement();

            while (1 == BUTTON)
            {
                // Чакаме да отпуснеш бутона
            }
        }
    }
}

static void PatternManagement(void)
{
    stage = 0;
    PORTB = patterns[patternIndex].channelsMask;
    timer = patterns[patternIndex].onTime;
    LED_OUT = 1;

    // Тук презареждаш хардуерния таймер с 1 секунда
    // Разрешаваш прекъсването от хардуерния таймер

    patternIndex++;

    if (PATTERN_NUM == patternIndex)
    {
        patternIndex = 0;
    }
}

static void interrupt(void)
{
    if (1 == timer)
    {
        if (0 == stage)
        {
            timer = patterns[patternIndex].offTime;
            LED_OUT = 0;
            stage = 1;
        }
        else
        {
            timer = 0;
            // Забраняваш прекъсването от хардуерния таймер
        }
    }
    else
    {
        if (1 < timer)
        {
            timer--;
        }
    }
}


Пет Окт 28, 2011 1:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Прекъсване на цикъл
Код:
#include "D:\MyDocuments\Isdelia\test\buton.h"
#byte port_a=0x05
#bit buton=0x06.0
#bit led_1=0x05.0
#bit led_2=0x05.1
#bit led_3=0x05.2
#bit led_4=0x05.3
#bit out_1=0x06.1



int16   time1, interval_1, interval_2;
int1 pressed, button_press;
int deb, press_time, state, temp;

typedef struct {
    int     led;
    int16   int_1;
    int16   int_2;
} Data_type;

static const Data_type  data[4] = {
// led, interval_1, interval_2   
    { 0x01, 25000,   5000 },   // [0]
    { 0x02, 20000,   5000 },   // [1]
    { 0x04, 15000,   5000 },   // [2]
    { 0x08, 10000,   5000 }    // [3]
};
   


#int_TIMER2 //interrupt any 10 ms
void  TIMER2_isr(void)
{
//generate time impuls
   time1++;
   if(out_1)                     // when output is High
      {
         if(time1==interval_1)
            {
               out_1=false;      // set output to Low
               time1=0;         
            }
      }
   else                          // when output is Low
      {
         if(time1==interval_2)
            {
               out_1=true;       // set output to High
               time1=0;
            }
      }
// check button state     
   if(!buton)                    // when the button is pressed
      {
         if(pressed)             // check press flag
            {
               press_time++;     // increase debounce timer
               if(press_time>deb)   //if impuls is long enought
                  {
                     button_press=true;
                     press_time=0;
                  }
            }
          else
            {
               pressed=true;     // set press glag
            }
      }
   else
      {
         pressed=false;          // reset press flag
         press_time=0;
      }
}

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,156,4);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   set_tris_a(0);
   set_tris_b(1);

//var & output init
   deb=10;                          //debounce time 10*10 = 100 ms
   state=0;                         // set state to 0
   time1=0;                         // reset time1 variable
   interval_1=data[state].int_1;    // set interval 1
   interval_2=data[state].int_2;    // set interval 2
   port_a=0;                        // clear port a
   led_1=true;                      // set led1
   out_1=true;                      // set output to high

// main program

   while(true)
   {
      if(button_press)           // when button is pressed
         {
            button_press=false;  // clear button flag
            if(state>2)
               {
                  state=0;
               }
            else
               {
                  state++;
               }
            time1=0;             // reset timer var
            out_1=true;          // set output to true
            interval_1=data[state].int_1; // load int1
            interval_2=data[state].int_2; // load int2
            temp=port_a&0xF0;       // get port A and set first 4 bytes to 0
            port_a=temp|data[state].led; // set port A tiwh new LED value
         }
   }
}


ето ти нещо работещо, само не е направено да не превключва ако задържаш бутона натиснат, това лесно може да стане ако ти трябва. Ползва се таймер 2, настроен е да прекъсва всеки 10 ms. Всичко е на отделни редове за да тие по лесно да го четеш, кода е за CCS и pIC16F628, но пика няма значение.


Нед Ное 06, 2011 7:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Прекъсване на цикъл
п.с. гледам че колегата по горе ти е дал решение, би трябвало вече да си се справил със задачата.


Нед Ное 06, 2011 11:28 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение Re: Прекъсване на цикъл
Благодаря на всички за помощта :)
Търсих на много места информация книги ... какво ли не, и не намирах информация за пикове на С, и се ядосах и реших
да се захвана с асемблер понеже имам много литература, а и преди години съм си правил прости програмки.
Разгледах предложеното решение от @ТоНи ред по ред и поне се светнах как се работи с ISR-а а и доста неща ми се изясниха, но
не ми е ясно каква е разликата между CSS компилатора и Hi-TechC защото при компилиране с Hi-TechC вади много грешки и е явно, че има разлика.
Иска ми се да го реализирам на С защото другата част от кода е на С.


Пон Ное 14, 2011 10:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Прекъсване на цикъл
SteEely написа:
Благодаря на всички за помощта :)
Търсих на много места информация книги ... какво ли не, и не намирах информация за пикове на С, и се ядосах и реших
да се захвана с асемблер понеже имам много литература, а и преди години съм си правил прости програмки.
Разгледах предложеното решение от @ТоНи ред по ред и поне се светнах как се работи с ISR-а а и доста неща ми се изясниха, но
не ми е ясно каква е разликата между CSS компилатора и Hi-TechC защото при компилиране с Hi-TechC вади много грешки и е явно, че има разлика.
Иска ми се да го реализирам на С защото другата част от кода е на С.


Не знам каква е разликата, HTC пробвах преди много години, сигурно 8, и нещо не ми хареса тогава, нямам спомени. Със сигурност ще има разлика в дефиниране на променливи, в това отношение CSS е нестандартен, както и в някои функции на компилатора, но такива мисля не съм изпозлвал, но не знам там дефинирането на бит дали е същото като в CSS.


Чет Ное 17, 2011 1:41 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 29 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни