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, ustawienie przerwania od timera0, assembler

kamil1cos7 12 Paź 2011 16:06 1728 8
REKLAMA
  • #1 10019556
    kamil1cos7
    Poziom 14  
    Witam, mam problem z ustawieniem przerwania od timera0 na atmega8, jestem początkujący jeśli chodzi o assembler... Problem leży w tym że, uP jest taktowany z wewnętrznego zegara 1MHz, i jeśli mam ustawiony prescaler na 8 czyli rejestr TCCR0 na 2 to powinienem otrzymać obsługę przerwania co 8us a na oscyloskopie otrzymałem igiełkę co 2ms;/ nie wiem co jest grane:P
    Naskrobałem taki kod:
    .include "m8def.inc"
    .cseg
    .org 0x00
    rjmp start
    .org 0x09
    rjmp timer0
    
    .org 0x0A
    
    start:
    sbi DDRB, 1
    cbi PORTB, 1      ;PB1 wyjscie, dioda
    
    ldi r16, 127
    out SPL, r16      ;wskaznik stosu
    
    ldi r16, 2
    out TCCR0, r16     ;ustawienie prescalera przez 8
    
    ldi r16, 1
    out TIMSK, r16   ;zezwolenie na przerwanie od timer0
    
    sei
    
    prog:
    rjmp prog
    
    timer0:
    sbi PORTB, 1
    nop
    nop
    nop
    nop
    nop
    cbi PORTB, 1
    reti
    
  • REKLAMA
  • #2 10019805
    Krauser
    Poziom 26  
    źle liczysz. Co 8us będzie zwiększany licznik timera, a do przepełnienia potrzeba ich 256.
    PS. do ładowania wskaźnika stosu lepiej używać wartości low(RAMEND)
  • REKLAMA
  • #3 10020389
    kamil1cos7
    Poziom 14  
    A można jakoś ustawić ten licznik timera żeby zliczał np do 100?
  • REKLAMA
  • #4 10020579
    Piotrek-787
    Poziom 15  
    Oczywiście że można. Poczytaj o trybie CTC.
  • #5 10020663
    kamil1cos7
    Poziom 14  
    No tak, ale chyba ten timer0 tego trybu nie posiada... Do czego służy rejestr TCNT0??
  • REKLAMA
  • #6 10022402
    Krauser
    Poziom 26  
    W atmega8 timer0 nie ma trybu CTC, ale już w atmega88 taki tryb jest. Rejestr TCNT0 to rejest przechowujący aktualną wartość licznika timera0. Skoro nie ma trybu CTC to w normalnym trybie przerwanie będzie występowało co 100 cykli jeśli na początku programu i w obsłudze przerwania wpiszesz do tego rejestru taką wartość aby do przepełnienia (zmiany z 255 na 0) zostało 100.
  • #7 10023253
    kamil1cos7
    Poziom 14  
    Czyli muszę do tego rejestru wpisać 155, dobrze rozumiem??
    Czyli tak:
    ldi r16, 155
    out TCNT0, r16

    z tym że już tak wpisałem i nie zadziałało...

    Dodano po 18 [minuty]:

    Dobra, mój błąd bo nie wpisywałem tych dwóch linijek do obsługi przerwania... ale myślałem że, to się na stałe zapisuje;p Wielkie dzięki za pomoc;)
  • #8 10023311
    rrytel
    Poziom 14  
    Tryb CTC jest w atmega8 na timer1 i timer2, Jeżeli chcesz mieć dokładnie to zastosuj któryś z powyższych timerów.
    przy odpowiednim skonfigurowaniu timera może on automatycznie zmieniać stan na odpowiednim wyjściu. (dla timer 1 jest to OC1A/PB1 OC1B/PB2, a dla timer2 OC2/PB3)

    W trybie CTC nie musisz ciągle wpisywać wartości do TCCRx.
  • #9 10025601
    kamil1cos7
    Poziom 14  
    Do TCCR0 wpisałem raz w timer0 a do TCNT0 za każdą obsługą przerwania...
    Chciałem obczaić ogólnie możliwości tego timera0 teraz będę obczajał pozostałe timery, jak mi nie będzie szło to będę pytał...
    Dzięki za pomoc;)

    Dodano po 14 [minuty]:

    Panowie a może wiecie jak skonfigurować eclipse do współpracy w avrasm??
    Używam ubuntu, ale avrasm można dzięki 'wine' zainstalować...
    Z góry dzięki za pomoc;)
REKLAMA