Jak to wyliczyc ?? (AVR assembler)



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "RP" <r.p.2002_at_nospam_wp.pl>
Subject: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 12:12:43 +0100


Witam,

na stronach Atmela znalazlem przykladowy kod w ktorym jeden z fragmentow
wyglada nastepujaco:

; ******************************************************************
;* "TIM0_OVF" - Timer/counter overflow interrupt handler
;*
;* The overflow interrupt increments the "timerL" and "timerH"
;* every 64us and 16,384us.
;*
;* Number of words: 7
;* Number of cycles: 6 + reti
;* Low registers used: 1
;* High registers used: 3
;* Pointers used: 0
; ******************************************************************
.org OVF0addr
TIM0_OVF:
in S,sreg
inc timerL ;Updated every 64us
inc inttemp
brne TIM0_OVF_exit

inc timerH

TIM0_OVF_exit:
out sreg,S
reti
----------------------------------------------------------------------------
-------------------

no i wlasnie pytanie o timerL - czemu update co 64us ?? - jak wyliczylem
przy zegarze 4MHz 1 takt ma 0.25us (chyba, ze cos krece) - czyli te 64us
wychodza z 256 taktow - w powyzszym przykladzie nie widze jakies petli na
timerL - wiec skad wyszla taka wartosc (timerH jest dla mnie jak najbardziej
zrozumialy czemu 16 384 us)

pozdrawiam,
RP

PS: jesli komus zalezy na calym kodzie to jest dostepny tu:
ftp://www.atmel.com/pub/atmel/avr410.asm





Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar Krzok <waldemar.krzok_at_nospam_ukbf.fu-berlin.de>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 12:18:29 +0100




RP:
[ciach]

no i wlasnie pytanie o timerL - czemu update co 64us ?? - jak wyliczylem
przy zegarze 4MHz 1 takt ma 0.25us (chyba, ze cos krece) - czyli te 64us
wychodza z 256 taktow - w powyzszym przykladzie nie widze jakies petli na
timerL - wiec skad wyszla taka wartosc (timerH jest dla mnie jak najbardziej
zrozumialy czemu 16 384 us)

jak 8 bitowe słowo zwiększasz o 1 co 0.25 mikrosekundy, to po 64
mikrosekundach będzie znowu zero. Masz po prostu licznik modulo 256.

Waldek


Poprzedni Następny
Wiadomość
Spis treści
From: "RP" <r.p.2002_at_nospam_wp.pl>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 13:31:55 +0100


Użytkownik "Waldemar Krzok" <waldemar.krzok_at_nospam_ukbf.fu-berlin.de> napisał w
wiadomości news:3E2BDB05.8020804_at_nospam_ukbf.fu-berlin.de...
jak 8 bitowe słowo zwiększasz o 1 co 0.25 mikrosekundy, to po 64
mikrosekundach będzie znowu zero. Masz po prostu licznik modulo 256.

momencik - nie jestem najlepszy z technicznego angielskiego - ale to

;* The overflow interrupt increments the "timerL" and "timerH"
;* every 64us and 16,384us.

oznacza, ze przepelnienie przerywa przyrost timerL co 64us ???? - tylko jak
to interpretowac - czy przyrost co 64us - czy tez przepelnienie ??

pytam bo ponizsza linijka wskazuje, ze albo ja czegos nie rozumiem (to
pewnie jest prawda) - albo autor walnal sie w komentarzu (w co watpie ;-)) )

inc timerL ;Updated every 64us

z tego wynika, ze wartosc timerL zmienia sie co 64us - a nie przepelnienia
(chyba, ze w tym przypadku update traktowany jest jako przepelnienie) - a na
logike - tak nie jest

jesli wartosc timerL wynosi 0x00 to przy instrukcji inc timerL wynosi chyba
0x01, itd. az do przepelnienia czyli 256 cykli - nastepuje 0xff i znowu
0x00 - jesli opoznienie pomiedzy zmianami wynosi 0.25us - to timerL bedzie
co 64us ale sie przepelnial - a nie zmienial (tak przynajmniej to rozumiem -
jesli gdzies popelnilem blad w logice - to mnie sprostujcie)

pozdrawiam,
RP




Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar Krzok <waldemar.krzok_at_nospam_ukbf.fu-berlin.de>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 13:39:00 +0100




RP:

jak 8 bitowe słowo zwiększasz o 1 co 0.25 mikrosekundy, to po 64
mikrosekundach będzie znowu zero. Masz po prostu licznik modulo 256.


momencik - nie jestem najlepszy z technicznego angielskiego - ale to

;* The overflow interrupt increments the "timerL" and "timerH"
;* every 64us and 16,384us.

oznacza, ze przepelnienie przerywa przyrost timerL co 64us ???? - tylko jak
to interpretowac - czy przyrost co 64us - czy tez przepelnienie ??

pytam bo ponizsza linijka wskazuje, ze albo ja czegos nie rozumiem (to
pewnie jest prawda) - albo autor walnal sie w komentarzu (w co watpie ;-)) )

inc timerL ;Updated every 64us

z tego wynika, ze wartosc timerL zmienia sie co 64us - a nie przepelnienia
(chyba, ze w tym przypadku update traktowany jest jako przepelnienie) - a na
logike - tak nie jest

jesli wartosc timerL wynosi 0x00 to przy instrukcji inc timerL wynosi chyba
0x01, itd. az do przepelnienia czyli 256 cykli - nastepuje 0xff i znowu
0x00 - jesli opoznienie pomiedzy zmianami wynosi 0.25us - to timerL bedzie
co 64us ale sie przepelnial - a nie zmienial (tak przynajmniej to rozumiem -
jesli gdzies popelnilem blad w logice - to mnie sprostujcie)

to, co ty podałeś, to interupt handler przepełnienia. Znaczy masz
licznik (nie w twoim kodzie, tylko tam, gdzie... nie podałeś) i ten
licznik sobie liczy takty (pewnie). Jak się przewali (po 64
mikrosekundach) to jest wywoływane przerwanie, którego wektor leży na
OVRaddr. Czyli wszystko gra, licznik będzie rósł zo 64 mikrosekundy.

Waldek


Poprzedni Następny
Wiadomość
Spis treści
From: "RP" <r.p.2002_at_nospam_wp.pl>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 14:01:21 +0100


Użytkownik "Waldemar Krzok" <waldemar.krzok_at_nospam_ukbf.fu-berlin.de> napisał w
wiadomości news:3E2BEDE4.3060103_at_nospam_ukbf.fu-berlin.de...
to, co ty podałeś, to interupt handler przepełnienia. Znaczy masz
licznik (nie w twoim kodzie, tylko tam, gdzie... nie podałeś) i ten
licznik sobie liczy takty (pewnie). Jak się przewali (po 64
mikrosekundach) to jest wywoływane przerwanie, którego wektor leży na
OVRaddr. Czyli wszystko gra, licznik będzie rósł zo 64 mikrosekundy.

oki - powoli mi sie rozjasnia - to jeszcze jedno - jak znalezc to co wyzwala
to przerwanie

w kodzie jest taki fragment:
ldi temp,1<<TOIE0 ;Enable Timer0 overflow interrupt
out TIMSK,temp

domyslam sie, ze to o to chodzi (w chwili przepelnienia temp uruchamiany
jest licznik timerL - a gdzies w pozostalym kodzie jest petla na temp ktory
zwieksza sie co 0.25us) - ale nie bardzo wiem w jaki sposob jest to
powiazane z tym OVN0addr - jesli ktos mialby chwile to caly kod jest tutaj:
ftp://www.atmel.com/pub/atmel/avr410.asm (chodzi mi o to, w jaki sposob
rejestr temp powiazany jest z tym interrpupt handler'em ??) - czy wynika to
z kodu programu - czy raczej z architektury procka (jesli tak - to gdzie w
dokumentacji mozna znalezc tego typu informacje)

pozdrawiam,
RP






Poprzedni Następny
Wiadomość
Spis treści
From: Artur Lipowski <lal_at_nospam_pro.onet.pl>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 13:18:42 +0000 (UTC)


In article <b0gruv$nvd$1_at_nospam_news2.ipartners.pl>, RP wrote:
...
domyslam sie, ze to o to chodzi (w chwili przepelnienia temp uruchamiany
jest licznik timerL - a gdzies w pozostalym kodzie jest petla na temp ktory
zwieksza sie co 0.25us)
....
Chyba przyjąłeś bardzo karkołomną strategię tzn. najpierw czytać kod
w asemblerze, a potem poczytać o architekturze procka. Jeżeli ta sztuczka Ci
się uda to gratuluję geniuszu (albo dużej ilości wolnego czasu 8-)
Skoro już dotarłeś do stron Atmela to dlaczego nie poczytać więcej
dokumentacji np. datasheets do procków?

BTW dla ułatwienia wszelkich wyliczeń timerów polecam AVRCalc:
http://www.avrfreaks.net/Tools/showtools.php?ToolID=292

Pozdrawiam,
--
Artur Lipowski

Poprzedni Następny
Wiadomość
Spis treści
From: "RP" <r.p.2002_at_nospam_wp.pl>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 14:49:17 +0100


Użytkownik "Artur Lipowski" <lal_at_nospam_pro.onet.pl> napisał w wiadomości
news:slrnb2ntq9.7s.lal_at_nospam_artur2.krakow.tpg.pl...
Chyba przyjąłeś bardzo karkołomną strategię tzn. najpierw czytać kod
w asemblerze, a potem poczytać o architekturze procka. Jeżeli ta sztuczka
Ci
się uda to gratuluję geniuszu (albo dużej ilości wolnego czasu 8-)

geniuszem (niestety) to ja nie jestem ;-))
raczej duzo samozaparcia (przynajmniej chwilowo) - no i nie powiem - ostatni
weekend mialem z glowy ;-)))

Skoro już dotarłeś do stron Atmela to dlaczego nie poczytać więcej
dokumentacji np. datasheets do procków?

tu jest problem - nie znam na tyle technicznego angielskiego ;-(( - a nigdy
wczesniej nie mialem stycznosci z assemblerem (no moze jeden wyklad na
uczelni - ale to tak ogolnie) a tym bardziej z programowaniem takich
procesorkow (zreszta jakichkolwiek pod assemblerem)
dokumentacje to nawet mam wydrukowana i czytalem (a jakze ;-)) ) - ale jak
sie niewiele rozumie, to wychodze z zalozenia, ze na przykladach najszybciej
pojme o co chodzi ;-)))

BTW dla ułatwienia wszelkich wyliczeń timerów polecam AVRCalc:
http://www.avrfreaks.net/Tools/showtools.php?ToolID=292

a dzieki za link - na pewno sie przyda

Pozdrawiam,
--
> Artur Lipowski

pozdrawiam,
RP




Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar Krzok <waldemar.krzok_at_nospam_ukbf.fu-berlin.de>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 16:35:50 +0100




RP:
to, co ty podałeś, to interupt handler przepełnienia. Znaczy masz
licznik (nie w twoim kodzie, tylko tam, gdzie... nie podałeś) i ten
licznik sobie liczy takty (pewnie). Jak się przewali (po 64
mikrosekundach) to jest wywoływane przerwanie, którego wektor leży na
OVRaddr. Czyli wszystko gra, licznik będzie rósł zo 64 mikrosekundy.


oki - powoli mi sie rozjasnia - to jeszcze jedno - jak znalezc to co wyzwala
to przerwanie

w kodzie jest taki fragment:
ldi temp,1<<TOIE0 ;Enable Timer0 overflow interrupt
out TIMSK,temp

tu ło jest załączenie przerwania przepełnienia, a nie samo przepełnienie.
licznik jest tu:
ldi temp,1 ;Timer/Counter 0 clocked at CK
out TCCR0,temp

Ale dzięki za link, akurat się przymierzałem do zrobienia RC5, a tu już
gotowiec jest ;-))

Waldek


Poprzedni Następny
Wiadomość
Spis treści
From: Romuald Bialy <romek_b_at_nospam_o2.pl>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Tue, 21 Jan 2003 20:40:53 +0100


RP wrote:
oki - powoli mi sie rozjasnia - to jeszcze jedno - jak znalezc to co wyzwala
to przerwanie

Sprzetowy timer. Jest to licznik sterowany z kwarcu, i w tym przypadku
sterowany jest czestotliwoscia CLK. Czyli po 256 cyklach zegarowych sie
przepelnia, a to powoduje wygenerowanie przerwania. Calosc dzieje sie
autonomicznie.

w kodzie jest taki fragment:
ldi temp,1<<TOIE0 ;Enable Timer0 overflow interrupt
out TIMSK,temp

Ten rozkaz odblokowuje przerwania z Timera. Musi byc jeszcze samo
uruchomienie tego timera. Jak raz go zainicjujesz to mozesz o nim
zapomniec, a przerwania same beda przychodzic co 64us.

--
Pozdrawiam Romuald Bialy
E'mail: romek_b_at_nospam_o2.pl
yampp-WWW: http://www.yamppsoft.prv.pl


Poprzedni Następny
Wiadomość
Spis treści
From: edek <edek_at_nospam_poczta.onet.pl>
Subject: Re: Jak to wyliczyc ?? (AVR assembler)
Date: Mon, 20 Jan 2003 13:43:04 +0100




RP wrote:
Użytkownik "Waldemar Krzok" <waldemar.krzok_at_nospam_ukbf.fu-berlin.de> napisał w
wiadomości news:3E2BDB05.8020804_at_nospam_ukbf.fu-berlin.de...

jak 8 bitowe słowo zwiększasz o 1 co 0.25 mikrosekundy, to po 64
mikrosekundach będzie znowu zero. Masz po prostu licznik modulo 256.


momencik - nie jestem najlepszy z technicznego angielskiego - ale to

;* The overflow interrupt increments the "timerL" and "timerH"
;* every 64us and 16,384us.

oznacza, ze przepelnienie przerywa przyrost timerL co 64us ???? - tylko jak
to interpretowac - czy przyrost co 64us - czy tez przepelnienie ??


czasownikiem jest tu "increments" nie "interrupt" (wskazuje na to >s<,
bo to w 3-osobie, inaczej byloby "interrupts").

Tak wiec (wiem, wiem, od "tak wiec" sie zdania nie zaczyna :-)
"Przerwanie od przepelnienia zwieksza o 1 (inkrementuje ?) 'TimerL' i
'TimerH' co 64us i 16,384us."

Gosc nie pisze konkretnie od jakiego "przepelnienia" to przerwanie

Pewno ten kto to pisal tak jak ja "umiec mowic angielski nieduzy tylko"
i cos pokrecil :-)

(Ciach)

edek