Frekvencia mérés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

HozzászólásSzerző: dummy » 2012. november 4. vasárnap, 11:29

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!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9973
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 4. vasárnap, 12:18

Ott overflow is lehet!


Hülye tipp:
A DivClk8-at kikapcsoltad?

Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

HozzászólásSzerző: dummy » 2012. november 4. vasárnap, 12:28

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.

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


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. :-(

Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

HozzászólásSzerző: dummy » 2012. november 4. vasárnap, 12:32

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

Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

HozzászólásSzerző: dummy » 2012. november 4. vasárnap, 12:53

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.


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég