logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wcześniej zatrzymać działanie programu

28 Gru 2008 18:11 1493 14
REKLAMA
  • #1 5914414
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 5914555
    propa
    Poziom 13  
    Witam.
    Kolego spróbuj wykorzystać do odmierzania czasu TIMER, jeśli jest taka możliwość.

    Mała podpowiedz jak napisać program:

    W pętli głównej:
    - sprawdzasz czy masz zapaloną diodę jeśli tak to gasisz i zatrzymujesz licznik
    - sprawdzasz czy dioda jest zgaszona jeśli tak to zapalasz i startujesz licznik

    W przerwaniu licznika i odmierzeniu odpowiedniego czasu zatrzymujesz licznik i gasisz diodę.


    Pozdrawiam
  • #3 5914593
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #4 5914654
    propa
    Poziom 13  
    No to w takim razie prościej


    
    void pulse2(void)
    {
    if(!bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    int i;
      for(i=0;i<200;i++)
       {
       //załączenie
         OUT_ON;
         delayms(500); 
         if(bit_is_clear(PINB, PB0)) 
          { //sprawdza czy przycisk załączony
           OUT_OFF; 
           return;
          }
         delayms(500); 
    
      //wyłączenie 
         OUT_OFF;
         delayms(500); 
         if(bit_is_clear(PINB, PB0)) 
          { //sprawdza czy przycisk załączony
           OUT_OFF; 
           return;
          }
          delayms(500); 
       }
    }
    
    int main (void)
    
    {
          N1;   /*ustawienie pinU B0 wyjścia i w stan wysoki (podciągniecie do "1") */
          
          delay(10);   /*czas na "przeładowanie" kondensatorów */
          
          IN1;   /*ustawienie pinu B0 jako wejścia */
       for(;;)
          {
             if(bit_is_clear(PINB, PB0)) pulse2();
    
          }
        return (0);   
    } 


    Pozdrawiam.
  • REKLAMA
  • #5 5914693
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #6 5914824
    propa
    Poziom 13  
    Sprawdz teraz.

    void pulse2(void)
    {
    while(bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    int i;
      for(i=0;i<200;i++)
       {
       //załączenie
         OUT_ON;
         delayms(500);
         if(bit_is_clear(PINB, PB0))
          { //sprawdza czy przycisk załączony
           while(bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    	   OUT_OFF;
           return;
          }
         delayms(500);
    
      //wyłączenie
         OUT_OFF;
         delayms(500);
         if(bit_is_clear(PINB, PB0))
          { //sprawdza czy przycisk załączony
           while(bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    	   OUT_OFF;
           return;
          }
          delayms(500);
       }
    } 
  • #7 5915564
    Konto nie istnieje
    Konto nie istnieje  
  • #8 5915580
    propa
    Poziom 13  
    Tutaj masz cały plik
    
    #include <avr/io.h>
    
    
    /*zdefiniowanie Pinu wyjściowego*/
    #define OUT_ON DDRB|=_BV(1); PORTB|=_BV(1);
    #define OUT_OFF DDRB=_BV(1); PORTB&=~_BV(1);
    
    /*zdefiniowanie pinów B0 jako wyjścia i podciągnięcie go do "1")*/
    
    #define N1 DDRB|=_BV(0); PORTB|=_BV(0);
    
    /* zdefiniowanie pinów B0 jako wejścia*/
    #define IN1   DDRB&=~_BV(0);
    
    /******************************************************************************/
    #define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */
    void delay(unsigned int us)
    
    {
       return;
        unsigned int delay_loops;
        register unsigned int  i;
        delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
        for (i=0; i < delay_loops; i++) {};
    }
    
    void delayms(unsigned int ms)
    
    {
        unsigned int i;
        for (i=0;i<ms;i++)
            {
             delay(999);
             asm volatile (
             "WDR"::);
            }
    }
    
    /************************************************************************************/ 
    
    
    void pulse2(void)
    {
    while(bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    int i;
      for(i=0;i<200;i++)
       {
       //załączenie
         OUT_ON;
         delayms(500);
         if(bit_is_clear(PINB, PB0))
          { //sprawdza czy przycisk załączony
           while(bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    	   OUT_OFF;
           return;
          }
         delayms(500);
    
      //wyłączenie
         OUT_OFF;
         delayms(500);
         if(bit_is_clear(PINB, PB0))
          { //sprawdza czy przycisk załączony
           while(bit_is_clear(PINB, PB0)){} //sprawdza czy został puszczony przycisk
    	   OUT_OFF;
           return;
          }
          delayms(500);
       }
    }
    
    int main (void)
    
    {
          N1;   /*ustawienie pinU B0 wyjścia i w stan wysoki (podciągniecie do "1") */
         
          delay(10);   /*czas na "przeładowanie" kondensatorów */
         
          IN1;   /*ustawienie pinu B0 jako wejścia */
       for(;;)
          {
             if(bit_is_clear(PINB, PB0)) pulse2();
    
          }
        return (0);   
    } 
    
  • #9 5915640
    Konto nie istnieje
    Konto nie istnieje  
  • #10 5915672
    propa
    Poziom 13  
    Brakuje wartości taktowania uP można to ustawić
    PROJECT->CONFIGURATION OPTIONS->i w polu FREQUENCY wpisz wartość w Hz twojego kwarcu
  • #11 5915702
    dawid512
    Poziom 32  
    Przecież w make'u możesz wpisać częstotliwość a tak swoją drogą to mam nadzieję że masz najnowsze winavr.
  • #12 5915720
    propa
    Poziom 13  
    Możesz również wpisać w pliku:
    #define F_CPU 16000000ul

    Pozdrawiam
  • #13 5915838
    Konto nie istnieje
    Konto nie istnieje  
  • #14 5915856
    propa
    Poziom 13  
    Kolego doklej do tego pliku:
    #define F_CPU xxul
    i zamiast xx wpisz wartość ustawionego wewnętrznego kwarcu
  • #15 5916105
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA