Regulacja na impulsatorze obrotowym. Wszystko działa po właczeniu zasilania ale po dłuższej lub krótszej chwili wartość "Licznik" przestaje sie zmieniać mimo iż wyżej widać że procek przyjmuje impulsy i zmieniają sie na 2 pinach zera i jedynki. I nie wiem co jest grane - tak poprostu żeby przestawało liczyć
Procek Mega8515, dolne linijki tj. 5 i 6 wyświetlają wartości przyjmowane od procka mega8535. Przy "zawieszeniu" 5 linijka także przestaje odpowiadać mimo iż w 6 widać zmiany wartości poszczególnych bitów. Wydaje mi sie że właśnie ta cześć odpowiada za zawieszanie się - to odbieranie wartości z innego procka. Wartość "$crystal" podniesiona żeby przy pracy procka sobie troche obniżył prędkość pracy bo wyświetlac graficzny nie wyrabia i pojawiają sie kropeczki i paseczki (jest na to jakaś rada?). Co do samego impulsatora - ma ktoś może jakiś niezawodny kod żeby nie przepuszczało impulsów przy szybszych obrotach? Zmiany opóźniania mają swoje zalety i wady które i tak prowadzą do nieprawidłowego zliczania w różnych sytuacjach. Kombinacja z przerwaniami daje jeszcze dziwniejsze efekty
Kod dla mega8515:
Kod: Zaznacz cały
$regfile = "8515def.dat"
$crystal = 20000000
$lib "glcdKS108.lib"
$include "font8x8.font"
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 6 , Ce2 = 7 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 1 , Mode = 8 ' , Mode = 6
Cls
Config Int0 = Falling
Config Portd.5 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Portd = Output
Config Porta = Input
Config Portb.3 = Input
Config Portb.4 = Input
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Down
Portb.0 = 1
Portb.2 = 1
Dim A As Bit , B As Bit , A_ As Bit , B_ As Bit , E As Bit , F As Bit , G As Bit , H As Bit
Dim Licznik As Integer
Dim Napiecie As Single
Dim Licznik_wys As Byte
Dim Prad As Word
Dim Prad_ As Word
Enable Interrupts
Enable Timer1
Start Timer1
Enable Timer0
Start Timer0
On Timer0 Wyswietlanie
Setfont Font8x8
Do
A = Pinb.0
B = Pinb.2
If A_ = 1 And B_ = 0 Then
If A = 0 And B = 0 Then
Licznik = Licznik + 10 ' Incr Licznik
End If
If A = 1 And B = 1 Then
Licznik = Licznik - 10 'Decr Licznik
End If
End If
Pwm1a = Licznik
Waitms 4
A_ = A
B_ = B
Napiecie = 0.0048828 * Licznik
Prad = Pina
If Pinb.3 = 1 Then
Prad = Prad + 256
End If
If Pinb.4 = 1 Then
Prad = Prad + 512
End If
Prad_ = Prad
Prad = 0
Loop
Wyswietlanie:
Incr Licznik_wys
If Licznik_wys = 2 Then
Licznik_wys = 0
Cls
Lcdat 1 , 1 , Pinb.0
Lcdat 2 , 1 , Pinb.2
Lcdat 3 , 1 , Licznik
Lcdat 4 , 1 , Napiecie
Lcdat 5 , 1 , Prad_
Lcdat 6 , 1 , Pina.0
Lcdat 6 , 9 , Pina.1
Lcdat 6 , 17 , Pina.2
Lcdat 6 , 25 , Pina.3
Lcdat 6 , 33 , Pina.4
Lcdat 6 , 41 , Pina.5
Lcdat 6 , 49 , Pina.6
Lcdat 6 , 57 , Pina.7
Lcdat 6 , 65 , Pinb.3
Lcdat 6 , 73 , Pinb.4
End If
Return
Kod: Zaznacz cały
$regfile = "8535def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Prad As Word
Config Porta.0 = Input
Config Portc = Output
Config Portd = Output
Dim Prad_l(2) As Byte
Do
Prad = Getadc(0)
'Prad = 1023
Portc = Prad
Shift Prad , Right , 8
Portd = Prad
Waitms 1
Loop