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

[C] Atmega16 przerwania i _delay_ms

xysio_ 27 Mar 2009 22:44 3265 4
REKLAMA
  • #1 6342415
    xysio_
    Poziom 18  
    mam następujący problem: mam napisaną funkcję w której zastosowana jest kilkukrotnie komenda _delay_ms, następnie w programie musiałem zastosować Timer0 w trybie przepełnienia który jest odpowiedzialny za wyświetlanie(7-seg led) i przyciski, po naciśnięciu przycisku wywoływana jest funkcja zawierająca _delay_ms, co sprawia żę wyświetlanie się rozjeżdża(tzn wyświetlacz jest odświeżany co zakończenie się funkcji, przez co wszystkie cyfry są wygaszone oprócz ostatniej która mruga), czy ma ktoś pomysł jak to rozwiązać??

    uproszczony kod ilustrujący problem:
    
    void funkcja()
    {
    ...
    _delay_ms(500);
    ...
    }
    
    ISR(TIMER0_OVF_vect)
    {
    TCNT0=5;
    nwsw++;
    switch(nwsw)
    {
    ...
    }
    if(bit_is_clear(przcisk))
    {funkcja();}
    
    }
    
  • REKLAMA
  • #2 6342542
    marek-c
    Poziom 19  
    delay zrobic jako pętelkę (np. 1ms * 500) która będzie obsługiwała wyświetlacz led.... tzn. delay po prostu zatrzymuje program a 500ms to pół sekundy - czyli dla procesora WIECZNOŚĆ!
  • REKLAMA
  • #3 6342906
    mirekk36
    Poziom 42  
    Obojętnie w jakim byś tego języku nie pisał to zapamiętaj sobie , że w obsłudze przerwania nie można wręcz wywoływać żadnych funkcji opóźniająych itp - bo zawsze będziesz miał jakieś tego typu cyrki.

    Metodą na to jest posługiwanie się tzw flagami. Zamiast w przerwaniu wywoływać funkcję naszprycowaną w twoim przypadku pętlami opóźniającymi, ustaw po prostu sobie jakąś flagę np Przycisk1_flag = 1 i obsłuż ją sobie spokojnie w pętli głównej programu, po czym ją skasuj, żeby mogła być ponownie ustawiona w przerwaniu gdy znowu naciśniesz klawisz

    to tak mniej więcej - ale obsługę przycisków można zrobić jeszcze na milion innych sposobów - nawet bez użycia przerwań w tak prostym przypadku.
  • REKLAMA
  • #4 6343736
    xysio_
    Poziom 18  
    dzięki za odpowiedzi, dodatkowy problem polega na tym że nie wiem dla czego w pętli głównej za komendą sei(); program nie bardzo chce się wykonywać tzn jeśli wrzucę przycisk(a nawet te flagi)i w pętlę nieskończoną za komendą sei(); to wykonuje się strasznie wolno
  • #5 6343774
    mirekk36
    Poziom 42  
    no wykonuje ci się wszystko bardzo wolno - ponieważ w procedury obsługi przerwań pakujesz sobie czaso-żerne procedury w tym te najgorsze czyli opóźniające.

    popatrz ile np u mnie zajmuje kod przerwania od zegarka PCF

    // przerwanie INT1 generowane jest przez PCF8583 co 1 sekundę
    // ustawiana jest flaga od której zależy wyświetlanie
    // czasu, daty, temperatury i pomiaru temperatury przez DS18B20
    SIGNAL(INT1_vect)
    {
    	int1_flag = 1;
    }


    albo np kod przerwania od programowego PWM'a:

    // przerwanie od Timer0 Capture Match służy do generowania programowego PWM
    // do obsługi kolorowej diody RGB
    SIGNAL(TIMER0_COMP_vect)
    {
    
    	static uint16_t cnt;
    
    	cnt++;
    	if (cnt > pwm_max) cnt = 0;
    
    	if (cnt < pwm_r) PORT(PORT_R) RESET (_R);
    	else PORT(PORT_R) SET (_R);
    
    	if (cnt < pwm_g) PORT(PORT_G) RESET (_G);
    	else PORT(PORT_G) SET (_G);
    
    	if (cnt < pwm_b) PORT(PORT_B) RESET (_B);
    	else PORT(PORT_B) SET (_B);
    
    }


    czy widzisz gdzieś w tych procedurach przerwań jakieś długotrwałe operacje ??? NIE - ponieważ wszystko inne wykonuje się w pętli głównej:

    int main(void)
    {
    
      // inicjalizacja przerwań itp
    
      sei();
    
      while (1)
      {
          if (int1_flag)
          {
               // zrób coś tam
              // zrób jeszcze coś innego
    
              int_flag = 0;  // pamiętaj o wyzerowaniu flagi na koniec
          }
      }
    
    }



    może ten schemat ogólny pozwoli ci lepiej załapać o co chodzi w programowaniu z użyciem flag i dlaczego nie można tak obciążać czasowo procedur jakichkolwiek przerwań

    powodzenia
REKLAMA