Obrotomierz AVT2711 na attiny2313

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
muniek123
-
Posty: 2
Rejestracja: 16 lip 2009, 19:30
Lokalizacja: Bełchatów

Obrotomierz AVT2711 na attiny2313

Post autor: muniek123 » 16 lip 2009, 19:51

Witam.
Próbuję złożyć obrotomierz samochodowy na mikrokontrolerze Attiny2313.
Wykorzystuję do tego kit z AVT2711. Chciałem wykorzystać program z tego układu. Różnica jest w mikrokontrolerach, w artykule jest 89C2051 a ja chciałem to zrobić na attiny i wynik pokazywać na wyświetlaczu alfa numerycznym. Podłączenie w samochodzie jak na schemacie w artykule. Jednak coś mi nie wychodzi. Najczęściej pokazuje wynik 0 lub jakąś liczbę jedno czy dwu cyfrową. Bardzo rzadko jest to liczba trzycyfrowa.
Czy może ktoś sprawdzić mi program?

Tutaj kod programu przerobiony na moje potrzeby:

Kod: Zaznacz cały

'Samochodowy obrotomierz
'Marcin Wiązania
'E-mail: mwiazani@poczta.fm

$regfile = "attiny2313.dat"
$crystal = 12000000

Config Timer0 = Timer , Prescale = 1024                     'Gate = Internal , Mode = 1
Config Timer1 = Timer , Prescale = 1                        ', Gate = Internal , Mode = 1
Config Int1 = Falling


On Timer1 Zw_licz_czasu                                     'przerwonia obslugi przpelnienia timera0
On Timer0 Obs_wysw                                          'przerwanie od timer1 obslugujace wyswietlacz led
On Int1 Pomiar                                              'przerowania obslugi pomiaru

Dim Wynik As Word                                           'obliczony wynik predkosci RPM
Dim Temp As Word                                            'zmienna pomocnicza do obliczen
Dim Zm_pom As Long                                          'zmienna przechowujaca ilosc zliczonych impulsow podczas jednego obrotu
Dim Zez_pom As Bit                                          'flaga zezwolenia na pomiar
Dim Pom_zak As Bit                                          'flaga informujaca o zakonczeniu pomiaru
Dim Licz_czas As Byte                                       'pomocniczy licznik czasu
Dim Br_syg As Byte                                          'zmienna licznikowa graku impulsow na wejsciu
'----------------Wyswietlacz-------------------------------------------
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

Cls
Cursor Off


'Priority Reset Timer0
'Set Tcon.2
'Disable Int0
Enable Interrupts
Enable Timer1
Enable Timer0
Enable Int1
Timer0 = 0                                                  'wartosc poczatkowa timera1
Start Timer0
Wynik = 0
Set Zez_pom
Reset Pom_zak
Br_syg = 0




Do
                                                        'petla glowna programu
  If Pom_zak = 1 Then                                       'jezeli pomiar zakonczony to
     Disable Timer1                                         'zablokuj timer0
 '   Temp = Counter1                                         'odczytaj wartosc timera0
     Temp = Timer1
    Zm_pom = Zm_pom + Temp                                  'dodaj ja do wartosci zmiennej zm_pom
    Temp = 60000000 / Zm_pom                                'oblicz predkosc ze wzoru 60*1MHz/zm_pom
 '   If Jp = 0 Then                                          'jezeli zwora zalozona to podziel
      Temp = Temp / 1.5                                     'wynik przez 2 gdy na obrot przypadaja dwa zaplony
  '  End If
    Wynik = Temp
                                             'zapiasz wynik do zmiennej wynik
    Reset Pom_zak                                           'zeruj flage zezwolenia na obliczenie predkosci
    Set Zez_pom                                             'ustaw flage zezwalajaca na pomiar
    Zm_pom = 0                                              'wyzeruj zmienne
    Licz_czas = 0
    Enable Timer1



  'Else                                                      'w przeciwnym wypadku
 '   If Wynik > 0 And Br_syg = 65 Then                       'jezeli wynik >0 oraz wartosc br_syg=65 to
 '     nop
 '     nop
 '     nop
 '     Decr Wynik                                            'zmniejsz zmienna wyniku
 '   End If
  End If


Loop                                                        'koniec petli glownej programu
End

Zw_licz_czasu:
                                                            'przerwanie przepelnienia timera0
Zm_pom = Zm_pom + 65535                                     'dodaj wartosc 65536 (licznik pracuje jako 16-bitowy)
  Incr Licz_czas                                            'zwieksz zmienna licz_czas
  If Licz_czas = 10 Then                                    'jezeli wartosc tej zmiennej osiagnie 10 to
    Stop Timer1                                             'zatrzymaj timer0
    Set Zez_pom                                             'ustaw flage zezwolenia na pomiar
    Br_syg = 0                                              'wyzeruj zmienna br_syg
  End If
Return

Pomiar:                                                     'przerwanie od wejscia int1
  If Zez_pom = 1 Then                                       'jezeli flaga zezwolenia pomiaru ustawiona to
    Timer1 = 0                                              'wyzeruj timer0
    Start Timer1                                            'start timer0
    Reset Zez_pom                                           'wyzeruj flage zezwolenia na pomiar

  Else                                                      'w przeciwnym wypadku
    Stop Timer1                                             'zatrzymaj timer0
    Set Pom_zak
                                                 'ustaw flage pomiar zakonczony
  End If
  Br_syg = 0
Return

Obs_wysw:                                                   'przerowanie od timer1 obslugujace multipleksowanie wyswietlacza

  Timer0 = 0
  Start Timer1

  Cls
  If Wynik > 1000 Then
  Locate 2 , 1
  Lcd Wynik
  Else
  Locate 2 , 2
  Lcd Wynik
  End If

Return
Oryginalny program i artykuł z Edw tutaj

Symulacja działa prawidłowo.
Całość narazie zmontowana na płytce uniwersalnej.
Ma ktoś jakieś pomysły co należy zrobić, żeby to działało prawidłowo?

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 16 lip 2009, 20:37

Możliwe, że nie przestawiłeś fuse bitów, więc procesor nadal chodzi na wewnętrznym zegarze 8Mhz/8= 1Mhz.

Sprawdź, czy bez rezonatora też działa (nie powinien).

muniek123
-
Posty: 2
Rejestracja: 16 lip 2009, 19:30
Lokalizacja: Bełchatów

Post autor: muniek123 » 19 lip 2009, 8:16

Niżej screen z ustawień fuse bitów
Obrazek

W tygodniu może uda mi się pożyczyć oscyloskop to sprawdzę jak wyglądają impulsy na wyjściu układu 74htc123

ODPOWIEDZ