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
ReturnSymulacja 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?
