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

AVR ATmega16 - Zawieszanie programu przy przerwaniu Timer2, kwarc 8MHz

witeix 22 Sty 2014 00:38 1587 8
  • #1 13205444
    witeix
    Poziom 10  
    Witam
    Siedzę już drugą noc nad samymi timerami, a termin końcowy oddania projektu się zbliża. Problem wygląda tak, że gdy załączę zezwolenie na przerwanie od timera2 zawiesza się cały program (kratki na wyświetlaczu). Potrzebuje drugiego timera do obliczeń a Timer1 generuje przerwanie co 0,5s w trybie CTC. Kwarc 8MHz.

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Treść kodu jest po wielu próbach w połowie bez sensu, chodzi mi głównie o to, dlaczego startując (TIMSK) drugi timer (Timer2 lub Timer0) program się wiesza? Potrzebna mi jest praca dwóch timerów na raz.
    Z góry dziękuję za pomoc
  • #2 13205468
    Konto nie istnieje
    Poziom 1  
  • #3 13205502
    witeix
    Poziom 10  
    do CR0 ładowałem wartość 100 na preskalerze 8, ale i tak program się wieszał. Robiłem test w którym momencie się wiesza i wyszło, że przy
    TIMSK |= (1 << OCIE0)
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tak ma to wyglądać w zamyśle. TIMER0 musi działać bardzo szybko, gdyż musi liczyć szukaną r, a ona może przyjmować duże wartości (do 10000).
  • #4 13205569
    dondu
    Moderator na urlopie...
    Witaj.

    witeix napisał:
    TIMER0 musi działać bardzo szybko ....

    W takim układzie dlaczego w funkcji przerwania ISR(TIMER0_COMPA_vect) karzesz mu wykonywać czasochłonne obliczenia na float-ach w dodatku w pętli?
    Jeżeli więc włączasz tak napisaną funkcje przerwania:

    witeix napisał:
    Robiłem test w którym momencie się wiesza i wyszło, że przy TIMSK |= (1 << OCIE0)

    to efekt już znasz.

    Wskazówki: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html
  • Pomocny post
    #5 13205572
    Wojtek75
    Poziom 24  
    W jakim środowisku działasz? Jesteś pewny nazwy tego wektora? Nie ma żadnych ostrzeżeń?
    Bo mnie się tu coś nie zgadza:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak chyba powinno być prawidłowo:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 13205575
    dondu
    Moderator na urlopie...
    Słuszna uwaga Wojtek75 - jedna literka a wielka różnica: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
    Zapewne warning kompilatora miałeś, ale go zignorowałeś:

    Cytat:
    warning: 'TIMER0_COMPA_vect' appears to be a misspelled signal handler

    a skoro ignorujesz to lektura: http://mikrokontrolery.blogspot.com/2011/04/bledy-kompilacji-programu.html
  • #7 13205676
    witeix
    Poziom 10  
    dziękuję za uwagi i cenne wskazówki log z programu wygląda tak:
    > "C:\WinAVR-20100110\make.bat" all
    
    C:\Users\Krzysztof\Desktop\ds18b20 - float - Kopia>make.exe
    
    -------- begin --------
    avr-gcc (WinAVR 20100110) 4.3.3
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Size before:
    main.elf  :
    section            size      addr
    .text              7222         0
    .data               152   8388704
    .bss                 68   8388856
    .debug_aranges      128         0
    .debug_pubnames     806         0
    .debug_info        4571         0
    .debug_abbrev      1355         0
    .debug_line        4148         0
    .debug_frame        448         0
    .debug_str          808         0
    .debug_loc         1629         0
    .debug_ranges       144         0
    Total             21479
    
    
    
    
    Size after:
    main.elf  :
    section            size      addr
    .text              7222         0
    .data               152   8388704
    .bss                 68   8388856
    .debug_aranges      128         0
    .debug_pubnames     806         0
    .debug_info        4571         0
    .debug_abbrev      1355         0
    .debug_line        4148         0
    .debug_frame        448         0
    .debug_str          808         0
    .debug_loc         1629         0
    .debug_ranges       144         0
    Total             21479
    
    
    
    -------- end --------
    
    
    > Process Exit Code: 0
    > Time Taken: 00:03
    

    Problem dalej istnieje, zakreskowuję obsługę przerwania ISR(TIMER0_COMP_vect}, poprostu je wywalam i w momencie startu timera 0 wiesza się program, a wtedy przecież nie robi żadnych obliczeń.
  • Pomocny post
    #8 13205678
    dondu
    Moderator na urlopie...
    witeix napisał:
    Problem dalej istnieje, zakreskowuję obsługę przerwania ISR(TIMER0_COMP_vect}, poprostu je wywalam i w momencie startu timera 0 wiesza się program, a wtedy przecież nie robi żadnych obliczeń.

    Bo nadal masz włączone to przerwanie, a nie masz funkcji jego obsługi.
  • #9 13221083
    witeix
    Poziom 10  
    Panowie mieliście rację tzn. pomyliłem się o tę jedną literkę A, a później nie obsługiwałem procedury przerwania dziękuję wszystkim za pomoc.
    POZDRAWIAM
REKLAMA