Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

asembler + AVR + timer. pomocy dla laika

shekt 30 Wrz 2006 12:34 1389 2
  • #1 30 Wrz 2006 12:34
    shekt
    Poziom 11  

    Witam.
    Pewnie tematów z podobnymi prośbami było tu już mnóstwo. Niestety nie znalazłem odpowiedzi na nurtujące mnie pytanie.
    Napisałem taki króciutki programik w asm.

    .include "m8def.inc"

    .CSEG
    .org 0x0000
    rjmp RESET
    .org 0x001C
    rjmp timer0

    RESET:
    ;inicjowanie stosu
    ldi r16, LOW(RAMEND)
    out SPL, r16
    ldi r16, HIGH(RAMEND)
    out SPH, r16

    ;poczatkowe ustawienia PORTB
    ldi r16, 0b00000010
    out DDRB, r16
    out PORTB, r16

    ;inicjowanie timera 0
    ldi r16, (1<<TOIE0)
    out TIMSK, r16
    ldi r16, (1<<CS02)|(1<<CS00)
    out TCCR0, r16
    ldi r16, 100
    out TCNT0, r16 ;ladowanie wartosci poczatkowej licznika
    sei ;wlaczenie obslugi przerwan

    main:

    rjmp main

    ;------------
    timer0:
    push r16
    in r16, PORTB
    com r16
    out PORTB, r16
    pop r16
    tu:
    reti
    ;------------

    Kiedy licznik się przepełni następuje przerwanie i "wskoczenie" do instrukcji timer0. Jednak z instrukcji tej nie powraca poleceniem reti do miejsca, w którym został przerwany program (w tym przypadku do pętli main) lecz zaczyna program od początku. Dlaczego? Co robię nie tak? Proszę o pomoc.

    Używam StudioAVR4 i na nim robię symulacje, a w asemblerze bawię się od niedawna :)

    0 2
  • Pomocny post
    #2 30 Wrz 2006 14:57
    roiman
    Poziom 14  

    vector timer0 w atega8 jest pod adresem 0x0009 a nie 0x001C mysle ze to wlasnie to

    0
  • #3 30 Wrz 2006 15:10
    shekt
    Poziom 11  

    tak, to wlasnie bylo to. Najwidoczniej nie doczytalem dokumentacji :)

    Dziekuje ;)

    0