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

Złe zliczanie czasu przez TIMER1 w ATTINY2313

wilkolaski 20 Mar 2009 01:05 3325 7
  • #1 6305997
    wilkolaski
    Poziom 18  
    Witajcie. Mam problem z ustawieniem odliczania czasu przez Attiny2313.
    Według moich obliczeń mikrokontroler powinien co 1s wyświetlać na LCD kolejne sekundy (program jest przykładowy żeby dobrze ustawić czas zliczania bo docelowo chce zrobić pomiar częstotliwość a przez to w dalszej części pomiar indukcyjność).
    Więc obliczyłem to sobie tak.
    Kwarc 12MHz dziele w preskalerze przez 64 czyli mam częstotliwość 187500. Całość będzie zliczał Timer1. Ustawia wiec mu wartość początkową 46706 przez co timer będzie miał do zliczenia 18750 cykli po czym się przepełni. W programie obsługi przerwania zliczam takie przepełnienia i jeżeli będzie ich 10 zostanie zwiększona zmienna i wyświetlona na wyświetlaczu która będzie pokazywała ilość sekund.
    Sęk w tym że z niewiadomych powodów na wyświetlaczu liczby zmieniają się co 20s. Dodam ze fusy na pewno mam dobrze ustawione bo po odłączeniu kwarcu tiny nie staruje tak samo jak podłącze inny kwarc np 6MHz.
    Dla formalności fusy mam ustawione tak że:
    CKSEL=1111 SUT11 czyli w AVRDude Lower Fuse:7F a High Fuse:D9

    Poniżej zamieszczam listing programu.
    
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Timer1 = Timer , Prescale = 64
    
    Config Lcd = 16 * 2                                      
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portd.6 , Rs = Portd.4
    
    On Timer1 Przepelnienie_timera
    
    Dim B As Integer
    Dim A As Integer
    
    Load Timer1 = 46706
    Enable Interrupts
    Enable Timer1
    Stop Timer1
    
    Cls
    B = 1
    A = 0
    Start Timer1
    
    Przepelnienie_timera:
     Stop Timer1
     If B = 10 Then
     Incr A
     Lowerline
     Lcd A
     B = 0
     End If
     Incr B
     Load Timer1 = 46706
     Start Timer1
    Return
    

    Będę wdzięczny za pomoc bo mnie już szlak trafia.
  • #2 6306018
    Konto nie istnieje
    Poziom 1  
  • #3 6306044
    wilkolaski
    Poziom 18  
    No właśnie zmieniłem CLKDIV8 na 1 czyli nie zaprogramowane i wreszcie zaczęło działać ale nadal przy ustawieniach TIMERA jakie podałem w programie nie odlicza mi 1s ale około 3s natomiast przy takich ustawieniach:
    zegar 12MHz prescaler=1, Load Timer1 = 65000 i zliczaniu 200 przepełnień zaczyna liczyć cos w okolicy 1s.
    Odnośnie pętli głównej to masz racje. Przed wstawieniem listingu do postu trochę program wyczyściłem z śmieci i przez przypadek wywaliłem pętle główna.
    Oczywiście przed programem obsługi przerwania powinno być:
  • #4 6306077
    Konto nie istnieje
    Poziom 1  
  • #5 6308447
    wilkolaski
    Poziom 18  
    emarcus dzięki teraz już gra.
    Mam jeszcze takie pytanie bo tak jak wcześniej pisałem docelowo chcę zrobić miernik indukcyjności. Przejrzałem projekty mierników w necie i na elektrodzie i są oki tylko większość z nich opiera się na mikrokontrolerze PIC 16F84A. W sumie mam wsad do procka w asm ale kiepsko znam asemblera wiec postanowiłem napisać własny soft ale na wspomnianego attiny2313. Z tego co wyczytałem w necie to mierzone są 3 częstotliwości i na ich podstawie określana jest badana indukcyjność lub pojemność. Pierwszy pomiar określa częstotliwość generatora z podłączona znaną cewka i kondensatorem. Drugi pomiar określa częstotliwość po podłączeniu dodatkowo wzorcowego kondensatora. Trzeci pomiar określa częstotliwość po podłączeniu wzorcowego kondensatora i np badanej cewki. Mniejsza o metodę pomiaru. Najpierw chcę mierzyć po prostu częstotliwość generatora. Założyłem ze impulsy zliczane będą przez przerwanie INT0. Wprowadziłem twoje poprawki odnośnie odmierzania czasu przez TIMER1 ale na LCD mam wynik który nijak ma się do rzeczywistości tzn jak na wejście INT0 podam np sygnał z generatora który podaje przebieg np 4.8KHz to na wyświetlaczu pojawia mi się liczba 11136 zamiast 4800. Co może być nie tak ? Poniżej podaję listing programu.
    
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Portd = &B00100100                        
    Portb = &B00000000
    
    Config Timer1 = Timer , Prescale = 1
    Config Lcd = 16 * 2                                       
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portd.6 , Rs = Portd.4
    'Deflcdchar 0 , 32 , 32 , 17 , 17 , 17 , 14 , 16 , 32
    Config Int0 = Rising
    
    On Timer1 Przepelnienie_timera
    On Int0 Licznik
    
    Dim Impulsy As Long
    Dim B As Integer
    Dim Ile As String * 16
    
    Load Timer1 = 60000
    
    Enable Timer1
    Enable Interrupts
    Stop Timer1
    
    Cls
    Cursor Off Noblink
    Locate 1 , 5
    Lcd "Miernik"
    Locate 2 , 2
    Lcd "Indukcyjnosci"
    Waitms 500
    Cls
    Impulsy = 0
    B = 1
    Start Timer1
    Enable Int0
    
    Do
    Loop
    End
    
    Przepelnienie_timera:
     If B = 200 Then
      Disable Int0
      Stop Timer1
      Lcd "                "
      Ile = Str(impulsy)
      Lowerline
      Lcd "f=" ; Ile
      Impulsy = 0
      B = 0
      Waitms 50
     End If
     Incr B
     Load Timer1 = 60000
     Start Timer1
     Enable Int0
    Return
    
    Licznik:
     Incr Impulsy
    Return
    
  • #6 6308958
    janbernat
    Poziom 38  
    W przerwaniu:
    Przepelnienie_timera obsługujesz LCD.
    To jest bardzo czasochłonne.
  • #7 6310450
    Konto nie istnieje
    Poziom 1  
  • #8 7982834
    lotnick
    Poziom 15  
    Sorki za odgrzewanie starego tematu, ale dodam jedno.
    Miałem problemy w BASCOMie z timerem.
    Problem dotyczył instrukcji LOAD TIMER0,wartość.
    Tak jak wiele osób używałem LOAD TIMER0=wartość.
    Dzięki temu tematowi rozwiązałem kilkugodzinny kłopot.
    Nie wiem dlaczego kompilator nie sygnalizuje błędu.
    Jakby ktoś nie zauważył różnicy to napiszę słownie: "nie używać znaku równości zamiast przecinka".
REKLAMA