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 1863 8
REKLAMA
  • #1 10019556
    kamil1cos7
    Poziom 14  
    Posty: 140
    Pomógł: 1
    Ocena: 5
    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  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    ź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  
    Posty: 140
    Pomógł: 1
    Ocena: 5
    A można jakoś ustawić ten licznik timera żeby zliczał np do 100?
  • REKLAMA
  • #4 10020579
    Piotrek-787
    Poziom 15  
    Posty: 92
    Pomógł: 13
    Ocena: 5
    Oczywiście że można. Poczytaj o trybie CTC.
  • REKLAMA
  • #5 10020663
    kamil1cos7
    Poziom 14  
    Posty: 140
    Pomógł: 1
    Ocena: 5
    No tak, ale chyba ten timer0 tego trybu nie posiada... Do czego służy rejestr TCNT0??
  • #6 10022402
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    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  
    Posty: 140
    Pomógł: 1
    Ocena: 5
    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  
    Posty: 124
    Pomógł: 8
    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  
    Posty: 140
    Pomógł: 1
    Ocena: 5
    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;)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z ustawieniem przerwania od timera0 w mikrokontrolerze ATmega8, który jest taktowany wewnętrznym zegarem 1MHz. Po ustawieniu prescalera na 8, oczekiwał przerwania co 8µs, ale otrzymał je co 2ms. Odpowiedzi wskazują, że licznik timera zwiększa się co 8µs, a do przepełnienia potrzeba 256 cykli. Użytkownik pyta o możliwość ustawienia licznika, aby zliczał do 100, co prowadzi do dyskusji na temat trybu CTC, który nie jest dostępny w timerze0 ATmega8, ale jest w ATmega88. Użytkownik dowiaduje się, że może ustawić wartość w rejestrze TCNT0, aby przerwanie występowało co 100 cykli, co wymaga wpisania wartości 155. Po poprawkach w kodzie, użytkownik planuje dalsze eksperymenty z innymi timerami oraz pyta o konfigurację Eclipse do pracy z avrasm na systemie Ubuntu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA