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.

STM8L15x - Co nie tak z przerwaniem od licznika (asembler)?

ktoZjarany 22 Kwi 2016 18:30 627 5
  • #1 22 Kwi 2016 18:30
    ktoZjarany
    Poziom 6  

    Z pomocą manuala od St do mikroprocesora z rodziny stm8l15x napisałem taki program, który miał zapalać diodę po przekręceniu się licznika. Jednak do przerwania w ogóle nie wchodzę. Co mam nie tak, bo nie potrafię znaleźć.

    Cytat:
    stm8/

    #include "mapping.inc"
    #include "stm8l152c6.inc"

    segment 'rom'
    main.l
    rim
    ld A,#%11111111
    port_init
    ld PE_DDR,A
    ld PE_CR1,A
    timer_init
    ld A,#%00010101
    ld TIM2_CR1,A
    bset TIM2_IER,#0 ;enable update interrupt
    bset TIM2_PSCR,#2 ;preskaler
    prog
    jp prog


    .tim2
    bset PE_ODR,#7
    iret
    infinite_loop.l
    jra infinite_loop

    interrupt NonHandledInterrupt
    NonHandledInterrupt.l
    iret

    segment 'vectit'
    dc.l {$82000000+main} ; reset
    dc.l {$82000000+NonHandledInterrupt} ; trap
    dc.l {$82000000+NonHandledInterrupt} ; irq0
    dc.l {$82000000+NonHandledInterrupt} ; irq1
    dc.l {$82000000+NonHandledInterrupt} ; irq2
    dc.l {$82000000+NonHandledInterrupt} ; irq3
    dc.l {$82000000+NonHandledInterrupt} ; irq4
    dc.l {$82000000+NonHandledInterrupt} ; irq5
    dc.l {$82000000+NonHandledInterrupt} ; irq6
    dc.l {$82000000+NonHandledInterrupt} ; irq7
    dc.l {$82000000+NonHandledInterrupt} ; irq8
    dc.l {$82000000+NonHandledInterrupt} ; irq9
    dc.l {$82000000+NonHandledInterrupt} ; irq10
    dc.l {$82000000+NonHandledInterrupt} ; irq11
    dc.l {$82000000+NonHandledInterrupt} ; irq12
    dc.l {$82000000+NonHandledInterrupt} ; irq13
    dc.l {$82000000+NonHandledInterrupt} ; irq14
    dc.l {$82000000+NonHandledInterrupt} ; irq15
    dc.l {$82000000+NonHandledInterrupt} ; irq16
    dc.l {$82000000+NonHandledInterrupt} ; irq17
    dc.l {$82000000+NonHandledInterrupt} ; irq18
    dc.l tim2 ; irq19
    dc.l {$82000000+NonHandledInterrupt} ; irq20
    dc.l {$82000000+NonHandledInterrupt} ; irq21
    dc.l {$82000000+NonHandledInterrupt} ; irq22
    dc.l {$82000000+NonHandledInterrupt} ; irq23
    dc.l {$82000000+NonHandledInterrupt} ; irq24
    dc.l {$82000000+NonHandledInterrupt} ; irq25
    dc.l {$82000000+NonHandledInterrupt} ; irq26
    dc.l {$82000000+NonHandledInterrupt} ; irq27
    dc.l {$82000000+NonHandledInterrupt} ; irq28
    dc.l {$82000000+NonHandledInterrupt} ; irq29

    end

    0 5
  • #2 22 Kwi 2016 19:06
    excray
    Poziom 39  

    Ja sie nie znam na STM8 ale oglądając Twój kod odnoszę wrażenie że wektor dla przerwania powinien być opisany jako: {$82000000+tim2}

    0
  • #3 22 Kwi 2016 20:51
    ktoZjarany
    Poziom 6  

    no niestety to nie pomaga

    0
  • #4 23 Kwi 2016 09:58
    zby

    Poziom 14  

    A czy sam timer2 pracuje bo w tych procesorach należy przed inicjowaniem peryferii włączyć do nich zegar (dla timera TIM2 w rejestrze PCKENR1). Chyba że wykonuje to timer_init.

    0
  • #5 23 Kwi 2016 13:03
    ktoZjarany
    Poziom 6  

    Z manuala:
    TIMx_CR1:
    Bit 0 CEN: Counter enable
    0: Counter disabled
    1: Counter enabled

    Tim2 w ogóle nie ma rejestru PCKENR1

    0
  • #6 23 Kwi 2016 16:43
    zby

    Poziom 14  

    Ten rejestr jest opisany na stronie 104 w Link i służy do włączenia zegara do różnych peryferii, m.in. TIM2. Aby TIM2 zadziałał musisz w pierwszej kolejności włączyć mu zegar a dopiero potem go inicjować. Podobnie należy działać w przypadku innych peryferii. Przy uśpieniu procesora dla zmniejszenia poborów prądu wyłącza się te zegary.

    0