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

[MEGA8][C] Dwa liczniki Timer0 i Timer2. Jakis konflikt.

hagop 18 Kwi 2010 18:08 1457 11
REKLAMA
  • #1 7976405
    hagop
    Poziom 15  
    Witam!

    Chce użyć dwóch liczników 8bitowych. Oto konfiguracja:

    
    TIMSK=1<<TOIE0;
    //TIMSK=1<<TOIE2;
    
    TCNT0=T0_INIT;
    //TCNT2=T2_INIT;
    
    TCCR0=5;
    //TCCR2=4;
    


    Gdy uruchomię Timer2 to po wgraniu na procesor wiesza się najprawdopodobniej na LCD_Init(); ponieważ wyświetlacz nie che się włączyć. Gdy wrzucę to do AVRStudio też program zatrzymuje się na LCD_Init();. Co jest problemem? Z Timer0 wszysko działa.
  • REKLAMA
  • #2 7976438
    BoskiDialer
    Poziom 34  
    Wpisując do TIMSK wartość (1<<TOIE2) kasujesz pozostałe bity, więc w tym przypadku dobrze będzie poprawić kod na:
    TIMSK=1<<TOIE0; 
    TIMSK|=1<<TOIE2; 
    
    TCNT0=T0_INIT; 
    TCNT2=T2_INIT; 
    
    TCCR0=5; 
    TCCR2=4;

    lub (zastępując pierwsze dwie linijki):
    TIMSK=(1<<TOIE0)|(1<<TOIE2);
  • REKLAMA
  • #3 7976662
    hagop
    Poziom 15  
    Niestety dalej to samo.

    Gdy nie wpisuje TOIE2 to wyświetlacz startuje ale nie działają mi te rzeczy powiązane z Timer2.
  • #4 7976698
    BoskiDialer
    Poziom 34  
    Druga możliwość: brak funkcji obsługi przerwania od T2, przez co wystąpienie przerwania powoduje reset procesora. Użycie złej nazwy wektora przerwania będzie się objawiać tak samo. Ewentualnie brak sei(), przez co przerwania nie wywołują się, mimo że są odpowiednie funkcje. Wklej więcej kodu, bo na ślepo pisać nie warto.
  • REKLAMA
  • #5 7976742
    hagop
    Poziom 15  
    
    SIGNAL (SIG_OVERFLOW2)
    {
    TCNT2=T2_INIT;
    ///	funkcja	
    }
    
    
    void main(void)
    {
    
    char buf[8];
    flaga=1;
    TIMSK=(1<<TOIE0)|(1<<TOIE2);
    
    
    TCNT0=T0_INIT;
    TCNT2=T2_INIT;
    
    TCCR0=5;
    TCCR2=4;
    
    
    sei();
    
    	LCD_Init();// w tym miejscu się zatrzymuje avrstudio
    //funkcje
    }
  • #6 7976758
    BoskiDialer
    Poziom 34  
    Brakuje funkcji przerwania od timera0, chyba że to też wyciąłeś. Z tego kawałka kodu wciąż nie da się niczego wywnioskować. Jeśli wiesz lepiej gdzie tkwi błąd (skoro wybierasz fragmenty kodu), to po co ten temat?
  • #7 7976776
    hagop
    Poziom 15  
    bo błąd gdzieś tkwi w tym Timer2. Jak jest uruchomiany tylko Timer0 wszystko działa poprawnie:

    
    SIGNAL (SIG_OVERFLOW0)
    {
      TCNT0 = T0_INIT;
     //funkcje
    }



    Przy pustych funkcjach SIGNAL (SIG_OVERFLOW0) i SIGNAL (SIG_OVERFLOW2) (tylko wpisanie wartosci do licznika) dzieje sie to samo...
  • REKLAMA
  • #8 7976999
    Konto nie istnieje
    Poziom 1  
  • #9 7977033
    tadzik85
    Poziom 38  
    Pewnie w obsłudze LCD.
  • #10 7977415
    GSM
    Poziom 25  
    Witam,

    a czy kolega przypadkiem gdzieś w funkcji LCD_init() nie używa do czegoś timerów?

    Pozdrawiam,
    GSM
  • #11 7978333
    hagop
    Poziom 15  
    wymienilem atmege z ciekawosci i wszysko dziala... ta jest jakas felerna
  • #12 7978345
    GSM
    Poziom 25  
    A nie namieszałeś jej czegoś w fusebitach? Tak, że przez to niestabilnie pracowała?

    Pozdrawiam,
    GSM
REKLAMA