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 - Timery i przerwania nie działają w kodzie C, WinAVR 20100110

Qcinski 20 Maj 2011 18:25 2193 14
REKLAMA
  • #1 9527290
    Qcinski
    Poziom 15  
    Posty: 175
    Pomógł: 18
    Ocena: 9
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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.
  • REKLAMA
  • #3 9527367
    Qcinski
    Poziom 15  
    Posty: 175
    Pomógł: 18
    Ocena: 9
    Sprawdzałem. Niestety nie zmienia się.
  • #4 9527372
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Hmm,
    - watchdog wyłączony?
    - zasilanie poprawnie filtrowane?
    - fusbity poprawne?
    no chyba że coś jeszcze w programie powinno być czego nie pamiętam.

    A przy okazji zainstaluj AVR Studio 4.
  • #5 9527381
    Qcinski
    Poziom 15  
    Posty: 175
    Pomógł: 18
    Ocena: 9
    Watchdoga nie włączałem, zasilanie filtruję przez 100nF, fusebitów nie ruszałem.
    Może to jakaś wada fabryczna tego egzemplarza megi?
  • #6 9527403
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Jeżeli nowy, to 99,9% jest sprawny.
    Czasami (ponoć) fusbity bywają inne niż standardowe.

    Jeżeli masz drugą to oczywiście sprawdź.

    A może jeszcze ktoś inny rzuci okiem na program?
  • REKLAMA
  • #7 9527408
    Andrzej__S
    Poziom 28  
    Posty: 567
    Pomógł: 182
    Ocena: 65
    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  
    Posty: 7
    Pomógł: 1
    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%.
  • REKLAMA
  • #10 9527430
    Qcinski
    Poziom 15  
    Posty: 175
    Pomógł: 18
    Ocena: 9
    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  
    Posty: 175
    Pomógł: 18
    Ocena: 9
    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.
  • Pomocny post
    #13 9527556
    Karol966
    Poziom 31  
    Posty: 2041
    Pomógł: 83
    Ocena: 650
    To właśnie zostało uruchomione - musi działać. Pisane pod WinAVR

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code][/quote]
  • #15 9527591
    Karol966
    Poziom 31  
    Posty: 2041
    Pomógł: 83
    Ocena: 650
    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 ;)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zgłosił problem z działaniem timerów i przerwań w kodzie C dla mikrokontrolera ATMega8, kompilowanym w WinAVR 20100110. W kodzie, po ustawieniu rejestrów i włączeniu przerwań, dioda LED nie zmienia stanu, co sugeruje, że przerwania nie są aktywne. Użytkownicy zasugerowali kilka potencjalnych przyczyn, takich jak wyłączenie watchdog'a, poprawne filtrowanie zasilania oraz sprawdzenie fusebitów. Po dalszych próbach i sugestiach dotyczących zmiany kodu, użytkownik odkrył, że problem leżał w błędnej kompilacji, która nie reagowała na zmiany w kodzie. Po restarcie środowiska programistycznego, kod zaczął działać poprawnie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA