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

Obsługa przerwań w AT90s2313 - migająca dioda co 1 sekundę w assemblerze

Przemek M 02 Cze 2003 23:00 2934 10
  • #1 235731
    Przemek M
    Poziom 2  
    Posty: 3
    W jaki sposób obsłużyć przerwanie na tym mikrokontrolerze?Np. program w assemblerze w którym dioda miga co 1 sekunde
  • #2 236046
    Motonit
    Poziom 14  
    Posty: 157
    Ocena: 4
    Musisz ustawićwektor przerwania i pod tym wektorem wpisać program
    Definicje wektórów przerwań masz rozpisaną w pdf do tego procka
    Pozdrawiam...
  • #3 239480
    rgraczyk
    Poziom 13  
    Posty: 36
    Pomógł: 6
    po prostu pod adresem pamieci w ktorym jest wektor przerwania(sprawdzisz w dokumentacji, pewnie jest to 0002 lub 0003h) zrob
    call do obslugii przerwania, wykonaj co masz wykonac i wroc komenda reti . Sprawdz czy nie musisz odblokowac flagi przerwan(Interrupt Enable) bo inaczej nic nie zadziala.

    Powodzenia
  • #4 354033
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    :arrow: chyba miales na mysli rjmp w tablicy wektorów... pozdro!
  • #5 354668
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    to proste


    ; specjalnie dla urzytkowników forum elektroda :) Eagle

    ; przerwanie t0 z czestoliwoscą 1Hz

    ; dla kwarcu 4 MHz

    ; uC = 89s2313

    .include "2313def.inc" ; definicje rejestrów









    ; trochę teorii

    ; 1 sek przy oscylatorze 4 Mhz to 4 000 000 cykle timer 0 jest 8 bitowy
    ; wiec 4 000 000 / 256 = 15 625
    ; sprawdzamy czy prescalerem możemy coś zdziałać podział przez 1,8,64,256,1024
    ; w żadnym wypadku nie dzieli się bez reszty ( oprócz 15 625 /1 = 15 625
    ; Więc prescaler ustawiamy na podział przez 1 . Aby odmierzyć 1 sek musi przepełnić się
    ; 15 625 razy więc definujemy

    .equ czas = 15625


    .def buf = R16 ; bufor roboczy
    .def t0_l = R17 ; młoszy virtualny timera 0
    .def t0_h = r18 ; starszy virtualny timera 0



    .equ stos = $70 ; a poszalemy sobie z pamiecią
    ; dekalaracja końca stosu


    ; no to zaczynamy


    .org 0
    rjmp reset

    .org 6
    rjmp irq_t0


    reset:
    ;--------------------------


    ldi buf,low(stos) ; ustawieni punktu stosu
    out spl,buf
    ;---------------------------
    ldi buf,1<<TOIE0 ; zezwolenie na przerwania od T0
    out timsk,buf

    ldi buf,1<<CS00 ; prescaker na 1 ( inny podział
    out tccr0,buf
    sei
    rjmp pc ; wieczna pętla


    ;-----------------przerwanie przy przepełnieniu T0
    irq_t0:

    push buf
    in buf,sreg

    ; zwiększenie licznika wtórnego
    inc t0_l
    brne irq_t0_next
    inc t0_h
    irq_t0_next:

    cpi t0_l,low(czas)
    ldi buf,high(czas)
    cpc t0_h,buf
    brne irq_end

    clr t0_l
    clr t0_h

    ;--------------------------------------
    ; tutaj proedurka co ma sie wykonac co 1 sek
    ;
    ;
    ;
    ;
    ;
    ;
    ;
    ;-------------------------------------
    irq_end:
    out sreg,buf
    pop buf
    reti
    Załączniki:
    • elektroda.zip (972 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 354807
    tadzioor
    Poziom 15  
    Posty: 132
    Pomógł: 1
    Ocena: 4
    Eagle napisał:

    ; uC = 89s2313


    Wiem że to pomyłka, ale niektórzy mogą tego nie wiedzieć i będą uparcie szukać takiego procesora :)
  • #7 354890
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    Dzięki :)

    Errata :

    Jest :
    89C2313

    Powinno być:

    90C2313


    sorki ale nie myli się ten kto nie pisze
  • #8 354920
    tadzioor
    Poziom 15  
    Posty: 132
    Pomógł: 1
    Ocena: 4
    Errata do erraty :)

    jest:

    Eagle napisał:

    Errata :

    Jest :
    89C2313

    powinno być:

    90C2313


    powinno być:

    Cytat:

    Errata :

    Jest :
    89S2313

    Powinno być:

    90S2313
  • #9 354935
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    Zaczyna być nawet zabawnie ale Tadzior ma rację :)

    Więc ostatecznie : 90S2313

    Pozdrawiam

    Eagle
  • #10 355068
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    90S2313 - nie ma takiego - jest AT90S2313
    Jak zabawa to zabawa ....
  • #11 362403
    max_gg
    Poziom 26  
    Posty: 631
    Pomógł: 83
    Ocena: 26
    mzielin napisał:
    90S2313 - nie ma takiego - jest AT90S2313
    Jak zabawa to zabawa ....


    Zapomnieliście o AT90LS2313 :P . A poza tym teraz jest już zastąpiony przez ATtiny2313.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy obsługi przerwań w mikrokontrolerze AT90S2313 w asemblerze, na przykładzie migającej diody co 1 sekundę. Wskazano konieczność ustawienia wektora przerwania pod odpowiednim adresem pamięci (np. 0x0002 lub 0x0003) oraz umieszczenia tam skoku do procedury obsługi przerwania, która kończy się instrukcją RETI. Podkreślono, że należy włączyć globalne przerwania (Interrupt Enable). Przedstawiono przykładowy kod asemblerowy dla timera0, który generuje przerwanie z częstotliwością 1 Hz przy kwarcu 4 MHz, wykorzystując preskaler i licznik do odmierzania czasu. W trakcie dyskusji poprawiano oznaczenia modelu mikrokontrolera, wskazując ostatecznie na AT90S2313, z uwzględnieniem wariantów AT90LS2313 oraz nowszego ATtiny2313 jako jego następcy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA