Egy kis segítséget szeretnék kérni!
ATMega88P 14,7456MHz-es kristállyal, a T1 bemenetre kapcsolva egy 4MHz-es TTL négyszögjel.
Joda olvtárs programját átírva a fenti hw-re a kijelzőn 2,23MHz jelenik meg.
Ha beállítom a fusebiteknél a belső 8 megás órajelet, 3,93MHz-et mér a progi. Vagyis, a programnak "túl gyors" a 14,7456MHz.
Valamit módosítanom kell Joda programjában, hogy a nagyobb órajellel is pontos eredményt kapjak.
De mit módosítsak, és mire?
Előre is köszönöm a segítséget!
Frekvencia mérés
DivClk8 kikapcsolva.
Az eredeti program 8MHz-es órajellel megy. A belső oszcillátorra kapcsolok, azzal a korrekt értéket írja ki a program. Átírom az órajelet a programban 14745600-ra, átváltok kvarca, és alacsonyabb frekit ír ki a program.
Szerintem itt van az eb elhantolva. A Timer0 számlálásánál a 122-őt módosítva más frekvenciát ad eredményül a program. Egyáltalán, hogyan jött ki, hogy 8 megánál 122-őt kell számolni, és utána megnézni a Timer1 számláló értékét? Sorry, de a Timer-ekkel nem igazán dolgoztam eddig.
Az eredeti program 8MHz-es órajellel megy. A belső oszcillátorra kapcsolok, azzal a korrekt értéket írja ki a program. Átírom az órajelet a programban 14745600-ra, átváltok kvarca, és alacsonyabb frekit ír ki a program.
Kód: Egész kijelölése
Timer0_isr:
Incr Count
If Count = 122 Then
Stop Timer1
Stop Timer0
Count = 0
Timer0 = 0
Timer0_flag = 1
If Count_t1 > 0 Then
Timer1_flag = 1
End If
End If
Return
A biztonság kedvéért beteszem a saját hardveremre módosított programot, bár túl sok különbség nincs az eredetihez képest. Picit módosítottam a kiíró rutint, hogy több helyiérték jelenjen meg.
Kód: Egész kijelölése
$regfile = "m88pdef.dat"
$crystal = 14745600
'$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32
Ddrb.5 = 0
Portd.5 = 1
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Initlcd : Cls
Locate 1 , 1
Lcd "OK!"
Wait 1
Cursor Off
' 3,9992MHz multiméterrel mérve a T1 lábon
Config Timer1 = Counter , Edge = Rising
Config Timer0 = Timer , Prescale = 256
Enable Ovf0
Enable Ovf1
On Ovf0 Timer0_isr
On Ovf1 Timer1_isr
Dim Count As Word
Dim Timer0_flag As Bit
Dim Timer1_flag As Bit
Dim Frequency As Single
Dim Metric As String * 3
Dim Frequency_str As String * 6
Dim Count_t1 As Single
Frequency = 0
Count_t1 = 0
Timer0_flag = 0
Timer1_flag = 0
Cursor Off
Cls
Enable Interrupts
Do
If Timer0_flag = 1 Then
Timer0_flag = 0
If Timer1_flag = 1 Then
Incr Count_t1
Frequency = Count_t1 * 65536
Locate 3 , 1 : Lcd Count_t1
Timer1_flag = 0
Count_t1 = 0
Else
Frequency = Timer1
End If
'================= Freki Hz =====================
If Frequency < 1000 Then
Metric = "Hz"
Frequency_str = Fusing(frequency , "###.######")
End If
'================================================
'================= Freki KHz ===================
If Frequency > 999 And Frequency < 999999 Then
Metric = "KHz"
Frequency = Frequency / 1000
Frequency_str = Fusing(frequency , "###.######")
End If
'===============================================
'================= Freki MHz =========================
If Frequency > 999999 And Frequency < 999999999 Then
Metric = "MHz"
Frequency = Frequency / 1000000
Frequency_str = Fusing(frequency , "###.######")
End If
'======================================================
Locate 1 , 1
Lcd "f=" ; Frequency_str
Locate 1 , 12
Lcd Metric
Timer1 = 0
Start Timer0
Start Timer1
End If
Loop
Timer0_isr:
Incr Count
If Count = 122 Then
Stop Timer1
Stop Timer0
Count = 0
Timer0 = 0
Timer0_flag = 1
If Count_t1 > 0 Then
Timer1_flag = 1
End If
End If
Return
Timer1_isr:
Incr Count_t1
Return
End
Sejtettem, hogy az "If Count = 122 Then"-ben lévő érték a kulcs a megoldáshoz. Számolgatni kezdtem.
Eredeti program alapján: (256/8MHz)*122 = 0,003904
Módosítás: (256/14,7456MHz)*225 = 0,00390625
(256 a Timer0 előosztása).
A kettő között van némi eltérés, de a 225-tel jött ki a legközelebbi eredmény. Így 4,063232 MHz-et mér a program, ami azért meglehetősen közel áll a valósághoz.
Eredeti program alapján: (256/8MHz)*122 = 0,003904
Módosítás: (256/14,7456MHz)*225 = 0,00390625
(256 a Timer0 előosztása).
A kettő között van némi eltérés, de a 225-tel jött ki a legközelebbi eredmény. Így 4,063232 MHz-et mér a program, ami azért meglehetősen közel áll a valósághoz.