Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Attiny26][Bascom] Konfiguracja Time1

avatar 12 May 2011 14:36 1792 4
  • #1
    avatar
    Level 36  
    Witam czy ktos moze mnie oswiecic w jaki sposob zapisac wartosc do rejestru Counter1 pod bascomem ?
    Mam taki prosty program i za nic w siecie bascom nie che go lyknac
    
    $regfile = "Attiny26.dat"
    $crystal = 1000000
    Config Timer1 = Timer , Prescale = 64                       
    On Ovf1 Czas
    
    Enable Interrupts                                           
    Enable Timer1                                               
    Counter1 = 120
    
    Do
    nop
    Loop
    
    Czas:
    nop
    Return
    End
    


    I taki oto blad
    ASSIGNMENT ERROR line 8
    Procesor ma ten timer w sobie.
    Jezli to wina bascoma to w jaki sposob zapisac ta wartosc z poziomu jakiejs wstawki assemblerowj ?
  • #2
    dominon
    Level 18  
    Drogi kolego jest coś takiego jak "Help" w bascom i jest on bardzo przejrzysty.

    Tak na logikę. Deklarujesz Timer1 jako timer a wpisujesz wartość do countera? Nie dziw się że wywala błąd. Spróbuj "Timer1 = 120".
  • #3
    Wojtek75
    Level 24  
    Spróbuj wpisać bezpośrednio do rejestru TCNT1 jeżeli ma to działać to trzeba oczywiście przeładować w każdym przerwaniu wartość w tym rejestrze. Zdecydowanie lepiej wykorzystać tryb CTC i rejestr compare OCR1C. Timer1 w tiny26 jest dość specyficzny polecam przejrzeć notę.
  • #4
    emarcus
    Level 38  
    avatar wrote:
    Witam czy ktos moze mnie oswiecic w jaki sposob zapisac wartosc do rejestru Counter1 pod bascomem ?
    Mam taki prosty program i za nic w siecie bascom nie che go lyknac
    .............

    I taki oto blad
    ASSIGNMENT ERROR line 8
    Procesor ma ten timer w sobie.
    Jezli to wina bascoma to w jaki sposob zapisac ta wartosc z poziomu jakiejs wstawki assemblerowj ?


    Nie jest to wina Bascom ani nie ma też potrzeby na wstawki assemblerowe w tak błahym i wyjatkowo "obłędnym" zastosowaniu timera AVR.
    Po pierwsze; jak już wyżej ktos nadmienił mieszasz rejestr timera1 z counterm1. Chociaż jest to ten sam licznik i nawet gdyby compiler to zaakceptował, to dla śledzenia sensu i ciągłości programu należy stosować odpowiednie nazwy rejestru dla zadanej procedury. Timer dostaje impulsy z zegara taktującego processor, lub oddzielnego rezonatora kwarcowego; (zaleznie od processora i rodzaju timera), poprzez odpowiedni współczynnik/prescaler, (tu wymagana odpowiednia konfiguracja timeraX); natomiast counter może dostawać impulsy z zewnątrz bez prescalera poprzez odpowiedni port/pin.

    Popatrz jeszcze raz na swój program: Stosujesz tam instrukcje 'nop', która jest właściwe instrukcja assemblerową a Bascom ją supportuje tak jak kilka innych również stosowanych w C.
    Co ta instrukcja wnosi do twojego programu?
    -NIC - jest to absolutna strata czasu processora - w tym wypadku zbędna (niekiedy procedury wymagają pewnego 'spowolnienia' processora lub odczekania pewnego przedziału czasu).
    Dalej, jeżeli już używasz timera (nie ważne którego) w trybie 'Normal' to do poprawnej jego pracy zachodzi potrzeba za każdym razem użyc processora aby 'załadował' jego rejestr (licznik) wartością początkową od której ma liczyć czas/impulsy aż do jego pełnej pojemności (przepełnienia).
    Procedurę tą umieszcza sie w przerwaniu od Ovf1, ponadto skoro deklaruje sie takie przerwanie to w nim zwykle znajduje się coś więcej - cel tego przerwania np: incrementowanie jakiejs zmiennej, stawianie flagi itp.
    A co w twoim programie zawiera przerwanie?
    NOP czyli nic (No OPeration).

    Sprubuj zapoznać sie z takim małym calculatorem dla Timerów AVR.
    Tam masz dla każdej opcji dowolnego timera 'ramowy' przykład programu z objaśnieniami.
    A oto darmowy link:
    http://www.planet-ian.com/start_e.htm
    W categorii 'Software tools' znajdziesz: AVR Timer 1.25

    Powodzenia

    e marcus