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

Atmega 8 - Timer 2: Problem z ISR po zmianie zmiennej globalnej `choose`

mateuszrjzr 23 Gru 2013 12:48 1827 8
REKLAMA
  • #1 13091158
    mateuszrjzr
    Poziom 17  
    Witam
    Tak jak w temacie :D Program, który napisałem obsługuje 5 serw. Timer 2 działa w trybie pwm, w OCR2 ustawia odpowiednie wyjście na 1, a przy przepełnieniu ustawia wejścia wszystkich serw na 0. Wartość OCR2 zmieniam przy pomocy uswitchów, ale problem polega na tym, że jak zmienię wartość zmiennej globalnej choose(wgl nie związanej z rejestrem OCR2), dzieje się coś dziwnego. Mimo, że mogę zmieniać wartość rejestru(sprawdzałem przez rs232) to ISR (TIMER2_COMP_vect) włącza się chyba przy wartości 0, bo czas pulsu wynosi 4ms- czyli przy 8MHz prescalerze 128 wychodzi ok. 250. Nie mam pojęcia co się dzieje. Po resecie mikrokontrolera wszystko działa ok, a gdy tylko zmienię wartość zmiennej choose wszystko się sypie...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Atmega 8 - Timer 2: Problem z ISR po zmianie zmiennej globalnej `choose`
  • REKLAMA
  • #2 13091397
    polarczn
    Poziom 16  
    W twoim kodzie nie ma funkcji int main(). W jakim programie wygenerowałeś ten wykres?
  • REKLAMA
  • #3 13091416
    mateuszrjzr
    Poziom 17  
    Witam
    Jest while, ale w pliku main.c. Jest to saleae logic analayser.

    Atmega 8 - Timer 2: Problem z ISR po zmianie zmiennej globalnej `choose`
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 13108752
    kacper10714
    Poziom 10  
    Nigdzie nie widzę zadeklarowanej zmiennej "choose".

    proponowałbym również sformatowanie switch case tak aby każda instrukcja case miała swoją klamrę bo tam występuje zmiana OCR2:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 13109317
    Konto nie istnieje
    Poziom 1  
  • #6 13110084
    mateuszrjzr
    Poziom 17  
    Tak, tylko to _delay_ms(500) jest tylko wtedy, gdy nacisnę przycisk, a nie cały czas. Jedno przerwanie ustawia stan wysoki (compare match) a drugie niski(overflov). Co do drgań styków, to oglądałem film Pana Mirosława i tam on obalał tą tezę. Ja podzielam jego zdanie. Z resztą nie mam z nimi problemów. Co z tego że static? Nie pomyliło ci się z const?
    kacper10714 :
    choose to makro
  • REKLAMA
  • #7 13110826
    excray
    Poziom 41  
    W przerwaniach wywołujesz bardzo długie funkcje. A przerwania masz szybkie więc zanim funkcja się skończy to już kilka-kilkaset przerwań Ci ucieknie pozostawiając po sobie flagi które wywołują przerwanie natychmiast po zakończeniu poprzedniego.
  • #8 13111016
    mateuszrjzr
    Poziom 17  
    Czyli zrobić zewnętrzne przerwanie na te funkcje??
  • #9 13111039
    excray
    Poziom 41  
    Najlepiej to przejrzyj jak to zrobili inni, przemyśl te przykłady i jeszcze raz napisz od początku. Jeśli Ty sam piszesz coś czego nie jesteś w stanie sprawdzić i zrozumieć to znaczy że porywasz się "z motyką na słońce".
REKLAMA