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 mukrokontrolerach, a artukule jest 89C2051 a ja chcaiłem to zrobić na attiny i wynik pokazywać na wyświetlaczu alfa numerycznym. Jednak coś mi nie wychodzi. Odpalam układ na sucho tzn. wejście z cewki zapłonowej przykładam do +5V z częstotliwością kika raz na sek a na wyświetlaczy pokazuje 0.
Czy może ktoś sprawdzić mi program?
Kod "mojego" programu
W załączniku oryginalny program autorstwa p. Marcina Wiązania oraz artykuł z EDW.
Będę wdzięczny za wszelkie wskazówki.
Pozdrawiam
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 mukrokontrolerach, a artukule jest 89C2051 a ja chcaiłem to zrobić na attiny i wynik pokazywać na wyświetlaczu alfa numerycznym. Jednak coś mi nie wychodzi. Odpalam układ na sucho tzn. wejście z cewki zapłonowej przykładam do +5V z częstotliwością kika raz na sek a na wyświetlaczy pokazuje 0.
Czy może ktoś sprawdzić mi program?
Kod "mojego" programu
'Samochodowy obrotomierz
'Marcin Wiązania
'E-mail: mwiazani@poczta.fm
$regfile = "attiny2313.dat"
$crystal = 12000000
'Config Timer0 = Timer , Gate = Internal , Mode = 1
Config Timer1 = Timer ', Gate = Internal , Mode = 1
On Timer1 Zw_licz_czasu 'przerwonia obslugi przpelnienia timera0
'On Timer1 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 Timer1
Enable Int1
'Counter1 = 61800 'wartosc poczatkowa timera1
Start Timer1
Wynik = 0
Set Zez_pom
Reset Pom_zak
Br_syg = 0
Enable Interrupts
Locate 2 , 1
Lcd "Test"
Wait 1
Cls
Do
'petla glowna programu
If Pom_zak = 1 Then 'jezeli pomiar zakonczony to
Disable Timer1 'zablokuj timer0
Temp = Counter1 'odczytaj wartosc timera0
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
Locate 2 , 1
Lcd Wynik
End If
Loop 'koniec petli glownej programu
End
Zw_licz_czasu: 'przerwanie przepelnienia timera0
Zm_pom = Zm_pom + 65536 '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
Counter1 = 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
' If Br_syg <> 65 Then 'jezeli br_syg<>65 to
' Incr Br_syg 'zwieksz wartosc zmiennej br_syg
' End If
' Counter0 = 61800 'wartosc poczatkowa timera1
' Start Timer0
'
' Locate 2 , 1
' Lcd Wynik
' Set Gr1 'wylacz wszystkie grupy diod led
' Set Gr2
' Set Gr3
' Set Gr4
' Set Gr5
' Select Case Nr_gr_led ' zaleznosci od numeru grupy diod led wykonaj
' Case 1 :
' Call Przel_gr1 'wywolaj podprogram obslugi grupy1
' P1 = Gr(1) 'wystaw wartosc zmiennej gr(1) na port P1
' Reset Gr1 'wlacz grupe 1
' Case 2 : 'dla grupy 2 itd
' Call Przel_gr2
' P1 = Gr(2)
' Reset Gr2
' Case 3 :
' Call Przel_gr3
' P1 = Gr(3)
' Reset Gr3
' Case 4 :
' Call Przel_gr4
' P1 = Gr(4)
' Reset Gr4
' Case 5 :
' Call Przel_gr5
' P1 = Gr(5)
' Reset Gr5
' End Select
' Incr Nr_gr_led 'zwieksz zmienna okreslajaca numer grupy
' If Nr_gr_led = 6 Then 'jezeli zmienna = 6 to
' Nr_gr_led = 1 'zapisz do niej wartosc 1
' End If
'Return
W załączniku oryginalny program autorstwa p. Marcina Wiązania oraz artykuł z EDW.
Będę wdzięczny za wszelkie wskazówki.
Pozdrawiam