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

[avr] Jak wygenerować sygnał prostokątny 1-1000Hz na ATmega32A 8MHz w trybie CTC?

sorex86 08 Sty 2014 09:52 1668 15
REKLAMA
  • #1 13151876
    sorex86
    Poziom 15  
    Witam,

    Potrzebuje wygenerowac sygnal prostokatny na atmedze32A 8Mhz (zakres od 1-1000Hz). Postanowilem w tym celu uzyc trybu 4 CTC. Z tego co zrozumialem to powinnem zrobic tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i nastepnie na PIN PD 5 powinienem miec migajace diode z czestotliscia 7,8hz.
    Wg wzoru : f_clk/(2N(1+OCRn)

    Dioda caly czas swieci. Co robie zle? Nie mam oscyloskopu.

    http://www.atmel.com/Images/doc2503.pdf
  • REKLAMA
  • #2 13151916
    excray
    Poziom 41  
    A dlaczego miałoby migać? W załączonym przez Ciebie kodzie nic nie ma o żadnym miganiu a nawet zmianie stanu/kierunku na PD5. Ba, nie ma nawet funkcji main{}. Twój kod w ogóle nie powinien zadziałać.
  • REKLAMA
  • #4 13152037
    sorex86
    Poziom 15  
    Myslalem, ze to kwestia konfiguracji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z tego co mi sie wydawalo to tryb ten powinien powodowac cykliczna zmiane stanu portu. Czyli w takim wypadku nie musze dawac:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    jestem w bledzie ?
  • #5 13152040
    dondu
    Moderator na urlopie...
    Zastanów się nad tym:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ponieważ nie włączasz wyjścia na pin OC1x patrz bity: FOC1A lub FOC1B
    ale wtedy nie będzie to pin PD5.

    EDIT:
    Edytowałeś, gdy pisałem i zmieniłeś PORTB na PORTD stąd ta uwaga jest nieistotna.
    Reszta nadal istotna.
  • REKLAMA
  • #6 13152062
    sorex86
    Poziom 15  
    Zauwazylem ten blad i go zedytowalem. Przepraszam za zamieszanie.

    Wydawalo mi sie, ze wystarczy:
    - ustawic wyjscie PD5
    - ustawic rejestr w tryb 4 CTC

    dondu napisał:

    ponieważ nie włączasz trybu PWM z wyjściem na pin OC1x.


    mozna jasniej, bo tego nie rozumiem.
  • REKLAMA
  • #8 13152069
    dondu
    Moderator na urlopie...
    Tym razem ja edytowałem gdy, ty pisałeś - zobacz bity COM1A1 i COM1A0 w rejestrze TCCR1A:

    Cytat:
     Bit 7:6 – COM1A1:0: Compare Output Mode for Compare unit A
     Bit 5:4 – COM1B1:0: Compare Output Mode for Compare unit B
    The COM1A1:0 and COM1B1:0 control the Output Compare pins (OC1A and OC1B respectively)
    behavior. If one or both of the COM1A1:0 bits are written to one, the OC1A output
    overrides the normal port functionality of the I/O pin it is connected to. If one or both of the
    COM1B1:0 bit are written to one, the OC1B output overrides the normal port functionality of the
    I/O pin it is connected to. However, note that the Data Direction Register (DDR) bit corresponding
    to the OC1A or OC1B pin must be set in order to enable the output driver.

    When the OC1A or OC1B is connected to the pin, the function of the COM1x1:0 bits is dependent
    of the WGM13:0 bits setting. Table 44 shows the COM1x1:0 bit functionality when the
    WGM13:0 bits are set to a normal or a CTC mode (non-PWM).


    i tabelkę pod nimi.

    A wektor przerwania dla wersji programu z przerwaniem, także zły co podał wyżej, kol. Steryd3

    Innymi słowy:
    - albo wykorzystujesz przerwanie i dowolny pin np. PD5 i realizujesz to programowo,
    - albo ustawiasz pin OC1A w automatyczne zmienianie stanu na przeciwny przy porównaniu z OCR1A poprzez wykorzystanie COM1A1 i COM1A0. Tylko tutaj musisz DDR pinu OC1A ustawić jako wyjściowy (patrz wytłuszczenie powyżej).

    Chyba że coś pomyliłem :)
  • #9 13152143
    sorex86
    Poziom 15  
    dondu napisał:

    - albo ustawiasz pin OC1A w automatyczne zmienianie stanu na przeciwny przy porównaniu z OCR1A poprzez wykorzystanie COM1A1 i COM1A0. Tylko tutaj musisz DDR pinu OC1A ustawić jako wyjściowy )


    Dokladnie o takie rozwiazanie mi chodzi. Faktycznie zapomnialem o TCCR1A= (1<<COM1A1). Obecny kod:
    #define CLK_LED PD5
    ....
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tylko nadal nie miga :) Ciagle swieci. Dioda powinna migac co 1s wg wzoru z noty katalogowej. Fusy napewno mam dobrze ustawione, bo funkcja _delay_(1000) trwa rowna 1s. Petla while(1) tez jest... Rejestry mam dobrze?
  • #10 13152149
    excray
    Poziom 41  
    Bo uparłeś się na PD5 tym czasem wyjście OC1A jest na PB1.
    [avr] Jak wygenerować sygnał prostokątny 1-1000Hz na ATmega32A 8MHz w trybie CTC?
  • #11 13152163
    dondu
    Moderator na urlopie...
    excray napisał:
    Bo uparłeś się na PD5 tym czasem wyjście OC1A jest na PB1.

    Wyjście ma OK, bo to ATmega32.

    Włączasz przerwanie, ale czy masz funkcję obsługi? Jest Ci potrzebne do innych celów?
    Wklejaj cały kod.

    Zamiast COM1A1 ustaw COM1A0 to będziesz miał zmianę stanu na przeciwny za każdym stwierdzeniem zgodności licznika Timera z OCR1A.
  • Pomocny post
    #12 13152174
    excray
    Poziom 41  
    dondu napisał:
    Wyjście ma OK, bo to ATmega32.

    A to przepraszam. Gdzieś mi cały czas chodziło po głowie że to Atmega8 :-P
  • #14 13152212
    sorex86
    Poziom 15  
    Tak, uzywam atmegi32 8mhz, plytka EvB 4.3;D Kurcze,. przegladam note i mam wrazenie, ze wszystko dobrze,. a jednak nie jest. Caly kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #15 13152223
    dondu
    Moderator na urlopie...
    Już pisałem:

    dondu napisał:
    Włączasz przerwanie, ale czy masz funkcję obsługi? Jest Ci potrzebne do innych celów?


    poza tym piszesz, że to powyżej to cały kod, ale na pewno tak nie jest ponieważ nie ma funkcji main. Wklejaj faktycznie cały kod, a najlepiej takie sprawy sprawdza się na osobnym pliku i jego tylko kompiluje bez zbędnych dodatków, bibliotek, itp.
  • #16 13152249
    sorex86
    Poziom 15  
    Dzieki za pomoc. W koncu ruszylo. Bez informacji o COM1A0 bym sobie nie poradzil. Dla potomnych caly dzialajacy kod. 8Mhz, atmega32. Wzor na czestotliwosc jest w nocie katalogowej. Migajaca dioda co 1s.

    #define CLK_LED PD5 nalezy zmienic na #define CLK_LED (1<<PD5) !!!!!


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA