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

Attiny2313 problem z obrotomierzem [Bascom]

514242 27 Sty 2010 20:45 4668 22
  • #1 7602538
    514242
    Poziom 20  
    Witam.
    Próbuję zrobić prosty obrotomierz do samochodu na Attiny2313.
    Do testów z jednego Attiny2313 zrobiłem prosty "generator" 100Hz
    Kod:
    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    
    Config Pinb.0 = Output
    
    Config Timer1 = Timer , Prescale = 1
    Timer1 = 45536
    
    On Timer1 Czas
    Enable Timer1
    Start Timer1
    Enable Interrupts
    
    Portb.0 = 0
    Do
    
    Loop
    
    Czas:
    Toggle Portb.0
    Timer1 = 45536
    Return


    Sygnał z "generatora" podawany jest na drugi Attiny2313.
    Timer1 wykorzystany jest do odliczania czasu 1 sekundy a timer0 zlicza impulsy z "generatora". Na wyświetlaczu pokazuje się wynik 100 (czasami 99) co jest prawidłowe.
    Problem jest taki, że czasami zamiast wyniku nie pokazuje nic, czasem układ się resetuje, innym razem na wyświetlaczu pokazują się "krzaki". Po czym znowu pokazuje prawidłową wartość.

    Program wygląda tak:
    
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Timer1 = Timer , Prescale = 256
    Config Timer0 = Counter , Edge = Falling
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2
    Cursor Off
    Cls
    
    Timer0 = 0
    Start Timer0
    Timer1 = 18661
    Enable Timer1
    Start Timer1
    Start Timer0
    Enable Interrupts
    
    On Timer1 Licz_imp
    
    Dim Wynik As Word
    Dim Flaga As Bit
    
    Reset Flaga
    Wynik = 1
    Locate 1 , 8
    Lcd "obr/min"
    
    Do
    
       If Flaga = 1 Then
       Locate 1 , 3
       Lcd Wynik ; "  "
       End If
       Reset Flaga
    Loop
    
    Licz_imp:
    
       Stop Timer0
       Wynik = Timer0
    
    '   Load Timer1 , 46875
       Timer1 = 18661
       Timer0 = 0
       Start Timer1
       Start Timer0
       Set Flaga
    
    Return


    Całość jest złożona na płytce uniwersalnej. Gdy załaduję program do mrugania diodą i zwiększającej się liczby na wyświetlaczu to całość działa stabilnie, więc podejrzewam, że z tym mają coś wspólnego timery.

    Pin RESET podłączony do masy przez kondensator 100n i do +5V przez rezystor 4,7k.

    I jeszcze ustawienia fusebitów
    Attiny2313 problem z obrotomierzem [Bascom]

    Co mogę zrobić, żeby wynik był stabilny?
  • #2 7602709
    marco47
    Poziom 41  
    A dlaczego masz dwa razy podawany wyświetlacz
  • #3 7602930
    janbernat
    Poziom 38  
    Dodaj komentarze- co gdzie chcesz zrobić.
    Bo nie rozumiem po co Ci Timer1 skoro wynik masz z Timer0.
  • #4 7602946
    514242
    Poziom 20  
    @marco47
    Nie rozumiem twojego pytania.

    @janbernat
    Timer1 służy do odmierzania 1 sek. Po tym czasie następuje przerwanie, w którym liczba zliczonych impulsów (przez timer0) przepisywana jest do zmiennej wynik.
  • #5 7603061
    marco47
    Poziom 41  
    Chodzi o ten kawałek , możesz go połączyć (sam kod wyświetlania napisów)
    Locate 1 , 8
    Lcd "obr/min"
    
    Do
    
       If Flaga = 1 Then
       Locate 1 , 3
       Lcd Wynik ; "  "
  • #6 7603153
    514242
    Poziom 20  
    Tekst "obr/min" na wyświetlacz podaję tylko na początku, a w pętli głównej podaję tylko wynik.
  • #7 7603180
    janbernat
    Poziom 38  
    Komentarze nie są dla nas- tylko dla Ciebie.
    
      $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Timer1 = Timer , Prescale = 256
    Config Timer0 = Counter , Edge = Falling
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2
    Cursor Off
    Cls
    
    Timer0 = 0
    Start Timer0
    Timer1 = 18661
    Enable Timer1                 'może niepotrzebne- ale nie ma enable Timer0
    Start Timer1
    Start Timer0
    Enable Interrupts
    
    On Timer1 Licz_imp            ' czyli sprawdzaj co 1s
    
    Dim Wynik As Word             ' wynik jest z Timer0- 8 bit czyli byte- po co Word
    Dim Flaga As Bit
    
    Reset Flaga
    Wynik = 1
    Locate 1 , 8
    Lcd "obr/min"
    
    Do                            'To się wykonuje dosyć szybko
    
       If Flaga = 1 Then
       Locate 1 , 3
       Lcd Wynik ; "  "
       End If
       Reset Flaga
    Loop
    
    Licz_imp:                     'tu przerwanie do sprawdzania co 1s
    
       Stop Timer0                ' co 1s zatrzymujemy Timer0- ciekawe ile się w tym czasie obrócił od 0 do 255
       Wynik = Timer0
    
    '   Load Timer1 , 46875
       Timer1 = 18661
       Timer0 = 0
       Start Timer1
       Start Timer0
       Set Flaga
    
    Return
  • #8 7603223
    marco47
    Poziom 41  
    Ale jeżeli z jakiejś przyczyny (błąd itp.) zniknie napis "obr/min" to jak go odświeżysz w pętli głównej
  • #9 7606010
    514242
    Poziom 20  
    @janbernat
    Polecenie Enable Timerx włącza źródła przerwań. Przerwanie od Timer0 nie jest mi potrzebne.
    Wynik będzie podawany w obr/min, więc 255 to za mało ( to ma działać w samochodzie).
    Zliczenie 255 impulsów/sek odpowiada 10200 obr/min w Tico.

    Dodano po 26 [minuty]:

    Przeniesienie całej obsługi wyświetlacza do pętli głównej nie naprawiło problemu
    
    Do
    
       If Flaga = 1 Then
       Cls
       Locate 1 , 3
       Lcd Wynik ; "  "
       Locate 1 , 8
       Lcd "obr/min"
       End If
       Reset Flaga
    Loop
  • Pomocny post
    #10 7606499
    Krauser
    Poziom 26  
    Możliwe, że to na wyrost, ale możesz spróbować:

    Dim tempW as Word
    '...
    Do
       If Flaga = 1 Then
       Reset Flaga
       Cls
       Locate 1 , 3
       tempW=Wynik
       Lcd tempW ; "  "
       Locate 1 , 8
       Lcd "obr/min"
       End If
    Loop


    Rzecz w tym, że nie wiadomo co się dzieje gdy używasz Lcd Wynik. Taki urok Bascoma. Do wyświetlacza wysyłane są połówki bajtów, a jeśli wtedy wystąpi przerwanie to Wynik się zmieni i być może drugi półbajt będzie nie ten co powinien. Możliwe jednak że twórca zabezpieczył tą procedurę i to nic nie pomoże.
  • #11 7607073
    514242
    Poziom 20  
    Zrobiłem tak jak sugerował Krauser. Teraz nie ma już przypadkowych wyników. Nadal jednak czasami pokazuje 1 (wartość początkowa zmiennej wynik) i układ się resetuje.
  • Pomocny post
    #12 7608246
    arktik1
    Poziom 27  
    Chyba najprostszy jaki można napisać.
    
    Dim Wynik As Long
    
    
    Config Timer0 = Counter , Edge = Rising
    
    
    Do
    Timer0 = 0
    Start Timer0
    Wait 1
    Stop Timer0
    
    Wynik = Timer0 * 50      'to przykład może być *50,20,1...
    Locate 1 , 1
    Lcd Wynik
    Locate 1 , 5
    Lcd "rpm"
    
    
    Loop
    End
    
  • #13 7616573
    514242
    Poziom 20  
    Objawy dalej takie same. Zaczynam podejrzewać, że mikrokontrolery mam uszkodzone.

    Dodano po 14 [minuty]:

    I jeszcze taka ciekawostka: gdy wyjmę z podstawki uP, który pełni rolę "generatora" po włączeniu całości na wyświetlaczu pokazuje wynik 50.
    Skąd to się bierze?
  • #14 7616732
    marco47
    Poziom 41  
    Kolego , trochę dociekliwości w poszukiwaniu odpowiedzi na nurtujące Ciebie pytania . Zastanów się trochę sam , a dojdziesz do odpowiedzi: dlaczego? .
    Przecież z każdą głupotą nie będziesz leciał na forum .
  • Pomocny post
    #15 7617480
    Konto nie istnieje
    Poziom 1  
  • #16 7622445
    514242
    Poziom 20  
    Są niewielkie postępy.
    Zrobiłem tak jak powiedział e marcus i po odłączeniu sygnału już jest 0 :)

    Problem z resetowaniem się układu i "krzakami" na LCD leży po stronie płytki. Całość na razie złożona jest na płytce uniwersalnej gdzie był taki układ resetu:
    Attiny2313 problem z obrotomierzem [Bascom]
    Po usunięciu diody jest dużo lepiej (czasami tylko zdarzy się nie wyświetlić nic), ale myślę, że jak już zaprojektuję płytkę i polutuje wszystko to będzie ok.
    Teraz czas na układ wejściowy. Chcę posłużyć się tym
    Attiny2313 problem z obrotomierzem [Bascom]
    Jako źródła sygnału użyję transformatora z mostkiem Graetz'a (bez kondensatora wygładzającego) i zobaczę co z tego wyjdzie.
  • #17 7622885
    marco47
    Poziom 41  
    To się bardzo mylisz myśląc że jak zaprojektujesz płytkę docelową to problemy same znikną . Po to testuje się układy na płytach testowych aby na tym etapie wyeliminować wszelkie niedociągnięcia .
  • #18 7633900
    514242
    Poziom 20  
    Po małej modyfikacji układu wejściowego pierwsze próby w samochodzie wypadły pomyślnie. Dziękuję wszystkim za zainteresowanie.
  • #20 8304596
    landy13
    Poziom 31  
    IMEX napisał:
    wany jest sygnał
    A cóż to znaczy?
  • #22 8305742
    landy13
    Poziom 31  
    Jeśli pytanie brzmi: "Gdzie podawany jest sygnał?" to odpowiadam: zapewne na wejście zliczające Timer0, co można wywnioskować z:
    Config Timer0 = Counter , Edge = Falling 
  • #23 10950205
    Luqu397
    Poziom 2  
    Witam! Przepraszam na odświerzenie tematu ale czy mógłbym prosić o cały schemat ? Schemat z Attiny i LCD
REKLAMA