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.

Atmega8 - Nie działa przerwanie ctc

krzysiekwfd 18 Mar 2015 18:23 921 15
  • #1 18 Mar 2015 18:23
    krzysiekwfd
    Poziom 11  

    Witam mam program napisany do świecenia diody na przerwaniu timera w trybie ctc i nie działa dioda świeci cały czas po włączeniu zasilania

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 15
  • #2 18 Mar 2015 18:33
    el2010tmp
    Poziom 25  

    krzysiekwfd napisał:
    dioda świeci cały czas po włączeniu zasilania

    Pokaż w którym miejscu ją wyłączasz?
    Po co w kółko wykonujesz timer_init(); ?

    0
  • #3 18 Mar 2015 18:38
    krzysiekwfd
    Poziom 11  

    el2010tmp napisał:
    krzysiekwfd napisał:
    dioda świeci cały czas po włączeniu zasilania

    Pokaż w którym miejscu ją wyłączasz?
    Po co w kółko wykonujesz timer_init(); ?

    bo chce by dioda migała co 1 sekunde

    0
  • #4 18 Mar 2015 18:44
    el2010tmp
    Poziom 25  

    krzysiekwfd napisał:
    bo chce by dioda migała co 1 sekunde

    zamień:
    PORTB |=(1<<led1);
    na:
    PORTB ^=(1<<led1);

    a funkcje timer_init(); wywołaj tylko raz, pred while(1).

    0
  • #5 18 Mar 2015 21:21
    krzysiekwfd
    Poziom 11  

    po rescie mc dziła ale tylko za pierwszym razem

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 18 Mar 2015 21:37
    emarcus
    Poziom 35  

    el2010tmp napisał:
    krzysiekwfd napisał:
    bo chce by dioda migała co 1 sekunde

    zamień:
    PORTB |=(1<<led1);
    na:
    PORTB ^=(1<<led1);

    a funkcje timer_init(); wywołaj tylko raz, przed while(1).


    To jest jednak za mało..
    W programie są źle skonfigurowane rejestry TCCR1A oraz TCCR1B

    Taka konfiguracja ustawi Timer1 w tryb CTC:
    Atmega8 - Nie działa przerwanie ctc

    natomiast w/g tej tabeli oraz (TCCR1A); masz toggle portu bez udziału processora,,,

    Atmega8 - Nie działa przerwanie ctc

    e marcus

    0
  • #7 18 Mar 2015 21:50
    krzysiekwfd
    Poziom 11  

    po ustawieniu rejestrów podanych wyzej nic sie nie zmienia

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 18 Mar 2015 22:10
    QuadMan
    Poziom 13  

    Witam,

    wywal jeszcze ten

    Kod: c
    Zaloguj się, aby zobaczyć kod


    z pętli:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i powinno być ok.

    Pozdrawiam, QuadMan.

    0
  • #9 18 Mar 2015 22:14
    krzysiekwfd
    Poziom 11  

    QuadMan napisał:
    Witam,

    wywal jeszcze ten
    Kod: c
    Zaloguj się, aby zobaczyć kod


    z pętli:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i powinno być ok.

    Pozdrawiam, QuadMan.

    no nie bardzo bo juz wcześniej to porwałem i to samo dioda swieci cały czas
    cały kod
    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 18 Mar 2015 22:36
    onidpl
    Poziom 9  

    rejestr TCCR1A nie posiada tych bitów, które chcesz ustawić, zrób to tak:
    TCCR1B |= (1<<WGM12)|(1<<CS20);

    Dodano po 3 [minuty]:

    Program nigdy nie może wyjść poza funkcję main() dlatego instrukcja return nie powinna wystąpić w tej funkcji. Bo w innym przypadku wychodzisz z funkcji main i nie wiadomo co się później dzieje z programem, dlatego napisz funkcję main w ten sposób void main(void) { }, żeby nie popełnić tego błędu.

    Dodano po 4 [minuty]:

    Instrukcję sei() wywołaj po konfiguracji Timera.

    Dodano po 7 [minuty]:

    *poprawka TCCR1B |= (1<<WGM12)|(1<<CS12); //prescaler ustawiony na 265, tak w ogóle to ile wynosi taktowanie mikrokontrolera?

    0
  • #11 18 Mar 2015 22:46
    krzysiekwfd
    Poziom 11  

    cały kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

    taktowanie procka to 8mhz

    0
  • #12 19 Mar 2015 00:03
    QuadMan
    Poziom 13  

    Witam,

    poprawiłem Ci ten kod - działa ok.
    Przeczytaj komentarze.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam, QuadMan.

    0
  • #13 19 Mar 2015 04:25
    emarcus
    Poziom 35  

    krzysiekwfd napisał:
    cały kod
    Kod: c
    Zaloguj się, aby zobaczyć kod

    taktowanie procka to 8mhz


    Zmień jeszcze:
    #define led1 PB1 //defincja diody podłaczonej do PB1 - wyjście OC1
    i podłącz diodę do PB1, wtedy nie potrzebujesz używac interruptu.

    e marcus

    0
  • #14 19 Mar 2015 08:55
    krzysiekwfd
    Poziom 11  

    QuadMan napisał:
    Witam,

    poprawiłem Ci ten kod - działa ok.
    Przeczytaj komentarze.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam, QuadMan.


    o dziwo dioda nie miga

    0
  • #15 19 Mar 2015 11:15
    QuadMan
    Poziom 13  

    Witam,

    krzysiekwfd napisał:
    QuadMan napisał:
    Witam,

    poprawiłem Ci ten kod - działa ok.
    Przeczytaj komentarze.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam, QuadMan.


    o dziwo dioda nie miga


    coś musisz chyba źle robić, u mnie miga. Co prawda sprawdzałem na AT328P, bo taki akurat miałem pod ręką, ale jeśli chodzi o Timer1 to praktycznie identyczne uC.

    Pozdrawiam, QuadMan.

    0
  • #16 25 Mar 2015 11:58
    krzysiekwfd
    Poziom 11  

    do zamknięcia dioda działa jak należy

    0