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

ATmega8 - Przerwania - CTC - Prośba o korektę

mały_zrw 07 Lis 2009 20:10 1900 6
REKLAMA
  • #1 7228750
    mały_zrw
    Poziom 10  
    Witam....
    Dostałem polecenie napisania programu, który po wciśnięciu SWITCH'A zapala diodę LED na dokładnie 4 sekundy. Następnie dioda ma zgasnąć, a my w obojętnie którym momencie możemy znów ją załączyć na ten czas.
    ATmega8 tyka wg. zegara zewnętrznego 14,7456 MHz

    Napisałem kod... (duża liczba komentarzy pomoże zrozumieć), ale są 2 problemy:
    1) Czas odliczany to nie 4 sekundy, a jakieś 2 :(
    2) Po pierwszym uruchomieniu zlicza dalej i gdy klikam drugi raz na SWITCH'A to nie odlicza od początku ustalonego cyklu


    W załączniku plik .c do uruchomienia w AVRstudio 4.....
  • REKLAMA
  • Pomocny post
    #2 7228972
    Mad.
    Poziom 18  
    Jestem początkującym, więc za dużo Ci nie pomogę z kodem, ale jedno wiem na pewno ;) Odlicza Ci 2 sekundy, bo tak ustawiłeś OCR1A.
    Mając kwarc 14,745,600 Hz, ustawiłeś preskaler na 1024. Czyli 14400 cykli, to 1 Hz. Przy 28799 w Twoim programie, masz prawie 2 sekundy.

    To tak w międzyczasie, póki inna osoba Ci pomoże.
  • REKLAMA
  • Pomocny post
    #3 7228994
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #4 7229015
    Dr.Vee
    VIP Zasłużony dla elektroda
    1) Czas masz źle policzony, rzeczywiście wychodzi 2 sekundy :)
    Policz jeszcze raz, np:
    #define F_CPU 14745000ul
    #define TIMER_PRESCALE 1024
    #define SECONDS(s) ((s)*(F_CPU)/(TIMER_PRESCALE))

    2) podpięcie przycisku pod przerwanie to pomyłka - poczytaj o eliminacji drgań styków
    3) po wyłączeniu diody musisz zatrzymać i wyzerować timer

    Pozdrawiam,
    Dr.Vee
  • #5 7229187
    mały_zrw
    Poziom 10  
    A w nocie katalogowej ( Link) jest na stronie 89 wzór. Przekształcając otrzymuję:

    OCR1A=(F_CPU*czas/2*Preskaler)-1
    Wychodzi 28799 cykli

    Tyle że na tej samej stronie jest wykres i on pokazuje jak to jest zliczane.
    Widać że TCNTn w czasie jednego okresu (we wzorze "czas") odliczy 2 razy.
    Dlatego pewnie ten błąd

    Likwidując 2 ze wzoru będzie dobrze.

    OK :D

    To było o problemie nr 1)

    Problem nr 2 to tak jak pisał atom1477 trzeba było wpisać jedynie "TCCR1B=0;"


    SUPER działa :D
    Wielkie dzięki

    *a co do uwagi Dr.Vee o drganiach to jak na razie muszę o tym więcej poczytać ;)
  • #6 7229311
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 7229716
    mały_zrw
    Poziom 10  
    atom1477 napisał:
    To znaczy resetowanie zawartości Timera... I resetował bym Timer przed włączeniem go oczywiście.

    Moje pytanie brzmi.... jak go resetować.....
    Na razie zrobiłem tak: jak wcisnę przycisk, to zacznie zliczać cykle i wtedy dioda jest włączona. Po skończeniu odliczania - wyłącza diodę i ustawia TCCR1B = 0. Tym samym Timer jest wyłączony.
    Ale o co Wam chodzi z tym resetowaniem??? Może jakiś przykładowy kodzik lub fragment, bo jestem początkujący, a by napisać to co dałem na początku nieźle się natrudziłem.....
REKLAMA