Zanim przejrzałem ten temat, wymyśliłem coś takiego:
'Pokazuje ilość obrotów na minutę
'Pomiar co sekundę, wejście PB0...1
'Cls : Cursor Off
$baud = 19200
Dim Count(2) As Long , Last_state As Byte , Tmp As Byte
Config Timer1 = Timer , Prescale = 64 'do odmierzania 1 sek.
On Timer1 Co1sek
On Pcint Fan_int
Portb = 3 'podciąganie wejść kontroli obrotów
Last_state = Pinb And 3
Pcmsk = 3 'wejścia kontroli obrotów - ustawienie prerwań od pcint
Enable Interrupts
Enable Timer1 : Enable Pcint
Ddrb.7 = 1 'GND dla wentylatora
Do
Loop
Co1sek:
Timer1 = 3036 ' 65536-3036=62500, 62500*64[prescaler]*0,00000025s=1s
Print Count(1) ; " " ; Count(2)
Count(1) = 0
Count(2) = 0
Return
Fan_int:
Tmp = Last_state.0 + Pinb.0
If Tmp.0 = 1 Then
Incr Count(1)
End If
Tmp = Last_state.1 + Pinb.1
If Tmp.0 = 1 Then
Incr Count(2)
End If
Last_state = Pinb And 3
Return
Jakieś sugestie poprawek?
mirekk36 napisał: generalnie używasz przerwanie od PCINT i możesz sprawdzić w odpowiednim rejestrze, zdaje się, który pin zgłosił przerwanie.
W którym rejestrze, bo nie znalazłem?
mirekk36 napisał: Wtedy trzeba by odczytywać wartość kręcącego się timera żeby odczytać czas pomiędzy ostatnim impulsem dla danego pinu.
Myślisz, że lepiej mierzyć okres, niż liczyć ilość obrotów? Mamy 4 przerwania na obrót.
mirekk36 napisał: Taktowanie, no przydałoby się jakieś 16MHz albo 18.432MHz, żeby ci jeszcze RS pięknie chulał na dowolnej prędkości
Zaraz, programowo: 16MHz[kwarc]/1[prescaler]/256[timer 8 bit]/256[PWM 8 bit] wychodzi mi 244Hz...
mirekk36 napisał: A co do czujników temperatury to się już zastanów bo to wcale nie takie już obojętne, jeśli mają to być DS18B20 to będzie trzeba na super minimalny czas odczytu bajtu danych zatrzymywać przerwania.... eeee chociaż co tam, to przecież PWM dla wentylatorów a nie diod LED więc też chyba nie powinno być problemu.
Co do zatrzymywania przerwań to ja mam pewne obawy...