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

Wewnętrzne przerwanie czasowe 50Hz - ATMEGA32

kuba123654789 30 Lip 2010 00:49 3143 15
REKLAMA
  • #1 8346066
    kuba123654789
    Poziom 10  
    Witam
    dopiero zaczynam się uczyć języka c i mam problem z przerwaniem. Chcę, aby pewna część kodu programu była przeliczana w przerwaniu wywoływanym z częstotliwością 50Hz. Czytałem o przerwaniach, ale dalej nie wiem jak je stworzyć. Mógłby ktoś pomóc?
    I drugie pytanie, czy mogą być wykonywane dwa przerwania w jednym czasie, czy procesor najpierw wykonuje jedno, a później drugie?
    Pozdrawiam

    Dodano po 3 [minuty]:

    Jeśli to ważne program piszę w WinAVR 20050214
  • REKLAMA
  • #2 8346108
    McMonster
    Poziom 32  
    Do tego potrzebne są też timery, pod tym linkiem masz to wyjaśnione krok po kroku, jak to napisać.

    I nigdy nic nie może wykonywać się jednocześnie (pomijam wielordzeniowe procesory we współczesnych komputerach ;)), normalnie w AVR kiedy jedno przerwanie jest wykonywane, to pozostałe czekają na jego zakończenie, a potem są obsługiwane wg priorytetów. Możesz za to włączyć przerwania w przerwaniach, ale to już trzeba wiedzieć, co się robi.
  • REKLAMA
  • #4 8346877
    kuba123654789
    Poziom 10  
    Napisałem coś takiego, ale wiem, że w pętli głównej musi jeszcze być konfiguracja prescalera i nie mam pojęcia jak ją napisać. Oglądałem datasheeta z atmegi ale za bardzo tego nie rozumiem. Jaki kwarc do tego trzeba zastosować bo czytałem, że właśnie tą częstotliwość bezie trzeba dzielić. Ja chciałem zastosować 16MHz. Może być?
    Pozdrawiam

    Dodano po 4 [minuty]:

    #include <avr\signal.h>
    #include <avr\interrupt.h>
    int main (void)
    {
       sei()
       return 0;
    }
    SIGNAL(SIG_OVERFLOW0)
    {
       ...
    }
    
    
  • #5 8347094
    tadzik85
    Poziom 38  
    Link To ci wszystko wyjaśni.

    Signal() nie powinno sie juz stosować obecnie zaleca się stosowanie ISR()
  • REKLAMA
  • #6 8347344
    kuba123654789
    Poziom 10  
    Nie potrafię obliczyć jaki preskaler wybrać i jaką wartość wpisać do licznika, aby wyszło te 50Hz? Zawsze wychodzi mi niedokładnie.
  • REKLAMA
  • #7 8347359
    tadzik85
    Poziom 38  
    F_CPU / preskaler * 50

    wykorzystujesz tryb CTC.
  • #8 8347389
    kuba123654789
    Poziom 10  
    Nie rozumiem co to jest *50?
  • #9 8347392
    tadzik85
    Poziom 38  
    to 50Hz które chcesz osiągnąć
  • #10 8347412
    kuba123654789
    Poziom 10  
    czyli wybieram sobie jaki chce preskaler?
    np. 16000000/(64*50)=5000
    czyli to 5000 mam wpisać do OCR1A?
  • #11 8347551
    tadzik85
    Poziom 38  
    tak. preskaler dopiera się zwykle tak by otrzymać największą możliwą liczbą którą można zapisać do licznika
  • #12 8347641
    kuba123654789
    Poziom 10  
    Czy dobrze jest to wykonane? czyli przerwanie wywolywane z częstotliwością 50Hz. Mam jeszcze pytanie czy to mi się skopiluje w tej wersji WinAVR co ja posiadam. Ponieważ napisałeś, że ISR to jest nowsze od SIGNAL.

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    int main (void)
    {
       DDRB |= (1 << 0); // Ustawienie bitu LED jako wyjścia
       TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
       OCR1A = 5000; // Ustawia wartość pożądaną na 1Hz dla preskalera 64
       TCCR1B |= ((1 << CS10) | (1 << CS11)); // Ustawia timer z preskalerem Fcpu/64
       TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
       sei(); // Zezwolenie globalne na przerwania
    
       while(1)
       {
       }
    }
    ISR(TIMER1_COMPA_vect)
    {
       ...
    }
    
  • #13 8347705
    tadzik85
    Poziom 38  
    Kod wygląda poprawnie. W sprawie twojej wersji, musisz sprawdzić w dokumentacji go gcc, czy już wprowadzono tą zmianę, Ale możesz śmiało zastosować SIGNAL
  • #14 8347712
    A.T.
    Poziom 20  
    Czyli wtedy jedynie zmieniam ISR na SIGNAL?
    A tak z ciekawości czym się one różnią?
  • #15 8347724
    tmf
    VIP Zasłużony dla elektroda
    Na wersji sprzed 5 lat? Nie. WinAVR jest za darmo, nie możesz ściągnąć nowej? Co do poprawności, AVR Studio ma symulator, obadanie tak prostego programiku to minuta zabawy.
  • #16 8347913
    kuba123654789
    Poziom 10  
    Nie znam się na AVRStudio.
REKLAMA