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] ATMega8 - nie działają timery

Qcinski 20 Maj 2011 18:25 2121 14
REKLAMA
  • #1 9527290
    Qcinski
    Poziom 15  
    Witam. Mam problem z timerami (lub przerwaniami), a mianowicie - nie działają.
    Mam taki kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    do PORTLED=0x0; działa, potem już nic się nie dzieje. Z timerem2 też kombinowałem (na wewnętrznym i zewnętrznym kwarcu), ale też nie działał.
    Program kompiluję pod WinAVR 20100110.

    Może ktoś rzucić okiem i stwierdzić co może być nie tak?
  • REKLAMA
  • Pomocny post
    #2 9527364
    dondu
    Moderator na urlopie...
    Witaj,

    Pobieżnie patrząc na program, wygląda prawidłowo.
    Może podłącz do jakiegoś pinu LED i zmień:

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


    i sprawdź czy co 1sek się zmienia.
    Oczywiście ustaw pin jako wyjście.
  • #3 9527367
    Qcinski
    Poziom 15  
    Sprawdzałem. Niestety nie zmienia się.
  • REKLAMA
  • #5 9527381
    Qcinski
    Poziom 15  
    Watchdoga nie włączałem, zasilanie filtruję przez 100nF, fusebitów nie ruszałem.
    Może to jakaś wada fabryczna tego egzemplarza megi?
  • REKLAMA
  • #7 9527408
    Andrzej__S
    Poziom 28  
    Zamiast:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    sróbuj może dać średnik za while:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 9527409
    myszarafa
    Poziom 10  
    Spróbuj zrobić od przepełnienia. W proteus'ie też port zmieni raz stan i nic.

    volatile int flaga;
    #include <avr/io.h>
    #include <avr/interrupt.h> 
    int main (void)
    {
    		DDRC = 0xff; // Ustaw jako wyjście LED
    		TIMSK = 0x04; // Włącz przerwania przepełnienia (1 <<TOIE1)
    		SREG = 0x80; // włącz przerwania globalne sei()
    		TCNT1 = 49911; // timer z wcześniej obliczonego wartość Preload
    		TCCR1B = 0x03; // Ustawienie timera w Fcpu/64 ((1 <<CS10) | (1 <<CS11))
    
    				for (;;)
    				{
    					PORTC = flaga;
    
    				}
    }
    
    ISR (TIMER1_OVF_vect)
    {
    	flaga++;
    	TCNT1 = 49911; // timer Przeładuj wartość z wcześniej obliczonego
    }


    kiedyś tego wykorzystywałem do przerwań, działało w 100%.
  • #10 9527430
    Qcinski
    Poziom 15  
    Z nową tak samo.
    Za to z kodem od myszarafa dioda działa chyba jak powinna. Pokombinuję z tym trochę i dam znać.
    Optymalizacja standardowa.
  • #12 9527511
    Qcinski
    Poziom 15  
    W makefile mam wpisaną s

    OK, już działa. Nie wiem czemu, ale Programmers Notepad i wywoływany przez niego make nie reagował na zmiany w kodzie (nawet na celowe błędy). Każdy program po kompilacji miał 166 bajtów. Dopiero po restarcie zaczęło się dobrze kompilować.

    Dziękuję za pomoc.
  • REKLAMA
  • #15 9527591
    Karol966
    Poziom 31  
    Qcinski napisał:
    W makefile mam wpisaną s

    OK, już działa. Nie wiem czemu, ale Programmers Notepad i wywoływany przez niego make nie reagował na zmiany w kodzie (nawet na celowe błędy). Każdy program po kompilacji miał 166 bajtów. Dopiero po restarcie zaczęło się dobrze kompilować.

    Dziękuję za pomoc.


    Kilka razy też z takim czymś się spotkałem... 2 może 3 razy i pomagała np dekompilacja i ponowna kompilacja programu. Mając skróty klawiszowe do PN to nie problem kliknąć 2 razy więcej ;)
REKLAMA