Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Прекъсване на цикъл
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9452
Страница 1 от 2

Автор:  SteEely [ Нед Окт 23, 2011 7:28 pm ]
Заглавие:  Прекъсване на цикъл

Здравейте опитвам се при натискането на бутон да светват 4 светодиода като при всяко натискане да светва следващия и като стигне 4-тия при следващо натискане да светне пак първия (да се опише кръг). Ползвам HI-Tech C компилатора. Светодиоди RB1,RB2,RB3, RB4
Как е най- оптимално да се реализира.
Код:
while(button==1) {
for (a = 1; a <= 4; a++)
}
if(a==1){
RB1=1
RB2=0
RB3=0
RB4=0
}
if(a==2){
RB1=0
RB2=1
RB3=0
RB4=0
}
if(a==3){
RB1=0
RB2=0
RB3=1
RB4=0
}
if(a==4){
RB1=0
RB2=0
RB3=0
RB4=1
}

Автор:  ToHu [ Нед Окт 23, 2011 9:36 pm ]
Заглавие:  Re: Проблем с бутон

Най-лесният вариант е да имаш променлива която шифтваш с 1 когато достигне стойност 16 вместо да я шифтваш я правиш 2. Тази променлива директно я подаваш напорта.

Автор:  itso.t [ Нед Окт 23, 2011 9:46 pm ]
Заглавие:  Re: Проблем с бутон

Със "switch" и "case" ми се струва, че ще е по-елегантен кода. Хубаво е състоянието на пина да го прехвърляш в променлива и да обработваш нея.
Липсва софтуерно премахване на трептенията на контакта - debounce.
Вместо побитово описване на четирите бита на изходите, може да го реализираш като "PORTB = 1, PORTB = 2, PORTB = 4, PORTB = 8" или както е описан съответния порт в хедър файла на компилатора. Някъде в кода трябва да си сетнал в "TRIS" кои пинове ще са вход и кои изход.

Автор:  michev [ Нед Окт 23, 2011 9:55 pm ]
Заглавие:  Re: Проблем с бутон

Ето ти просто решение.
Считай кода за ПСЕВДО КОД.. т.е не очаквай че ще тръгне с копи - пейст.
Пиковете не са ми от силната страна :D .
Код:
/* инициализация с 1 защото пътвия ти светодиод е на пин 1 а не на 0 */
static int led = 1;

/* ако бутона е натиснат (не знам как е под този компилатор) */
if (button == 1) {
  /* четем текущата стойност на целия порт, използваме лог. ИЛИ за да маскираме
   стария резултат с нашия светодиод и записваме обратно в порта битовете.
  */
  PORTB |= (1<<led); 
  led++;
  /* стигнали сме последния 4-ти светодиод и сме го светнали. Нулираме отново до 1 променливата. */
  if (led == 6) {
    led = 1;
  }

}


Автор:  SteEely [ Нед Окт 23, 2011 10:27 pm ]
Заглавие:  Re: Проблем с бутон

@ToHu не ми стана ясно какво имаш предвид
@itso.t ето как ми изглежда кода за момента
@michev RB0 ми е бутончето, но не успявам да схвана идеята ти
Код:
#include    <pic.h>
#include        <htc.h>
#include    "delay.h"
#include    "delay.c"

#define button RB0
#define led1 RB1
#define led2 RB2
#define led3 RB3
#define led4 RB4
#define _LEGACY_HEADERS

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

void main (void)
{

   TRISB=0b00000001;   
   TXSTA = RCSTA =0;
int a;

while(button==1) {
for (a = 1; a <= 4; a++)
}

switch (a){
   case 1;led1=1;led2=0;led3=0;led4=0;
   case 2;led1=0;led2=1;led3=0;led4=0;
   case 3;led1=0;led2=0;led3=1;led4=0;
   case 4;led1=0;led2=0;led3=0;led4=1;
break;
}
}
   

Автор:  michev [ Нед Окт 23, 2011 10:49 pm ]
Заглавие:  Re: Проблем с бутон

След като ти погледнах целия код, мисля че няма никакъв смисъл да обяснявам моя :)
Да поговорим за твоя -
Не ти виждам основния цикъл..
В момента програмата ти тръгва от началото на мейн функцията и приключва след точно 1 изпълнение.
В мейн функцията трябва да имаш безкраен цикъл - например с "while (1) { .... твоя код тук ... }".
Фор-а който си написал не мога дори да го осмисля за какво е. Не му виждам къдравите скоби дори. Изобщо не ти трябва.
Суич конструкцията ти е тотално грешна..
Ако трябва да преработим твоя код с твойта идея, то той би изглеждал поне малко по работещ в следния вид:

Код:
#include    <pic.h>
#include        <htc.h>
#include    "delay.h"
#include    "delay.c"

#define button RB0
#define led1 RB1
#define led2 RB2
#define led3 RB3
#define led4 RB4
#define _LEGACY_HEADERS

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

void main (void)
{

   TRISB=0b00000001;   
   TXSTA = RCSTA =0;
   
   int a = 1;
 
   while (1) {
      if (button == 1) {
       switch (a){
         case 1:
           led1=1;led2=0;led3=0;led4=0;
           break;
         case 2:
          led1=0;led2=1;led3=0;led4=0;
           break;
         case 3:
           led1=0;led2=0;led3=1;led4=0;
           break;
         case 4:
           led1=0;led2=0;led3=0;led4=1;
           break;
        } 
        a++;
        if (a == 5) {
          a = 1;
        }
     }
   }

}



Сега един приятелски съвет - почети за езика С.

Автор:  syscop [ Пон Окт 24, 2011 3:09 pm ]
Заглавие:  Re: Проблем с бутон

Що не си направиш една табличка ?

Автор:  itso.t [ Пон Окт 24, 2011 5:44 pm ]
Заглавие:  Re: Проблем с бутон

michev написа:
...Сега един приятелски съвет - почети за езика С.

Как го скастрихте човека... Явно чете, но сега започва.

Темата май е за академията...

Автор:  michev [ Пон Окт 24, 2011 5:55 pm ]
Заглавие:  Re: Проблем с бутон

Това не е скастряне а приятелски съвет. С какъв по "мек" тон може да се напише?!
А и все някой трябва да му каже че не става хептен без четене.

Цитат:
Темата май е за академията...

За това си напълно прав.

Автор:  SteEely [ Вто Окт 25, 2011 1:29 am ]
Заглавие:  Re: Проблем с бутон

Няма проблеми съгласен съм за четенето. Човек цял живот се учи, но кода който бях дал не беше такъв който съм пробвал, а такъв който драснах просто като пример( а колкото и да си учил преди С като не се ползва си отива). Ако модернаторите преценят нека да преместят темата в Академия. Ето го все пак кода реализиран според моето мислене :) Кода си работи, но след като добавих out=1;DelayS(120);out=0;DelayS(5); и се опитвам при натискането на бутона да прекъсна цикъла защото иначе е в безкраен цикъл, най-доброто което постигнах е да изляза от безкрайния цикъл, но трябва да изчакам DelayS-а и чак тогава сменя.

Код:
#include        <pic.h>
#include        <htc.h>
#include    "delay.h"
#include    "delay.c"

#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) {
      while (button == 0) {
       DelayS(1);
   a++;
        if (a == 5) {
          a = 1;
        }
      }      
       switch (a){
         case 1:
           led1=1;led2=0;led3=0;led4=0;
           out=1;DelayS(120);out=0;DelayS(5);
           break;
         case 2:
           led1=0;led2=1;led3=0;led4=0;
           out=1;DelayS(150);out=0;DelayS(5);
           break;
         case 3:
           led1=0;led2=0;led3=1;led4=0;
      out=1;DelayS(200);out=0;DelayS(5);
           break;
         case 4:
           led1=0;led2=0;led3=0;led4=1;
           out=1;DelayS(250);out=0;DelayS(5);      
           break;
        } 
       
     }

}

Автор:  SteEely [ Сря Окт 26, 2011 11:41 pm ]
Заглавие:  Прекъсване на цикъл

Моля ви дайте някаква идея как да го направя :( Пробвах какво ли не но не се получава. Как да реализирам прекъсване при натиснат бутон. В момента при натискане на бутона не става нищо, а когато се задържи бутона цикъла се извърти чак тогава се връща.
Код:
#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(10);
   while(button == 0){
    __delay_ms(10);
   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;
        } 
       
     }

}

Автор:  bobyk [ Чет Окт 27, 2011 9:17 am ]
Заглавие:  Re: Прекъсване на цикъл

Не знам дали критиката ще е градивна но,
1.Ти самия като си четеш кода осмисляш ли какво прави(ш)
2.По добре почни от начало, нарисувай си блок-схемичка, алгоритъм, такива неща и после го реализирай на какъвто ти кеф език.
В момента ти не осмисляш какво правиш просто правих каквото и да е с надеждата да се получи някак си, ама погледнато отстрани се вижда че, пишеш без да имаш идея.
На никой няма да му е проблем да ти напише кода, но смятам, че ще е по-полезно за теб сам да стигнеш до решението, оправи си начина на мислене, не е в езика проблема.

П.П. По-горе ти дадоха достатъчно идеи.

Автор:  SteEely [ Чет Окт 27, 2011 11:17 am ]
Заглавие:  Re: Прекъсване на цикъл

Аз не знам дали го осмисля ама ти май определено - НЕ.
Кое те кара да мислиш, че кода е лишен от логика и е драснат просто ей така.
От написаното от тебе пък аз стигам до извода че ти изобщо не си си направил труда да прочетеш какво съм написал, защото темата не е първоначалният първоначалният въпрос просто не исках да пускам нова тема. Проблема с четирите диода си го реших , но когато добавя времевите пакети out=1;DelayS(200);out=0;DelayS(50); тогава става проблем и просто исках някой да ми даде идея как да стане (а не да ме нападате и критикувате ) ама явно в този
форум не стават нещата. И държа да отбележа, че НЕ търся copy-paste код. Просто искам идея (много ли е).

Автор:  itso.t [ Чет Окт 27, 2011 12:07 pm ]
Заглавие:  Re: Прекъсване на цикъл

Обясни малко по-подробно какво искаш да направиш.

Автор:  bobyk [ Чет Окт 27, 2011 3:09 pm ]
Заглавие:  Re: Прекъсване на цикъл

Добре да не спорим, да разбирам че искаш докато тече DelayS(100) например да не ти блокира бутона така ли?
И не се засягай толкова ама кода ти е малко спагети-код, а и логиката също.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/