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

Dziwne zachowanie ATmega8

kaczy1n 09 Kwi 2009 18:33 1488 7
REKLAMA
  • #1 6393795
    kaczy1n
    Poziom 14  
    Witam!

    Mam problem z programem w bascom'ie. Chce generować przebieg prostokątny na jednym z wyjść mikrokontrolera, lecz częstotliwość przebiegu wygenerowanego ni jak się ma do częstotliwości która powinna być wygenerowana.

    Częstotliwość obliczam dzieląc częstotliwość taktowania kwarcu (w moim przypadku 8MHz) przez podział pleksera ustawiony w timer0 (256).
    Do licznika wpisuje 1 tak więc powinien zliczać 1 impuls i generować przerwanie, które steruje zmianami na wyprowadzeniu mikrokontrolera.

    Częstotliwość przebiegu = (8 000 000 \ 256) \ 2 = 15625 Hz

    A ja otrzymuje częstotliwość przebiegu ok 8 Hz

    Mógłby mi ktoś wyjaśnić dlaczego tak jest ??

    Lisning programu poniżej:



    
    
    $crystal = 8000000
    
    Config Portd = Output
            Portd = 1
    
    Config Portb = Output
            Portb = 0
    
    Config Portc = &B111000
            Portc.0 = 0
            Portc.1 = 0
            Portc.2 = 0
            Portc.3 = 0
    
    Config Timer0 = Timer , Prescale = 256
    
    On Timer0 przerwanie
    
    Pwm_a Alias Portc.4
    
    Enable Interrupts
    Enable Timer0
    Start Timer0
    
    Do
    Loop
    
    przerwanie:
    
    Load Timer0 = 1
    
    Toggle Pwm_a
    
    Return
    
  • REKLAMA
  • #2 6393965
    janbernat
    Poziom 38  
    Opis Zbigniewa Gibka:
    Instrukcja LOAD
    Przeznaczenie:
    Powoduje wpisanie wartości do rejestru licznika.
    Składnia:
    LOAD licznik , wartość
    gdzie

    licznik nazwa licznika; może być: TIMER0, TIMER1 lub TIMER2,
    wartość liczba potrzebnych impulsów.

    Opis:

    Instrukcja powoduje wpisanie do licznika określonej liczby zliczanych impulsów. Przed załadowaniem wartości do licznika, instrukcja dokonuje niezbędnego przeliczenia w postaci: 256-wartość. Tak więc instrukcja:

    Load Timer0, 10
    spowoduje, że do licznika trafi liczba 246, więc licznik przepełni się właśnie po 10 impulsach.

    Licznik TIMER0 nie posiada trybu zliczania z funkcją automatycznego przeładowywania zawartości. Jeśli byłby on wykorzystywany do generowania periodycznych przerwań zegarowych, można użyć właśnie instrukcji LOAD.
    Licznik TIMER1 jest 16 bitowy więc, przeliczenie jest wykonywane w postaci 65536-wartość.

    (c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005

    Oprócz tego nie ma $regfile " ".
  • REKLAMA
  • #3 6393994
    BoskiDialer
    Poziom 34  
    kaczy1n: Licznik jest inkrementowany, nie dekrementowany, stąd wpisanie jedynki spowoduje przepełnienie się licznika po 255*256 cyklach zegara. Dla zegara 8MHz uzyskasz 61Hz, dla zegara 1MHz około 8Hz - sprawdź, czy masz dobrze wybrane źródło zegara.

    janbernat: Gdzie jest napisane, że atmega8 posiada fusebit ckdiv8?
  • #4 6394051
    janbernat
    Poziom 38  
    Fakt, moja pomyłka.
    W kodzie nie było $regfile" " a nie zwróciłem uwagi na nagłówek wiadomości.
    Przepraszam.

    Dodano po 18 [minuty]:

    Dalej mi coś nie pasuje.
    Ale sprawdzę.
    Mam akurat podczepioną atmega8.

    Dodano po 40 [minuty]:

    Jak wpiszę Prescale = 1
    to mam przy kwarcu 16MHz 31.25kHz.
    Czyli przy kwarcu 8MHz byłoby 15.6125 około.
    reszta programu bez zmian.
  • #5 6394449
    kaczy1n
    Poziom 14  
    Wprowadzając wszystkie poprawki , ustawiając parametr prescaler = 1 , oraz wpisując do licznika wartość 1 za pomocą instrukcji load uzyskałem na wyjściu przebieg o częstotliwości 4kHz.

    Nie mam pojęcia dlaczego taka częstotliwość jest a nie ta co wynika z przeliczenia podziału ..... :(
  • REKLAMA
  • #6 6394758
    janbernat
    Poziom 38  
    A masz zewnętrzny kwarc?
    No i ten $regfile" " wpisz do kodu.
  • #7 6394995
    crazy_phisic
    VIP Zasłużony dla elektroda
    Pracujesz na wewnętrznym generatorze 1MHz.
    1MHz/1/255~3920Hz -> 4kHz.

    Szczegóły w dokumentacji i przyklejonych tematach.
  • REKLAMA
  • #8 6395889
    BoskiDialer
    Poziom 34  
    crazy_phisic: Zauważ, że przebieg na wyjściu to połowa częstotliwości przepełniania timera.

    kaczy1n: Moja propozycja, to ustawić prescaler na 1 i nic nie ładować do timera - będzie się przepełniał co 256 cykli zegara. No i należy wybrać poprawne źródło zegara.
REKLAMA