AVR - przerwania??



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: Szczepan <szczepan.staszak_at_nospam_op.pl>
Subject: AVR - przerwania??
Date: Fri, 4 Feb 2005 00:43:21 +0100


Napisałem oto coś takiego w asemblerku:

.INCLUDE "2313def.inc"
.DEF tmp=r17

.org 0

rjmp RESET ;Reset
reti ;External Interrupt 0
reti ;External Interrupt 1
reti ;T/C1 Capture Event
reti ;T/C1 Compare Match
reti ;T/C1 Overflow
rjmp PRZEP ;T/C0 Overflow
reti ;UART Rx Complete
reti ;UART Data Register Empty
reti ;UART Tx Complete
reti ;Analog Comparator



;.CSEG

RESET:
ldi tmp,0b00000010
out timsk,tmp
sei
ldi tmp,0b11111110
out tcnt0,tmp
ldi tmp,0b00000001
out tccr0,tmp

LOOP:
nop
rjmp LOOP

PRZEP:
ldi tmp,0b01100100
out tccr0,tmp
reti

I wszystko by było fajnie ale po przepełnieniu licznika T0 wchodzę w
przerwanie ale po wykonaniu kodu zawartego w "PRZEP" reti nie powoduje mi
powrotu do miejsca wystąpienia przerwania (pętli LOOP) tylko wykonywanie
kodu zaczyna się od pierwszedo rozkazu (skocz do RESET). Co jest nie tak??
Testowane w AVRStudio i w "realu".

--
Szczepan
[usuń imię oraz kropkę z mojego mejla]

Poprzedni Następny
Wiadomość
Spis treści
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: AVR - przerwania??
Date: Fri, 04 Feb 2005 01:00:32 +0100


Pewnego dnia Szczepan przemówił ludzkim głosem:
Napisałem oto coś takiego w asemblerku:

Zapomniałeś stos zainicjować.

--
Prawo jest jak płot - żmija zawsze się prześlizgnie,
tygrys zawsze przeskoczy a bydło tylko stoi i czeka.

### /mail: bzb<at>poczta<dot>onet<dot>pl/ ###

Poprzedni Następny
Wiadomość
Spis treści
From: Szczepan <szczepan.staszak_at_nospam_op.pl>
Subject: Re: AVR - przerwania??
Date: Fri, 4 Feb 2005 13:09:57 +0100


Dnia Fri, 04 Feb 2005 01:00:32 +0100, Zbych napisał(a):

Zapomniałeś stos zainicjować.

No tak, teraz działa. :]

--
Szczepan
[usuń imię oraz kropkę z mojego mejla]

Poprzedni Następny
Wiadomość
Spis treści
From: "Tomasz Gumny" <tgumny_at_nospam__at_nospam_idn.org.pl>
Subject: Re: AVR - przerwania??
Date: Fri, 4 Feb 2005 01:03:19 +0100


Tak na szybko:

PRZEP:
ldi tmp,0b01100100
out tccr0,tmp

Co poeta miał tu na myśli?
Dobrym zwyczajem jest skasować flagę przerwania (tu: TOV0) bezpośrednio
przed włączeniem przerwania.
TG



Poprzedni Następny
Wiadomość
Spis treści
From: Szczepan <szczepan.staszak_at_nospam_op.pl>
Subject: Re: AVR - przerwania??
Date: Fri, 4 Feb 2005 13:14:34 +0100


Dnia Fri, 4 Feb 2005 01:03:19 +0100, Tomasz Gumny napisał(a):

Co poeta miał tu na myśli?

Poeta miał na myśli dokładnie to co napisał - chciał sie pobawić.

Dobrym zwyczajem jest skasować flagę przerwania (tu: TOV0) bezpośrednio
przed włączeniem przerwania.

A skąd się taki "dobry zwyczaj" bierze? Bo z moich obserwacji w AVRStudio
ta flaga zawsze jest kasowane w momencie wystąpienia przerwania.
Niewidziałem potrzeby dubowania tego.

--
Szczepan
[usuń imię oraz kropkę z mojego mejla]

Poprzedni Następny
Wiadomość
Spis treści
From: "Tomasz Gumny" <tgumny_at_nospam__at_nospam_idn.org.pl>
Subject: Re: AVR - przerwania??
Date: Fri, 4 Feb 2005 13:37:59 +0100


Poeta miał na myśli dokładnie to co napisał - chciał sie pobawić.

Lepiej żeby Poeta nie ustawiał jedynek w niezdefiniowanych miejscach:
ldi tmp,0b01100100
out tccr0,tmp
To się nie rymuje ani w AT90S2313, ani w ATtiny2313.

Dobrym zwyczajem jest skasować flagę przerwania (tu: TOV0) bezpośrednio
przed włączeniem przerwania.

A skąd się taki "dobry zwyczaj" bierze?

Ano stąd, że czasem flaga przerwania może się ustawić
przy ustawianiu konfiguracji i pierwsze przerwanie przyjdzie
natychmiast po SEI (u Poety jeszcze przed ustawieniem tcnt0/tccr0).
TG



Poprzedni Następny
Wiadomość
Spis treści
From: Szczepan <szczepan.staszak_at_nospam_op.pl>
Subject: Re: AVR - przerwania??
Date: Fri, 4 Feb 2005 13:50:26 +0100


Dnia Fri, 4 Feb 2005 13:37:59 +0100, Tomasz Gumny napisał(a):

Lepiej żeby Poeta nie ustawiał jedynek w niezdefiniowanych miejscach:
ldi tmp,0b01100100
out tccr0,tmp
To się nie rymuje ani w AT90S2313, ani w ATtiny2313.

Teraz widzę swój błąd. Wkleiłem nie tem kod co trzeba. Miało być:
ldi tmp,0b01100100
out tcnt0,tmp

Takie są początki w asm ;-)

Teraz rozumiem Twoją uwagę.

--
pozdrawiam
Szczepan
[usuń imię oraz kropkę z mojego mejla]