Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Mruganie diodą, nie chce działać pętla while.

cristof_w 04 Cze 2007 17:12 1992 28
  • #1 04 Cze 2007 17:12
    cristof_w
    Poziom 17  

    Witam. Potrzebuję trochę pomocy, gdyż nie chce mnie działać do while. Być może coś źle napisałem kod źródłowy.
    W czym jest rzecz.
    To jest funkcja umieszczona w programie, jej zadanie to mruganie diodą.

    void KeyPressed (void)
    {
    while (1)
    {
    PortLEDX = 1;
    Delay2(1);
    PortLEDX = 0;
    Delay3(1);

    }
    A tutaj umieszczone w main programu

    while(1)
    {
    if (!PortLED)//przycisk 1
    {
    Delay(20);

    if (!PortLED)

    do KeyPressed();
    while (PortLED2=0);


    }

    ma za zadanie : jak wcisnę przycisk to ma dioda mrugać a jak wcisnę inny przycisk to ma przestać mrugać. Działa tylko na wciśnięcie, nie można wyłączyć mrugania.
    Ktoś może wie dlaczego?
    Pozdrawiam.

    0 28
  • #2 04 Cze 2007 17:44
    Bigfoot
    Poziom 25  

    Code:
    while (PortLED2=0)
    


    Mylisz porownanie z przypisaniem co kompilator czesto widzi jako TRUE - spelnienie warunku. Nigdy wiec nie nastapi wyjscie z Twojej petli i diodka bedzie migac caly czas. Powinienes napisac:

    Code:
    while (PortLED2==0)
    


    BF

    0
  • #3 04 Cze 2007 18:04
    cristof_w
    Poziom 17  

    No niestety nadal nie działa.
    Wklejam cały kod źródłowy dla zobrazowania prgoramu i problemu.

    #include <8051.h> // kwarc 6 MHz srodowisko M-IDE programator ISPPROG
    #include <stdio.h>

    #define PortLED P2_0 //przycisk 1
    #define PortLED1 P2_1 //przycisk 2
    #define PortLED2 P2_2 //przycisk 3
    #define PortLEDX P2_5 //wyjscie diody

    void Delay (unsigned int time)//funkcja delay(opoznienie)
    {
    unsigned char i;
    for (i=0; i<0.1; i++) //0.1*0.1

    {
    TH1 = 0xC350;
    TL1 = 0;
    TR1 = 1;
    while (!TF1);

    TF1 = 0;
    }
    TR1 = 0;
    }

    void Delay2 (unsigned int tim)//funkcja delay(opoznienie)
    {
    unsigned char j;
    for (j=0; j<5; j++) //50 oznacza 5 sekund, 50*0.01

    {
    TH1 = 0xC350;
    TL1 = 0;
    TR1 = 1;
    while (!TF1);

    TF1 = 0;
    }
    TR1 = 0;
    }
    void Delay3 (unsigned int tim)//funkcja delay(opoznienie)
    {
    unsigned char j;
    for (j=0; j<5; j++) //50 oznacza 5 sekund, 50*0.01

    {
    TH1 = 0xC350;
    TL1 = 0;
    TR1 = 1;
    while (!TF1);

    TF1 = 0;
    }
    TR1 = 0;
    }

    void Delay4 (unsigned int tim)//funkcja delay(opoznienie)
    {
    unsigned char j;
    for (j=0; j<5; j++) //50 oznacza 5 sekund, 50*0.01

    {
    TH1 = 0xC350;
    TL1 = 0;
    TR1 = 1;
    while (!TF1);

    TF1 = 0;
    }
    TR1 = 0;
    }


    void KeyPressed (void) //funkcja zawiera polecenie wykonywane gdy
    { //przycisk został wcisniety
    while (1)//petla zapewniajaca mruganie diody
    {
    PortLEDX = 1;
    Delay2(1);
    PortLEDX = 0;
    Delay3(1);

    }

    }

    void KeyNotPressed(void) //funkcja zawiera polecenie wykonywane gdy
    //przycisk nie jest wcisniety
    {
    PortLEDX=1;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void main(void) //program glowny

    {
    TMOD = 0x10;
    while(1)
    {
    if (!PortLED)//przycisk 1
    {
    Delay(20);
    if (!PortLED)

    do KeyPressed();//powinna mrugac dioda
    while(PortLED2==1);//wykonuje dopoki wyrazenie bedzie falszywe
    //akcja, dopoki nie zostanie wcisniety przycisk
    } //dioda ma przestac mrugac


    KeyNotPressed();//dioda nie mruga

    /*if (!PortLED2)//przycisk 3
    {
    Delay(20);
    if (!PortLED2)
    {
    KeyPressed2();
    while (PortLED1);//przycisk 2
    //akcja, dopoki nie zostanie
    } //wcisniety przycisk
    }


    KeyNotPressed2();*/
    };
    }

    0
  • Pomocny post
    #4 04 Cze 2007 19:53
    markosik20
    Poziom 33  

    Cos sie tak uparł na to while :)
    Jest to bardzo zdradliwa operacja :wink:
    Ty wpadasz w

    Code:
    void KeyPressed (void) 
    i już z niej nie wychodzisz :) Czemu?? Przyglądnij się. Lepiej operowac na flagach , jak klawisz wciśnięty ustaw bit i w dalszym miejscu sprawdzasz że jak ustaowiony ten bit to migaj itd. :)
    np:
    Code:

    void main(void)
    ....
    ...
    ...
    {
        while(1){
                    if(!KEY1){MIGANIE=1;} //zalączenie
                   if(!KEY2){MIGANIE=0;}//wyłączenie

                    if(MIGANIE){LED=0;Delay(10);LED=1;Delay(10);}
                   }
    }


    I tak na przyszłość, nigdy nie korzytaj z pętli while jeżeli czynnik (zmienna) warunkujący pozostanie w pętli może nie zostać zmieniony bo może to spowodować "zwiskę" programu :wink:

    0
  • #5 04 Cze 2007 20:28
    cristof_w
    Poziom 17  

    Uparłem się pewnie dlatego, że tak się uczę :) jestem głównie samoukiem.
    Dziękuje. Przetestuję, mam nadzieję, że zadziała, dam znać. Pozdrawiam.

    0
  • #6 05 Cze 2007 08:46
    cristof_w
    Poziom 17  

    Witaj.
    Przeanalizowałem to sobie i chciałem teraz przetestować. Jednakże nigdy wczesniej nie bawiłem się z ustawianiem flag, zatem mam pytanie.
    Nawiązaując do Twojego kawałka kodu(i nawiązując do mojego) co muszę wstawić w miejsce wyrazu miganie ?
    I czy jest to jedyna zmiana właśnie w funkcji main, czy także w programie też coś musze jeszcze dodać?

    void main(void) //program glowny

    {
    TMOD = 0x10;
    while(1)
    {
    if (!PortLED)//przycisk 1
    {
    Delay(20);
    if (!PortLED)

    if(!PortLED){PortLEDX=1;} //zalączenie
    if(!PortLED1){PortLEDX=0;}//wyłączenie
    if(MIGANIE){PortLEDX=0;Delay(10);PortLEDX=1;Delay(10);}

    }
    }
    }
    Teraz wyglądałoby to tak, tylko nie weim co z tym miganiem.
    Pozdrawiam.

    0
  • #7 05 Cze 2007 14:56
    markosik20
    Poziom 33  

    Code:


    bit MIGANIE;

    void main(void) //program glowny

    {
    TMOD = 0x10;
      while(1)
       {
         if(!PortLED){MIGANIE=1;} //zalączenie
         if(!PortLED1){MIGANIE=0;}//wyłączenie
         if(MIGANIE){PortLEDX=0;Delay(10);PortLEDX=1;Delay(10);}
      }
    }

    Może zapis
    Code:
    bit MIGANIE;
    nie jest zbyt mile widziane w środowisku piszących w C, ale wiadomo o co chodzi. Pozostaje kwestia czy Twój kompilator zrozumie deklarację zmiennej bitowej :)

    0
  • #8 05 Cze 2007 15:17
    Koriel
    Poziom 13  

    mignięcie mozna zapisać jako:

    PORTLED^=(1<<DIODA);

    zmienia stan bitu DIODA portu PORTLED

    0
  • #9 06 Cze 2007 02:26
    KowalD
    Poziom 17  

    tak sobie poczytalem... i mam kilka pytan :)...

    Koriel napisał:
    mignięcie mozna zapisać jako:

    PORTLED^=(1<<DIODA);

    zmienia stan bitu DIODA portu PORTLED

    wcale tego nie kumam :(... co to ma robic... bo jak na moj gust, to skoro PORTLED to bajt (caly port), a DIODA to jeden bit... to ta instrukcja bedzie XOR-owala ten port na zmiane z 1 i 0... czy dobrze mysle?? i jak to ma dzialac??

    Cytat:

    void KeyPressed (void) //funkcja zawiera polecenie wykonywane gdy
    { //przycisk został wcisniety
    while (1)//petla zapewniajaca mruganie diody
    {
    PortLEDX = 1;
    Delay2(1);
    PortLEDX = 0;
    Delay3(1);

    }

    }

    cczy taka deklaracja petli while to nie spowoduje utkniecia w niej na zawsze??

    Cytat:

    void Delay (unsigned int time)//funkcja delay(opoznienie)
    {
    unsigned char i;
    for (i=0; i<0.1; i++) //0.1*0.1

    {
    TH1 = 0xC350;
    TL1 = 0;

    TR1 = 1;
    while (!TF1);

    TF1 = 0;
    }
    TR1 = 0;
    }

    void Delay2 (unsigned int tim)//funkcja delay(opoznienie)
    {
    unsigned char j;
    for (j=0; j<5; j++) //50 oznacza 5 sekund, 50*0.01

    {
    TH1 = 0xC350;
    TL1 = 0;
    TR1 = 1;
    while (!TF1);

    TF1 = 0;
    }
    TR1 = 0;
    }

    odnosnie tych funkcji (i tych delay3 i dealy4 - identycznych z delay2)... bo... jak na moj gust... ta petla z delay() to wykona sie tylko raz... bo po i++ i bedzie wynoslio juz 1 co jest wieksze od 0.1... te TH1 i TL1 to czy casem nie sa osmiobitowe i nie powinno byc TH1=0xC3; TL1=0x50;... no i jeszcze po co przekazywac do tych funkcji zmienna (tim), skoro nie jest wykorzystywana... petla i tak zawsze sie wykonuje 5razy (delay2)??

    jakbys robil wciecia w kodzie to by to duzo ladniej wygladalo ;)...

    0
  • #10 06 Cze 2007 07:49
    cristof_w
    Poziom 17  

    Co do funkcji Delay to masz rację. Można to wszystko zrobić za pomocą jednej funkcji a nie kilku i wtedy wykorzystać parametr int, tak żeby zapętlał oczekiwaną ilość razy. I tak będzie, ale narazie jest tak i działa, aczkolwiek zbędny kod (niepotrzebna ilość linijek dla tylu funkcji Delay).
    Natomiast co to Timerów to według mnie wszystko jest ok, ze stoperem mierząc jest tak jak być powinno.

    Do kolegi Markosik20

    To co zaproponowałeś działa.
    Jednakże przyszłosciowo potrzebuję używać kilku przycisków itp. itd. i dlatego będę miał parę pytań:
    Zmodyfikowalem trochę program tak aby jednym przyciskiem móc załączyć mrugajacą diodę, a dwoma różnymi mozna było ją wyłączyć. W tym celu wygląda to następująco:

    if(!PortLED){MIGANIE=1;} //zalączenie
    if(!PortLED1){MIGANIE=0;}//wyłączenie
    if(!PortLED2){MIGANIE=0;}//wyłączenie
    if(MIGANIE){PortLEDX=0;Delay3(1);PortLEDX=1;Delay4(1);}

    dlaczego zapis

    if(!PortLED1&&PortLED1){MIGANIE=0;}//wyłączenie

    nie działa? Według mnie powinien.
    Druga stprawa.
    Ten drugi przycisk, który także wyłącza diodę, powinien także mieć możliwość włączenia tej samej diody(po prostu włączenia bez mrugania).
    Jednakże coś takiego mnie nie działało, być może źle to dopisałem programowo. Jak to powinno więc wygladać?
    Interesuje mnie jeszcze jedna kwestia, ale to najpierw przetestuję na układzie a później ewentualnie się wypowiem.
    Pozdrawiam.

    0
  • #11 06 Cze 2007 08:39
    markosik20
    Poziom 33  

    Code:
    if(!PortLED1&&PortLED1){MIGANIE=0;}//wyłączenie

    Jeżeli PortLed1=0 i PortLed=1 to..... no wybacz ale nigdy tak nie będzie :) Poczytaj trochę o symbolach stosowanych w C :wink:
    A tym
    Code:
    if(!PortLED2){MIGANIE^=1;}//wyłączenie

    włączasz albo wyłączasz diodę.

    0
  • #12 06 Cze 2007 08:50
    cristof_w
    Poziom 17  

    Oczywiście, że masz rację :) Zrobił mnie się AND zamiast OR, wstawiłem
    if(!PortLED||!PortLED2){MIGANIE=1;} //zalączenie
    i oczywiście działa poprawnie.
    Zastanawia mnie tylko dlaczego
    if(!PortLED2){MIGANIE=0;}//wyłączenie
    w tym przypadku włącza/wyłącza a nie tylko wyłącza tak
    jak
    if(!PortLED1){MIGANIE=0;
    które tylko wyłącza.
    Tego akurat zrozumieć nie mogę zbytnio, zakładając, że w pierwszej linijce jest tylko wyrażenie
    if(!PortLED){MIGANIE=1;} //zalączenie
    Pozdrawiam.

    0
  • #13 06 Cze 2007 09:02
    markosik20
    Poziom 33  

    Cytat:
    if(!PortLED2){MIGANIE=0;}//wyłączenie
    w tym przypadku włącza/wyłącza a nie tylko wyłącza tak

    Absolutnie niemożliwe, możliwe że masz w innym miejscu jakiś błąd :wink:

    0
  • #14 06 Cze 2007 09:17
    cristof_w
    Poziom 17  

    Żebym się nie pogubił:

    if(!PortLED||!PortLED2){MIGANIE=1;} //zalączenie
    if(!PortLED1){MIGANIE=0;}//wyłączenie
    if(MIGANIE){PortLEDX=0;Delay3(1);PortLEDX=1;Delay4(1);}
    Tak to wygląda w tej chwili i działa tak, jak jest opisane w komentarzu, czyli:
    PortLED1 tylko wyłącza i chcę, żeby właśnie tak było. I tak ma być? Bo jeżeli ma włączać/wyłączać to nie wiem gdzie może być błąd skoro nic nie przerabiałem innego.
    I jeszcze jedna kwestia.
    Jeżeli to rzeczywiscie ma włączać/wyłączać ( a nie tylko wyłączać) , to jak powinno być to zapisane , żeby tylko wyłączało?

    0
  • #15 06 Cze 2007 09:38
    markosik20
    Poziom 33  

    Code:
    if(!PortLED1){MIGANIE=0;}//wyłączenie

    Code:
    if(!PortLED1){MIGANIE^=1;}//wyłączenie/włączenie

    Proponuję zmienić nazwę PortLED na np: KLAWISZ_OFF :wink:

    0
  • #16 06 Cze 2007 11:40
    KowalD
    Poziom 17  

    nooo... zmiana nazw by ulatwila sprawe zdecydowanie ;)...

    Code:
    MIGANIE^=1;

    mozna zapisac jako
    Code:
    MIGANIE=MIGANIE^1;

    a znaczek ^ jest w C symbolem operacji XOR... a wic jak miganie bedize 0 je zXOR-ujesz z 1 to stanie sie 1... a jesli miganie bedzie 1 i zXOR-ujesz z 1 to stanie sie 0... i tak bedzie w kolko... po kazdym nacisnieciu klawisza zmnieni sie stan logiczny zmiennej MIGANIE :)...

    0
  • #17 06 Cze 2007 20:30
    cristof_w
    Poziom 17  

    Więc tak. Sprawdziłem i:
    przy takim układzie:

    if(!PortLED||!PortLED2){MIGANIE=1;} //zalączenie
    if(!PortLED1){MIGANIE=0;}//wyłączenie
    if(MIGANIE){PortLEDX=0;Delay3(1);PortLEDX=1;Delay4(1);}

    działa inaczej niż miałoby to działać tak jak piszecie tzn.

    if(!PortLED1){MIGANIE=0;} wyłącza a nie włącza/wyłącza

    if(!PortLED1){MIGANIE^=0;} nie powoduje wyłączenia, w ogóle nic nie powoduje. Czy jest to wina kompilatora? Srodowiska?
    No bo co innego mogłoby być źle programowo.

    0
  • #18 06 Cze 2007 20:41
    markosik20
    Poziom 33  

    Kolego bo już się cierpliwość kończy :sm37:
    Przecież jak byk masz napisane wcześniej
    WYŁĄCZENIE

    Code:
    if(!PortLED1){MIGANIE=0;}//wyłączenie

    WYŁĄCZENIE LUB WŁĄCZENIE
    Code:
    if(!PortLED1){MIGANIE^=1;}

    Jak pisałem wczesniej zmień sobie te nieszczęsną nazwę PortLED1 na KLAWISZ to Ci sie wszystko rozjaśni.
    NIE
    Code:
    #define PortLED P2_0 //przycisk 1

    TYLKO
    Code:
    #define KLAWISZ1 P2_0 //przycisk 1




    I czytaj co tu wszyscy piszą :wink: bo nikt Ci takiego zapisu nie doradzał jak ten zayctowany poniżej
    Cytat:
    if(!PortLED1){MIGANIE^=0;} nie powoduje wyłączenia, w ogóle nic nie powoduje. Czy jest to wina kompilatora? Srodowiska?
    No bo co innego mogłoby być źle programowo.

    Wina Twoja...i wyłącznie pozdr.

    0
  • #19 06 Cze 2007 22:07
    gufiak
    Poziom 21  

    Code:
    if(!PortLED1){MIGANIE^=0;}
    Zapisując po ludzku wygląda to tak:
    Code:
    Jeśli PortLED1 == 0 to
    
    MIGANIE = MIGANIE XOR 0
    Jeśli masz pojęcie o operacji logicznej XOR, to powinieneś wiedzieć czemu Twój zapis nie działa.
    Proponowałbym zainstalować sobie chociażby Borland C++ albo DevC++ i na zasadzie prostych programików sprawdzać działanie tego typu operacji. Nie jest to dużo roboty, a pomoże rozwiązać wiele wątpliwości i zapamiętać na całe życie jak co działa.
    P.S. i proszę, jak wklejasz kod, to stosuj znaczniki [code ] i [/code ]. Będzie to dużo czytelniejsze.

    0
  • #20 06 Cze 2007 22:39
    markosik20
    Poziom 33  

    Cytat:
    Jeśli masz pojęcie o operacji logicznej XOR

    A ty masz??

    Kolego gufiak chcesz sięgać do C++ a podstawowych rzeczy nie znasz :(

    TABLICA XOR.
    WE1 - WE2 - WY
    0 - 0 - 0
    0 - 1 - 1
    1 - 0 - 1
    1 - 1 - 0

    zapis
    Code:
    MIGANIE^=0;
    wyzeruje bit MIGANIE i..po ptakach, już się nie ustawi.
    Równie dobrze mozna napisać
    Code:
    MIGANIE=0;

    0
  • #21 06 Cze 2007 23:39
    zumek
    Poziom 39  

    markosik20 napisał:
    ...zapis
    Code:
    MIGANIE^=0;
    wyzeruje bit MIGANIE i..po ptakach, już się nie ustawi.
    Równie dobrze mozna napisać
    Code:
    MIGANIE=0;

    Chyba Ci nerwy puściły , bo się teraz zapędziłeś ;)
    MIGANIE^=0; jest równoznaczne z MIGANIE=MIGANIE; , czyli ... bezsensowne.

    Piotrek

    0
  • #22 07 Cze 2007 09:48
    cristof_w
    Poziom 17  

    Mnie też już się cierpliwość kończy :)...
    Wprowadziłem zmiany, poprawiłem czytelność i oznaczenia (teraz jest logicznie).
    Program działa ale nie w 100%. Według mnie jest napisane dobrze, ale być może znowu jest ot moja wina.

    Code:

    if(!PrzyciskON1){MIGANIE=1;} //przycisk ON1 zalacza mruganie
    if(MIGANIE){PortLED=0;Delay3(1);PortLED=1;Delay4(1);}//powoduje mruganie diody
    if(!PrzyciskOFF1){MIGANIE=0;}//przycisk OFF1 powoduje wyłączenie przyciku ON
    if(!PrzyciskON2){ZAPALENIE=1;}//przycisk ON2 załącza diode
    if(ZAPALENIE){PortLED=0;}//powoduje swiecenie diody
    if(!PrzyciskOFF2){ZAPALENIE=0;}//przycisk OFF2 powoduje wylaczenie przycisku ON2


    Zapalenie diody żeby mrugała działa, jej wyłąxczenie też.
    Wciśnięcie przycisku ON2 i zapalenie diody , żeby świeciła działa. Natomiast jej wyłączenie nie działa. To ja się sypnałem? Moja wina?
    I coś jeszcze:
    Wyrażenie
    Code:
    if(!PrzyciskOFF1){MIGANIE^=1;}

    cały czas nie działa!! tak jak pisałem wczesniej.

    Edit:
    Coś jeszcze.
    Doprowadziłem do porządku także funkcję Delay i się skapnąłem teraz, że moge wyłączyć migającą diodę tylko wtedy gdy wyjście będzie "1" czyli w momencie gdy będzie zgaszona. Dlaczego tak się dzieje?
    Z tego wszystkie co przeczytałem co napisaliście powyzej to powinno to wszystko ładnie działać.
    Teraz cały program wyglada następująco:

    Code:
    #define PrzyciskON1  P2_0   //przycisk 1   
    
    #define PrzyciskOFF1   P2_1   //przycisk 2
    #define PrzyciskON2   P2_2   //przycisk 3
    #define PrzyciskOFF2   P2_2   //przycisk 4
    #define PortLED  P2_5 //wyjscie diody

    bit MIGANIE;
    bit ZAPALENIE;

    void Delay (unsigned int time)//funkcja delay(opoznienie)
    {
       unsigned int j;
       {
             while (time >=1)
             {
             for (j=0; j<5; j++) //50 oznacza 5 sekund, 50*0.01
                {
                TH1 = 0xC350;
                TL1 = 0;
                TR1 = 1;
                while (!TF1);
       
                TF1 = 0;




                }
                TR1 = 0;
             time--;
             }
       }
    }


    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void main(void) //program glowny

    {
       TMOD = 0x10;
       while(1)
       {
          /*if (!PortLED)//przycisk 1
          {   
             Delay(20);
             if (!PortLED)*/
                
                 if(!PrzyciskON1){MIGANIE=1;} //przycisk ON1 zalacza mruganie diody
                 if(MIGANIE){PortLED=0;Delay(1);PortLED=1;Delay(1);}//powoduje mruganie diody
                      if(!PrzyciskOFF1){MIGANIE=0;}//przycisk OFF1 powoduje wyłączenie przyciku ON1
                      
                      if(!PrzyciskON2){ZAPALENIE=1;}//przycisk ON2 załącza diode
                      if(ZAPALENIE){PortLED=0;}//powoduje swiecenie diody
                      if(!PrzyciskOFF2){ZAPALENIE=0;}//przycisk OFF2 powoduje wylaczenie przycisku ON2

                 }         
    }

    0
  • #23 07 Cze 2007 11:17
    markosik20
    Poziom 33  

    Ale namieszałeś :D
    Napisz dokładnie co każdy z przycisków ma robić...bo sie pogubiłem jak spoglądam na Twój kod :(

    0
  • #24 07 Cze 2007 11:49
    cristof_w
    Poziom 17  

    Przepraszam, wydawało mnie się, że jest czytelne.
    Więc najpierw kod i objaśnienia:

    Code:

    if(!PrzyciskON1){MIGANIE=1;} //włączam przycisk ON1
    if(MIGANIE){PortLED=0;Delay(1);PortLED=1;Delay(1);}//mruganie
    if(!PrzyciskOFF1){MIGANIE=0;}//przycisk OFF1 wyłączenia ON1
                      
    if(!PrzyciskON2){ZAPALENIE=1;}//włączam przycisk ON2
    if(ZAPALENIE){PortLED=0;} else {PortLED=1;}//świecenie diody
    if(!PrzyciskOFF2){ZAPALENIE=0;}//przycisk OFF2 wyłacza przycisk ON2


    Są 4 przyciski:
    naciśnięcie przycisku ON1 powoduje mruganie diody
    naciśnięcie przycisku OFF1 powoduje zgaszenie mrugającej diody
    naciśnięcie przycisku ON2 powoduje zapelenie diody (ciągłe)
    naciśnięcie przycisku OFF2 powoduje zgaszenie diody załączonej przyciskiem ON2(czyli tej co ma świecić ciągle a nie mrugać).

    Oto mnie chodzi a problem jest w tym, że :
    nie ma rekacji na przycisk OFF2;
    wyłączyć mrugającą diodę mogę tylko wtedy gdy w swym mruganiu następuje moment jej nieświecenia.
    Być może sprawę rozwiązałoby zasotsowanie opóźnienia do przycisków, drganie styków itp. jakieś np. 20-40 ms. Ale czy to oto chodzi?

    Pozdrawiam.

    0
  • #25 07 Cze 2007 12:20
    markosik20
    Poziom 33  

    No to będzie tak :wink:


    Code:

    void main(void) //program glowny

    {
       TMOD = 0x10;
       while(1)
       {
        if(!PrzyciskON1){MIGANIE=1;} //włączenie migania
        if(!PrzyciskOFF1){MIGANIE=0;}//wyłączenie migania
        if(!PrzyciskON2){ZAPALENIE=1;}//zapelenie ciągłe diody
        if(!PrzyciskOFF2){ZAPALENIE=0;}//gaszenie zapalonej ciągle diody
     
        if(MIGANIE&&!ZAPALENIE){PortLED=0;Delay(1);PortLED=1;Delay(1);} //jesli jest miganie i nie ma zapalenia to migaj
       else {Delay(10);}//opóźnienie dla klawiszy jak dioda nie miga
       if(ZAPALENIE){PortLED=0;}
       else {PortLED=1;}
     
                 }         
    }



    Diodę w każdej chwili można zapalić i zgasić lub włączyć i wyłączyć miganie. Priorytetem jest zapalenie bo jak jest zapalenie to siłą rzeczy nie może migać choć jest ustawiona na miganie...uff :D

    0
  • #26 07 Cze 2007 13:09
    cristof_w
    Poziom 17  

    Niestety nie działa...a już myslałem, gdyż udało nam się wreszcie dojść do consensusu :)
    Problem upatrywałem w funkcji Delay, a raczej w opóźnieniu do przycisków. Opóźnienie na drganie styków powinno wynosić np. 20ms. W funkcji Delay jest ustawienie takie, że pętla wykonuje się 0.05s. Parametrem time definiujemy ile razy ma to powtórzyć, czyli np. 20ms(0.02s) to by musiało być Delay(0.4) (20ms).
    Tak ustawiłem, ale klapa...działa tylko mruganie diody, natomiast przyciski włącz/wyłącz świecienie diody nie działają.
    Nie jest to takie proste jednak jak by się wydawało.

    Czasami udaje się zapalić diodę przy takiej konfiguracji programowej

    Code:
    if(ZAPALENIE&&!MIGANIE){PortLED=0;} 
    
        else {PortLED=1;}
    jednakże niezwasze i nadal nie można tego wyłączyć.
    W sumie teraz to już pomału z tym głupieje.
    Coś takiego:
    Code:
    if(ZAPALENIE&&!MIGANIE){PortLED=0;} 
    
        else {Delay(0.4);}
    także nie załatwia sprawy.
    Nie wie mtylko dlaczego wszystko łądnie działa przy mruganiu a z tym sa takie problemy. Przecież zasada działania jest identyczna!
    Pozdr.

    0
  • Pomocny post
    #27 07 Cze 2007 13:39
    zumek
    Poziom 39  

    Panowie , a czy któryś z Was zwrócił uwagę na to :?: :D

    Code:

    #define PrzyciskON1  P2_0   //przycisk 1   
    #define PrzyciskOFF1   P2_1   //przycisk 2
    #define PrzyciskON2   P2_2   //przycisk 3
    #define PrzyciskOFF2   P2_2   //przycisk 4
    #define PortLED  P2_5 //wyjscie diody


    Piotrek

    0
  • #28 07 Cze 2007 13:54
    cristof_w
    Poziom 17  

    Ożesz...
    No cóz...diabeł tkwi w szczególach.
    Dziękuję bardzo, wszystko działa jak należy.
    Pozdrawiam.
    P.S
    Być może będę miał jeszcze w związku z tym jedną kwestię do rozważenia, ale to może później.
    Dziękuję wszystkim za rozwiązanie problemu.

    0
  • #29 11 Cze 2007 11:34
    gufiak
    Poziom 21  

    Cytat:
    A ty masz??

    Kolego gufiak chcesz sięgać do C++ a podstawowych rzeczy nie znasz
    Proszę, następnym razem zastanów się dłużej zanim coś napiszesz. W C/C++ programuję dość intensywnie od paru ładnych lat, a operacje logiczne znam nie gorzej niż arytmetyczne.

    0
  Szukaj w 5mln produktów