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.

Przerwania, Timery w C. Jak wygląda obsługa?

davciu 20 Sty 2006 19:09 1827 7
  • #1 20 Sty 2006 19:09
    davciu
    Poziom 11  

    Wiem że pytanie to pojawiało się zapewne już nie raz. Chciałbym się dowiedzieć jak wygląda obsługa przerwania, timera w C. W asemblerze uaktywnialo się przerwanie np.

    org 000bh
    sjmp int_timT0

    i pod etykietą int_timT0 umieszczaszało się kawalek programu ( co ma robic jak dojdzie do przerwania ). Jak to wygląda w C?. Druga sprawa w asemblerze wiedzialem ile cykli potrzebuje dany rozkaz.
    Gdzie można znaleźć jakieś materiały na ten temat ??
    Thanx za wszelkie info.

    0 7
  • #2 20 Sty 2006 19:59
    boroova6523
    Poziom 15  

    Co do tego przerwania w assemblerze to masz tylko czesciowo racje. Brakuje jeszcze paru ustawien. :)

    0
  • #3 20 Sty 2006 22:10
    adamusx
    Poziom 27  

    Poszukaj na forum, jest duzo przyladow z przerwaniami, np tutaj masz opsane :
    https://www.elektroda.pl/rtvforum/viewtopic.ph...ight=gcc&sid=1f43409ee882a2f586f9802531b2991f


    Ogolnie sprawa jest bardzo prosta, ustawiasz odpowiednie rejestry od przwerwan,a samo wywowalnie przerwania np od przepelnienia licznika timera 0, wyglada tak :

    SIGNAL (SIG_OVERFLOW0)
    {
    TCNT0 = TIMER0_INIT; // załadowanie do licznika wartosci poczštkowej
    // tu wpisujesz to co chcesz by sie wykonalo w przerwaniu.

    }

    0
  • #4 20 Sty 2006 22:53
    snow
    Poziom 28  

    No i jeszcze trzeba zadeklarowac:


    #include <avr/interrupt.h>
    #include <avr/signal.h>

    0
  • #5 24 Lut 2006 13:13
    jj
    Poziom 19  

    :arrow:davciu
    A może napiszesz, o jaki mikrokontroler Ci chodzi?
    Ja z tego fragmentu twojej wypowiedzi:

    Cytat:
    (...)
    W asemblerze uaktywnialo się przerwanie np.

    org 000bh
    sjmp int_timT0

    i pod etykietą int_timT0 umieszczaszało się kawalek programu ( co ma robic jak dojdzie do przerwania ). (...)

    zaryzykowałbym stwierdzenie, że chodzi o rodzinę 8051. A pozostali zabierający głos koledzy piszą o AVR...
    Precyzyjniej określisz problem, otrzymasz bardziej pomocną odpowiedź...

    Pozdrawiam,
    Jacek

    0
  • #6 06 Mar 2006 16:29
    davciu
    Poziom 11  

    Sory, mój błąd. Układ na bazie 51 - zdeczka bardziej rozbudowane, dokładnie AT89C51SND1C.

    0
  • #7 07 Mar 2006 16:50
    kamil1807
    Poziom 11  

    Ja mam coś takiego:
    w programie głównym jest deklaracja:

    void KLAWISZ(void) interrupt 1 using 2
    {
    PRZERW_T0();
    }

    z tym że przewanie jest wykonywane w asemblerze:

    PRZERW_T0:
    .............instrukcje.............
    RET

    0
  • #8 07 Mar 2006 17:15
    davciu
    Poziom 11  

    Wielkie dzięki. Problem już rozwiązany.

    Moje rozwiązanie:

    #include "c51_drv.h"
    #include "config.h"

    char code tablica[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    int a,i;
    void opo(void) interrupt IRQ_T0
    {
    TL0 = 0xB6;
    TH0 = 0x3A;
    a++;
    if (a == 33)
    {P1 = tablica[i];
    ++i;
    a = 0;
    if (i == 10)
    i = 0;
    }
    }

    main()
    {
    a=0;
    i=0;
    EA = 1;
    ET0 = 1;
    TMOD = 0x01;
    TL0 = 0xB6;
    TH0 = 0x3A;
    TR0 = 1;
    while(1);
    }

    Co 1 sekunde( około) jest wysyłany kolejny znak z tablicy na wyświetlacz 7 segmentowy (dla kwarcu 20MHz).

    0