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

[AtTiny2313]-Miernik częstotliwości - problem

nouki 05 Lut 2009 15:19 3881 14
  • #1 6106550
    nouki
    Poziom 25  
    Witam.

    Zakupiłem sobie pcb do zestawu Avt 3003 i po zmontowaniu pojawił się problem mianowicie.
    Pomiar do wartości mniej niż 200 kHz jest ok a jak uzyska się tą granice lub poda więcej na wejście podaje bzdury.
    W spisie jest 74s00 zastosowałem 74hc00n
    74s74 zastosowałem 74hc74b1
    Schemat i opis w załączniku.

    Program
    
    
    $regfile = "attiny2313.dat"
    $crystal = 10000000
    Config Lcd = 16 * 1a
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    Dim Ccount As Byte
    Dim Maincounter As Long
    Dim C_counter As Word
    Dim Flag1 As Bit
    Dim Flag2 As Word
    Dim Tuning As Word
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    Config Pind.4 = Input
    Config Pind.5 = Input
    Config Pind.6 = Output
    Config Pinb.0 = Output
    Load Timer0 20
    Declare Sub Frequency
    Declare Sub Events
    S1 Alias Pind.1
    S2 Alias Pind.0
    S3 Alias Pind.3
    S4 Alias Pind.4
    Set Portd.6
    Tuning = 4844
    Flag2 = 1
    Call Frequency
    Cls
    Sub Frequency
    Config Timer0 = Timer , Prescale = 8
    Config Timer1 = Counter , Edge = Falling , Noice Cancel = 1
    C_counter = 0
    Set Portd.6
    Cls
    Cursor Off
    
    Enable Timer0
    Enable Interrupts
    On Timer0 Timint
    Enable Timer1
    Ccount = 0
    On Timer1 Int_0
    Start Timer0
    Start Timer1
    Timer1 = 0
    Do
    Set Pind.1
    Debounce Pind.1 , 0 , Main , Sub
    Loop
    End Sub
    
    
    Timint:
    Incr C_counter
    If C_counter = Tuning Then
    Stop Timer1
    Stop Timer0
    Maincounter = Ccount * 65536
    Maincounter = Maincounter + Timer1
    If Maincounter = 1 Then
    Maincounter = 0
    End If
    If Maincounter < 30000 Then
    If Portd.6 = 1 Then
    Reset Portd.6
    End If : End If
    
    If Maincounter > 4500000 Then
    If Portd.6 = 0 Then
    Set Portd.6
    End If : End If
    If Maincounter = 0 Then
    Set Portd.6
    End If
    If Portd.6 = 1 Then
    Maincounter = Maincounter / 31
    End If
    Ccount = 0
    If Portd.6 = 0 Then
    Tuning = 4884
    Else
    Tuning = 4844
    End If
    
    Timer0 = 0
    Cls
    If Portd.6 = 0 Then
    Lcd "F [Hz]="
    Else
    Lcd "F[kHz]="
    End If
    Locate 2 , 1
    Lcd "          "
    Locate 2 , 1
    Lcd Maincounter ;
    Locate 2 , 8
    Lcd "*"
    Waitms 200
    Locate 2 , 8
    Lcd " "
    C_counter = 0
    Maincounter = 0
    Timer1 = 0
    Start Timer0
    Start Timer1
    End If
    Return
    
    Int_0:
          Incr Ccount
    Return
    
    Main:
    Disable Timer0
    Incr Flag2
    If Flag2 > 2 Then
    Flag2 = 1
    End If
    
    Select Case Flag2
    Case 1 : Call Frequency
    Case 2 : Call Events
    End Select
    Return
    
    Sub Events
    Cls
    Stop Timer1
    Locate 2 , 7
    Lcd "E."
    Wait 1
    Counter1 = 0
    Do
    
    Debounce Pind.1 , 0 , Main , Sub
    Home
    Lcd Counter1
    Set Portd.3
    If Pind.3 = 0 Then Counter1 = 0
    Set Portd.4
    If Pind.4 = 0 Then Stop Timer1
    Set Portd.0
    If Pind.0 = 0 Then Start Timer1
    If Counter1 > 64000 Then Counter1 = 0
    
    
    
    Loop
    End Sub
    
    


    Dzięki za pomoc
  • #2 6106678
    mesa
    Poziom 11  
    Czy zwróciłeś uwagę, że zastosowane przez Ciebie elementy HC, mają znacznie dłuższe czasy reakcji (pojedyncze nanosekundy vs. kilkanaście ns)
    co może mieć wpływ przy próbach pomiaru większych częstotliwości?
  • #3 6106699
    nouki
    Poziom 25  
    Sądzę że to nie jest ta granica na której to by się objawiało - oczywiście mogę się mylić.
    Układy 74Sxxx są trudno dostępne.

    Układ 74hc00 jest wolniejszy( 4ns) ale 74hc74 już nie.
  • #4 6106784
    sp3ots
    Poziom 38  
    Witam !
    Jeśli dałeś ATtiny2313 to trzeba zmienić dwa fuse bity
    C na 1
    A987 na 1110
    Pozdrawiam. Stefan amator GG6293398
    Moderowany przez zumek:

    Dlaczego kolega z góry zakłada - niesłusznie zresztą , że uC w tym kicie, taktowany jest rezonatorem kwarcowym :?:

  • #6 6107121
    zumek
    Poziom 39  
    Odznacz jeszcze CKDIV8.
  • #7 6107787
    nouki
    Poziom 25  
    odznaczone nic nie zmienia. Wymiana układów też nic nie wniosła.
    Nadal jest tak samo 199999 jest ok o jeden Hz więcej i zaczyna sie problem:)
    Układ działa z generatorem 10Mhz przysłano mi tak z serwisu Avt bym ustawił Fuse jak ustawiam.
    Problem też polega na tym że programuje to pony progiem tak więc jak raz ustawie w takiej konfiguracji Fuse to już programator nie widzi procesora :) A bardziej normalny programator dopiero powstaje:)
  • #8 6108384
    Konto nie istnieje
    Poziom 1  
  • #9 6108827
    janbernat
    Poziom 38  
    Dzisiaj na stronie elportalu znalazłem komentarz na
    temat bascoma i ATtiny.
    Bascom nie obsługuje prawidłowo ATtiny.
    Start Timer0 czy stop Timer0 nie działa (przynajmniej dla ATtiny2313).
    Trzeba wpisać do odpowiedniego rejestru właściwą wartość żeby timer wystartował itp.
    Trzeba się zapoznać z dokumentacją.
    Rejestry sterujące timerami są podzielone na części pod różnymi adresami-i tego nie obsługuje bascom.
    Parę miesięcy temu umieściłem na elektrodzie
    program do obsługi PWM na ATtiny2313.
    W bascomie, ale trochę przypomina asembler.
    Ale są komentarze.
    Dr_Vee chyba też o tym gdzieś pisał.
    Że nie ma zaufania do tego co z timerami robi bascom.
    Ma rację, ale to nie powinno być "brak zaufania" tylko wpuszczanie w maliny.
    PS.
    Mam pełną wersję bascoma i początkowo mnie to zirytowało- no ale za te pieniądze...
    Kup sobie IAR-ale jest to C.

    Dodano po 1 [minuty]:

    No i trochę drożej...
  • #10 6108965
    Konto nie istnieje
    Poziom 1  
  • #11 6109021
    janbernat
    Poziom 38  
    1.11.9.2 -nie działa(w pełni) na ATtiny.
    A sprawdziłeś PWM?
    A która wersja nie działa na AEmega88?
    Bo mam cos na niej robić.
  • #12 6109058
    Konto nie istnieje
    Poziom 1  
  • #13 6109227
    janbernat
    Poziom 38  
    Ale odpowiedzi dla nouki?
    W Bascomie można wstawić wartości do rejestrów,
    niekoniecznie w asemlerze.
    Ja to robiłem tak:

    Set Tccr1b.cs10 'start timer1
    Else 'a jak nie
    Czas = Timer1 'odczytaj czas (liczbę zliczonych impulsów) z timer1
    Reset Tccr1b.cs10 'zatrzymaj licznik
    Timer1 = 0 'wyzeruj licznik(żeby po następnej zmianie wyjścia komparatora mógł liczyć od początku)
    Spróbuj to wstawić zamiast start i stop Timer1.
    A dla Timer0 sprawdź w dokumentacji ATtiny.
    Bo tego nie pamiętam.
  • #14 6109521
    Michał_z1
    Poziom 16  
    witam.
    Zastosuj zwykłe TTL, 7400 i 7474 bez żadnych literek, trochę prądożerne ale za to wydajne. TTL jest o dużo szybszy niż taki sam układ w wersji CMOS.
    POZDRO.
  • #15 6110512
    nouki
    Poziom 25  
    Zmiana Fese nic nie daje jak pisałem. Starałem się uruchomić preskalery pozostałe dając 10-20mHz ale nic sie nie zmienia.
    Bramki mam też stare Cemi jeszcze ale też się dzieje tak samo.

    Ciekawostka - jak liczy impulsu to działa na częstotliwości więcej niż 200kHz - widzę zmianę miedzy 10 - 100 -200 - 500 kHz w naliczaniu.



    p.s

    .... BASCOMie Timery w ATTiny2313 działają.....

    Skoro by nie działały to czemu by liczył prawidłowo do tej wartości.To chyba nie jest możliwe?
    Dodatkowo impulsy liczy prawidłowo z innym bardziej profesjonalnym sprzętem porównując do wartości 420kHz wyniki pokrywają się.
    Mege 88 stosowałem do sterownika widlaka jest trochę opisane gdzieś na elce i działa ok wszystko i nic sie nie dzieje złego do tej pory
    Bascom 1.11.9.0 mam
REKLAMA