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

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение Прекъсване на цикъл
Здравейте опитвам се при натискането на бутон да светват 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
}


Последна промяна SteEely на Чет Окт 27, 2011 12:39 am, променена общо 1 път



Нед Окт 23, 2011 7:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с бутон
Най-лесният вариант е да имаш променлива която шифтваш с 1 когато достигне стойност 16 вместо да я шифтваш я правиш 2. Тази променлива директно я подаваш напорта.


Нед Окт 23, 2011 9:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Проблем с бутон
Със "switch" и "case" ми се струва, че ще е по-елегантен кода. Хубаво е състоянието на пина да го прехвърляш в променлива и да обработваш нея.
Липсва софтуерно премахване на трептенията на контакта - debounce.
Вместо побитово описване на четирите бита на изходите, може да го реализираш като "PORTB = 1, PORTB = 2, PORTB = 4, PORTB = 8" или както е описан съответния порт в хедър файла на компилатора. Някъде в кода трябва да си сетнал в "TRIS" кои пинове ще са вход и кои изход.


Нед Окт 23, 2011 9:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Проблем с бутон
Ето ти просто решение.
Считай кода за ПСЕВДО КОД.. т.е не очаквай че ще тръгне с копи - пейст.
Пиковете не са ми от силната страна :D .
Код:
/* инициализация с 1 защото пътвия ти светодиод е на пин 1 а не на 0 */
static int led = 1;

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

}



Нед Окт 23, 2011 9:55 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение 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;
}
}
   


Нед Окт 23, 2011 10:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 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;
        }
     }
   }

}



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


Нед Окт 23, 2011 10:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Проблем с бутон
Що не си направиш една табличка ?

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Пон Окт 24, 2011 3:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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

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

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


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

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

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

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


Пон Окт 24, 2011 5:55 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение 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;
        } 
       
     }

}


Вто Окт 25, 2011 1:29 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 01, 2011 11:00 pm
Мнения: 24
Мнение Прекъсване на цикъл
Моля ви дайте някаква идея как да го направя :( Пробвах какво ли не но не се получава. Как да реализирам прекъсване при натиснат бутон. В момента при натискане на бутона не става нищо, а когато се задържи бутона цикъла се извърти чак тогава се връща.
Код:
#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;
        } 
       
     }

}


Сря Окт 26, 2011 11:41 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение Re: Прекъсване на цикъл
Не знам дали критиката ще е градивна но,
1.Ти самия като си четеш кода осмисляш ли какво прави(ш)
2.По добре почни от начало, нарисувай си блок-схемичка, алгоритъм, такива неща и после го реализирай на какъвто ти кеф език.
В момента ти не осмисляш какво правиш просто правих каквото и да е с надеждата да се получи някак си, ама погледнато отстрани се вижда че, пишеш без да имаш идея.
На никой няма да му е проблем да ти напише кода, но смятам, че ще е по-полезно за теб сам да стигнеш до решението, оправи си начина на мислене, не е в езика проблема.

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


Чет Окт 27, 2011 9:17 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

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


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

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


Чет Окт 27, 2011 12:07 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение Re: Прекъсване на цикъл
Добре да не спорим, да разбирам че искаш докато тече DelayS(100) например да не ти блокира бутона така ли?
И не се засягай толкова ама кода ти е малко спагети-код, а и логиката също.


Чет Окт 27, 2011 3:09 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 29 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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