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

[ATTINY2313][BASCOM] Częstotliwość przerwania

kennyg100 14 Lis 2009 14:18 2072 7
REKLAMA
  • #1 7259005
    kennyg100
    Poziom 10  
    Witam!
    Po próbach wyszukania włąściwej odpowiedzi postanowiłem zapytać kolegów o następujący problem -

    muszę dosyć precyzyjnie wygenerować przerwanie w Bascomie , używam do tego timer0 i odpowiedniego przerwania on timer0.
    Dziwny dla mnie jest fakt że programik :

    on timer0 etykietaprzerwania
    ....
    etykietaprzerwania:
    portb7 = not portb.7
    timer0 = 200
    return

    przy kwarcu 10mhz . na porcie wyjsciowym otrzymuje przebieg o okresie 25us i nie chce być mniej , na moja marną logikę jesli ustawiam timer na wartość 200 to przerwanie powinno nastąpić po 55 cyklach zegara , kiedy rejestr timera sie przepełni.
    jednak tak nie jest. Oczywiście nie potrzebuje tego przerwania do generacji przebiegu , na porcie sprawdzam to tylko "diagnostycznie"

    Kiedy dla testu pisze takie coś :

    main:
    portb.7 = not portd.7
    goto main

    to okres przebiegu wynosi 1,2us - czyli jednak procesor może pracować szybciej. Gdzieś sie "zagipsowałem" w swoich poszukiwaniach i zrozumieniu działania timerów w avr.
    Te same rezultaty mam przy próbie używania przerwania compare , na mój blady rozum , przerwanie to powinno następować jesli wartość timera jest równa wartośći compare , jest tak ale dla wyższych wartości compare > 100 , jesli zamarze o przerwaniu co np 10 cykli zegara to otrzymuje "magiczne i nieprzekraczalne" 25us , które zaczyna rosnąc dopiero po compare > 100. Pewnie to dla kolegów proste , a ja chętnie bym to zrozumiał.

    Pozdrawiam
    Robert
  • REKLAMA
  • #2 7259121
    janbernat
    Poziom 38  
    Bo obsługa przerwania też zajmuje trochę czasu- ileś taktów zegara.
    Bascom jest "bezpieczny" dla użytkownika i odkłada na stos wszystko- a nie tylko to co potrzebne.
    A potem zdejmuje ze stosu.
    Ale za to działa wolno.
    Spróbuj :
    on timer0 etykieta przerwania nosave.
    Ale to będzie szybsze i mniej bezpieczne.
    Albo ASM.
  • REKLAMA
  • #3 7259181
    kennyg100
    Poziom 10  
    No niestety chodzi za mną ten asembler im szybsze układy chce robić to tym bardziej chodzi :) , ale w życiu bym się nie spodziewał że bascom tak zwalnia. Jesli o chodzi o hierarchie szybkosći to czy wyglada ona tak - ASM -C -BAscom , czy jednak dobrze skompilowane C jest równe ASM ?
  • REKLAMA
  • #4 7259215
    janbernat
    Poziom 38  
    Hierarchię szybkości dobrze rozumiesz.
    C jest też językiem wysokiego poziomu- chociaż informatycy nazywają go makroasembler.
    Ale z Bascoma też da się sporo wycisnąć.
    Spróbuj opcji "nosave"- może Bascom nie korzysta w tym wypadku z tych rejestrów.
    Po za tym- szybkość zależy od zegara(kwarcu)- jak w komputerze.
  • REKLAMA
  • #5 7259287
    kennyg100
    Poziom 10  
    Spróbowałem , z 25us zeszło na 15 , to troche lepiej ale faktycznie spróbuje asemblera , lubie jak się wszystko zgadza , a cykle zegara nie lądują gdzieś w ciemnej piwnicy. Rozumiem więc że zanim program obsłuży przerwanie to zużywa około 200 cykli na przechowanie stosu. Powstaje we mnie wariacka myśl żeby port oco2 podać na int (drutem) i dopiero tym intem obsługiwać przerwanie. Ale to chyba jakaś porypana konstrukcja.
  • #6 7259384
    janbernat
    Poziom 38  
    Chyba porypana.
    Ale spróbuj obliczyć ile zajmuje ustawienie portu (i jak) i jednak częstotliwość zegara/kwarcu.
    Wyżej zegara nie podskoczysz.
    ATtiny2313 chodzi do 16MHz.
    Jak pracujesz na fabrycznych ustawieniach 1MHz to i ASM nie pomoże.
    I w zasadzie czego spróbowałeś?
    Jak "nosave" to nie ma opóźnienia w odkładaniu/zdejmowaniu ze stosu.
    Bo tego nie ma.
    W Bascomie pewne procedury- albo i cały program- można napisać w ASM.
    P.S.
    Tylko uważaj z ustawianiem fusebitów- można się łatwo zakałapućkać.
    W pierwszym programiku ustawiasz cały port? b7 jak pinb.7- zapomniałeś o kropce.
    I nie pisz o mHz- to naprawdę wolny zegar.
    Raczej o MHz.
  • #7 7259515
    kordirko
    Poziom 22  
    Poniżej masz zdekompilowany fragment kodu 'bascomowego' do obsługi przerwania:
    etykietaprzerwania:
    portb7 = not portb.7
    timer0 = 200
    return

    Widać że odkłada wszystkie rejestry jak leci - 80% z tych instrukcji możnaby wywalić,
    a każda z nich bierze cykle zegara - możesz sobie policzyć ile dokładnie.

    
    +0000002C:   E084        LDI       R24,0x04       Load immediate
    +0000002D:   BF83        OUT       0x33,R24       Out to I/O location
    +0000002E:   E080        LDI       R24,0x00       Load immediate
    +0000002F:   BF80        OUT       0x30,R24       Out to I/O location
    +00000030:   94F8        CLI                      Global Interrupt Disable
    +00000031:   CFFF        RJMP      PC-0x0000      Relative jump
    +00000032:   920F        PUSH      R0             Push register on stack
    +00000033:   921F        PUSH      R1             Push register on stack
    +00000034:   922F        PUSH      R2             Push register on stack
    +00000035:   923F        PUSH      R3             Push register on stack
    +00000036:   924F        PUSH      R4             Push register on stack
    +00000037:   925F        PUSH      R5             Push register on stack
    +00000038:   927F        PUSH      R7             Push register on stack
    +00000039:   92AF        PUSH      R10            Push register on stack
    +0000003A:   92BF        PUSH      R11            Push register on stack
    +0000003B:   930F        PUSH      R16            Push register on stack
    +0000003C:   931F        PUSH      R17            Push register on stack
    +0000003D:   932F        PUSH      R18            Push register on stack
    +0000003E:   933F        PUSH      R19            Push register on stack
    +0000003F:   934F        PUSH      R20            Push register on stack
    +00000040:   935F        PUSH      R21            Push register on stack
    +00000041:   936F        PUSH      R22            Push register on stack
    +00000042:   937F        PUSH      R23            Push register on stack
    +00000043:   938F        PUSH      R24            Push register on stack
    +00000044:   939F        PUSH      R25            Push register on stack
    +00000045:   93AF        PUSH      R26            Push register on stack
    +00000046:   93BF        PUSH      R27            Push register on stack
    +00000047:   93CF        PUSH      R28            Push register on stack
    +00000048:   93DF        PUSH      R29            Push register on stack
    +00000049:   93EF        PUSH      R30            Push register on stack
    +0000004A:   93FF        PUSH      R31            Push register on stack
    +0000004B:   B78F        IN        R24,0x3F       In from I/O location
    +0000004C:   938F        PUSH      R24            Push register on stack
    +0000004D:   B388        IN        R24,0x18       In from I/O location
    +0000004E:   E890        LDI       R25,0x80       Load immediate
    +0000004F:   2789        EOR       R24,R25        Exclusive OR
    +00000050:   BB88        OUT       0x18,R24       Out to I/O location
    +00000051:   EC88        LDI       R24,0xC8       Load immediate
    +00000052:   93800052    STS       0x0052,R24     Store direct to data space
    +00000054:   918F        POP       R24            Pop register from stack
    +00000055:   BF8F        OUT       0x3F,R24       Out to I/O location
    +00000056:   91FF        POP       R31            Pop register from stack
    +00000057:   91EF        POP       R30            Pop register from stack
    +00000058:   91DF        POP       R29            Pop register from stack
    +00000059:   91CF        POP       R28            Pop register from stack
    +0000005A:   91BF        POP       R27            Pop register from stack
    +0000005B:   91AF        POP       R26            Pop register from stack
    +0000005C:   919F        POP       R25            Pop register from stack
    +0000005D:   918F        POP       R24            Pop register from stack
    +0000005E:   917F        POP       R23            Pop register from stack
    +0000005F:   916F        POP       R22            Pop register from stack
    +00000060:   915F        POP       R21            Pop register from stack
    +00000061:   914F        POP       R20            Pop register from stack
    +00000062:   913F        POP       R19            Pop register from stack
    +00000063:   912F        POP       R18            Pop register from stack
    +00000064:   911F        POP       R17            Pop register from stack
    +00000065:   910F        POP       R16            Pop register from stack
    +00000066:   90BF        POP       R11            Pop register from stack
    +00000067:   90AF        POP       R10            Pop register from stack
    +00000068:   907F        POP       R7             Pop register from stack
    +00000069:   905F        POP       R5             Pop register from stack
    +0000006A:   904F        POP       R4             Pop register from stack
    +0000006B:   903F        POP       R3             Pop register from stack
    +0000006C:   902F        POP       R2             Pop register from stack
    +0000006D:   901F        POP       R1             Pop register from stack
    +0000006E:   900F        POP       R0             Pop register from stack
    +0000006F:   9518        RETI        
    
    
  • #8 7259586
    kennyg100
    Poziom 10  
    No tak , a ja szukałem po rejestrach , a tu pięknie i wyrażnie , dziekuje za pomoc.
REKLAMA