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

Atmega jako generator fali prostokątnej

mariano__ 09 Sty 2009 22:56 5994 14
  • #1 5975558
    mariano__
    Poziom 10  
    Witam wszystkich!
    W końcu piszę swojego pierwszego posta bo nie mogę czegoś rozgryźć.
    Chciałem użyć Atmegi8 do generowania sygnału taktującego o dosyć wysokiej częstotliwości (około 1 MHz) oraz do transmisji SPI.
    Generator miał działać sprzętowo i udało mi się to zrobić.
    Niestety przy generowaniu sygnału, w momencie wystąpienia przerwania od
    przepełnienia kasowana jest flaga I w rej. SREG i program zostaje przerwany a następnie wykonuje się od początku. Efekt jest taki, że program jest przerywany po kilku linijkach i zaczyna się od początku.
    Podglądam w AVR Studio.
    Chciałem się zapytać szanownych kolegów, czy da się jakoś ominąć to kasowanie flagi? Czyli generować sygnał z atmegi i jednocześnie, bez zakłóceń, wykonywać program:?:
    Pozdrawiam :D
  • Pomocny post
    #2 5975585
    BoskiDialer
    Poziom 34  
    Zawsze obsługa przerwania powoduje skasowanie flagi I, aby pod koniec obsługi flaga została ponownie ustawiona przez instrukcję reti. Jeśli program się przerywa po kilku linijkach, to znaczy posiadasz nie obsłużone wektory przerwań, a to jest błąd w kodzie. Albo wyłącz przerwanie od danego źródła, albo wyłącz przerwania, jeśli z nich nie korzystasz.
  • Pomocny post
    #3 5976824
    _Robak_
    Poziom 33  
    Nie sadze zeby bez sprzetowego PWM dalo sie to zrobic, wykonanie procedury obslugi przerwania troche trwa i nawet jak bys mial 16mhz to musialbys w 16 taktach zmiescic skok do przerwania, wykonanie go i powrot. Najlepiej ustaw PWM choc nie wiem czy i on nie ma jakiegos ograniczenia
  • Pomocny post
    #4 5977047
    marenc
    Poziom 24  
    Jak wyżej... dodam, że skoro chcesz obsługiwać dwie rzeczy w miarę asynchroniczne względem siebie, a bez zakłóceń w ich pracy - to musisz co najmniej jedną obsłużyć sprzętowo. Znaczy jeżeli zrobisz PWM na liczniku, to masz pewność jego pracy, a nie sądzę, żebyś przy tak małych założeniach projektu wysyłał tyle danych przez SPI, żeby nie było czasu na jego programowe(konfiguracja i dane podczas działania programu) obsłużenie.
  • #5 5977335
    mariano__
    Poziom 10  
    Liczyłem, że może jest jakiś kruczek żeby to zrobić na skróty (podejrzewam, że na jakimś ARMie albo FPGA lub na sieciach neuronowych dało by się tak to odpalić).
    Ostatecznie zrobię to tak, że generator będzie uruchamiany tylko na pewien określiny czas.
    Pozdrawiam i dziękuję za pomoc :)
  • #6 5977948
    ZbeeGin
    Poziom 39  
    mariano__ napisał:
    Niestety przy generowaniu sygnału, w momencie wystąpienia przerwania od przepełnienia kasowana jest flaga I w rej. SREG i program zostaje przerwany a następnie wykonuje się od początku. Efekt jest taki, że program jest przerywany po kilku linijkach i zaczyna się od początku.
    Podglądam w AVR Studio.

    A stos kolega ustawił? Czy w takiej sytuacji nie dostajesz ostrzeżenia "Stack overleap at XXXX" w oknie "Messages"?
  • #7 5980000
    mariano__
    Poziom 10  
    Nie dostaję żadnego ostrzeżenia :cry:

    Teraz nie wkleję kodu bo wyjechałem na kilka dni z domu ale oto co robię:

    -ustawiam pin PB1 jako wyjście (OC.1A)
    -wpisuję liczbę do rejestru OCR1A
    -ustawiam rejestry TCCR1A i B na tryb CTC (to jest chyba mode 4), bity COM na "togggle OC1A on compare match"
    -zezwalam na przerwania od przepełnienia (w rej. TIMSK)
    -zezwalam na globalne przerwania (SREG_I)

    +wchodzę do pętli głównej i wysyłam słowo transmisją SPI

    Podczas wysyłania słowa program wychodzi z pętli, następuje odwrócenie pinu PB1, następnie od nowa wykonanie programu od MAIN'a. W zależności od ustawionej częstotliwości program wyskakuje w różnych miejscach (ale w tym samym dla danej f).
    Coś robię nie tak?
    Pozdrawiam
  • #8 5985822
    sebastiankozub
    Poziom 11  
    chcesz pracowac w trybie CTC a przerwanie masz od przeplenienia...
    to chyba 2 rozne rzeczy
  • #9 5991592
    mariano__
    Poziom 10  
    Sorki pomyliłem się- miało być "przerwanie od porównania".

    Generalnie można uznać, że nie można realizować tych dwóch zadań równolegle co chyba zamyka temat.

    Pozdrawiam i dziękuję za rozwianie moich wątpliwości.
  • #11 16213712
    ZbeeGin
    Poziom 39  
    yozue napisał:
    Jeśli to ktoś czyta to proszę o linka (Atmega i zwykły generator fali prostokątnej)

    Nota katalogowa w dłoń, przeczytać sekcję dotyczącą licznika, przeliczyć czasy i ustawić parę bitów w rejestrach. Ot cała filozofia.
    Jak nie będziesz w stanie przeczytać i zrozumieć noty katalogowej, bądź manuala dla procesora to nic w miktokontrolerach nie osiągniesz.
  • #12 16214094
    Konto nie istnieje
    Konto nie istnieje  
  • #14 16214590
    BlueDraco
    Specjalista - Mikrokontrolery
    ATmega (ani prawie żaden inny uC) nie obsłuży przerwania generowanego z częstotliwością 1 MHz. Użyj jednego timera tyko do generowania przebiegu, a innego do zgłaszania przerwań, w ktśrych masz robić to, co robisz raz na jakiś czas.
  • #15 16215833
    Konto nie istnieje
    Poziom 1  
REKLAMA