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

[atmega 8535][bascom] instrukcja PULSEIN

szun 08 Lis 2008 19:13 2495 2
  • #1 5715829
    szun
    Poziom 19  
    Mam problem z określeniem wielkości jednostki czasowej

    cytat Bascom Basic AVR:
    Uwaga! Do zliczania nie jest używany żaden z liczników-czasomierzy. Wewnętrzna zmienna pracująca jako licznik (16 bitowy) jest zwiększana co 10µs. Czas ten jednak zależy od częstotliwości taktującego kwarcu. Można zmodyfikować procedurę z biblioteki by zmienić podstawową jednostkę czasu.

    Czy bez modyfikacji biblioteki można określić przy ustwieniach np. 1Mhz,2Mhz,4Mhz,8Mhz
    jaka jest wartość podstawowej jednostki czasu dla poszczególnych ustawień
  • Pomocny post
    #2 5717496
    ZbeeGin
    Poziom 39  
    Źle zrozumiałeś ten zapis. Część odpowiedzialna za taktowanie co 10us wygląda tak:

        ...
    _pulse_in5:
        @genus(9)                        ; THIS FOR 10 US UNITS but approx. depends on XTAL
      
        ; you can remove the above call and tailor this routine
        ; when remarked 10 cycles/loop are needed and for 1 Mhz this is 10 uS
        ; for 4 MHz you need additional 30 cycles and the @genus can be used
    
        ld    r0, Z                      ; 2 cycl. get pin state
        and   r0, r24                    ; 1 cycl. get only the input pin state
        eor   r0, r16                    ; 1 cycl. xor with begin state returns zero if the same
        brne  _pulse_in_exit             ; 2 cycl. ready ,state changed
        adiw  Xl,1                       ; 2 cycl. counter
        brne  _pulse_in5                 ; 2 cycl. again
    
    _pulse_in_timeout:
        call  _Set_Error                 ;  set error because of time out
    
    _pulse_in_exit:
        ; X holds timing
        mov   r24, Xl                    ; store data here
        mov   r25, Xh
        ret


    Makro @genus() tworzy albo ciąg instrukcji NOP, albo małą pętlę z instrukcjami NOP - wszystko zależy od tego jak długi czas ma wygenerować. Liczbę tych "opóźniaczy" kompilator określa podczas końcowej kompilacji i bierze pod uwagę właśnie parametr z dyrektywy $CRYSTAL. Wiadomo przy 1MHz jedno NOP trwa dłużej niż przy 16MHz, i nie zawsze jest szansa wstrzelić się dokładnie w ramy czasowe. Dlatego przy takich małych czasach jedno NOP więcej lub mniej ma już istotny wpływ na ten czas.
    Dodatkowo jak widzisz najkładają się takty z pętli, którą tu przytoczyłem. Razem z @genus(9) jest to właśnie około 10us przy 4MHz. Jakbyś taktował procesor 1MHz to mógłbyś spokojnie wywalić to makro, bo sama pętla już daje 10 taktów (1 takt@1MHz = 1us). Dlatego przy 1MHz najprawdopodobniej czas ten nie wynosi 10us tylko 20us. Mark Alberts powinien zatem poprawić bibliotekę i dodać warunkową kompilację makra przy _XTAL <> 1MHz. :|
  • #3 5718956
    szun
    Poziom 19  
    ::arrow::ZbeeGin
    Dzięki Koledze za zainteresowanie
    Kolega ma racje przy 1Mhz jednostka czasowa wynosi 20µs
    Sprawdziłem to doświadczalnie i się zgadza :D
    Uczę się na BASCOM-AVR 1.11.9.1
    dzięki za kod który kolega zamieścił ale z BASCOM DEMO nie mam dostępu do kodów żródłowych ,aby modyfikować procedury.
REKLAMA