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

ATMEGA8535 - Biblioteka timer0 nie działa funkcja "Timer0_RegisterCallbackF

prociomen007 09 Wrz 2013 19:05 1983 3
  • #1 12717862
    prociomen007
    Poziom 18  
    Witam, próbuje wykonać prosty odtwarzacz midi w oparciu o mikrokontroler atmega8535. Bazując na przykładach z internetu udało mi się temat jakoś wstępnie ogarnąć. Niestety na atmedze nie uruchamia mi się zegar o który oparte mają być programy. Wszystko jakby "wisi". Dodam że programuję w C w środowisku Code Vision AVR. W celu zlokalizowania problemu uprościłem program do minimum i wygląda na to że funkcja Timer0_RegisterCallbackFunction nie rejestruje funkcji którą ma wołać zegar. Kod wygląda mniej więcej tak.

    Na początku oczywiście

     Timer0_Init(); 


    Potem dalej w programie:

     
     sbiBF(TCCR1B, CS10);       
     Timer0_RegisterCallbackFunction(Play);    
    


    No i testowo metoda Play wygląda tak:
    
    void Play(void){
    PORTD^=0x01;
    }
    


    Na moje rozumowanie zegar powinien wołać właśnie tę metodę a ona zmieniać stany na porcie D. Niestety wszystko wisi nic się kompletnie nie dzieje zarówno w rzeczywistości jak i na symulacjach w ISIS. Dodam że metoda Timer0_RegisterCallbackFunction jest zawarta w bibliotece time0.h
  • #2 12718118
    zumek
    Poziom 39  
    prociomen007 napisał:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A dlaczego tu się czepiasz Timera NUMER JEDEN :?: :-P
  • #3 12718239
    prociomen007
    Poziom 18  
    Ta linijka w sumie nie ma potrzeby istnieć. Według mnie wystarczy wywołać:

    Timer0_Init()'

    i potem

    Timer0_RegisterCallbackFunction( jakaś funkcja )

    i powinno chodzić. Jednak nic się nie dzieje.

    Samo Timer0_Init wygląda tak:

    
    void Timer0_Init(void)
    {
        //mt char i;
        uint8_t i;
    
        // Initialize array of callback functions
        for (i=0; i<TIMER0_NUM_CALLBACKS; i++)
            CallbackFunc[i] = NULL;
    
        // Initialize countdown timers
        for (i=0; i<TIMER0_NUM_COUNTDOWNTIMERS; i++)
            CountDownTimers[i] = 255;
    
    
        // Initialize Timer0.
        // Used to give the correct time-delays in the song
    
        // Enable timer0 compare interrupt
        TIMSK = (1<<OCIE0);
    
        // Sets the compare value
        OCR0 = 38;
    
        // Set Clear on Timer Compare (CTC) mode, CLK/256 prescaler
        TCCR0 = (1<<WGM01)|(0<<WGM00)|(4<<CS00);
    }
    


    Natomiast Timer0_RegisterCallbackFunction

    
    char Timer0_RegisterCallbackFunction(TIMER_CALLBACK_FUNC pFunc)
    {
          
    
        // mt char i;
        uint8_t i;
        
        for (i=0; i<TIMER0_NUM_CALLBACKS; i++)
        {
            if (CallbackFunc[i] == pFunc)
                return TRUE;
        }
        
        for (i=0; i<TIMER0_NUM_CALLBACKS; i++)
        {
            if (CallbackFunc[i] == NULL)
            {
                CallbackFunc[i] = pFunc;
                return TRUE;
            }   
        }
        
        return FALSE;
    }
    
    



    Metoda ta wykonuje się u mnie prawidłowo bo zwraca true jednak całość nie startuje.
  • #4 12718821
    zumek
    Poziom 39  
    Po przyjrzeniu się tym załączonym przez Ciebie funkcjom stwierdzam, że brakuje mi tu zaklęcia SEI :idea:
REKLAMA