Timer probléma

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Kiszedtem az LCD-t. Most így néznek ki a megszakítások:

Kód: Egész kijelölése

Tulcsordul:
  Stop Timer1
  Timer1 = Szamlalo
  Tulcsordulas = Tulcsordulas + 1
  Start Timer1
Return

Indit:
  Timer1 = Szamlalo
  Start Timer1
  Disable Int1
  Enable Int0
  Gifr = 64
Return

Allj:
  Stop Timer1
  Disable Int0
  Gosub Kiiras:
  Gifr = 128
Return
És ugyanaz a helyzet. :?

De érdekes dolgot fedeztem fel: írtam egy ilyen programot:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000

Config Timer1 = Timer , Prescale = 8


Config Lcd = 20 * 4 , Chipset = Ks077
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcdmode = Port

Dim Tm As Word



On Timer1 Tulcsordul



Enable Interrupts
Enable Timer1


Cls
Initlcd
Cls
Initlcd
Cursor Off

Lcd "Kesz!"

Timer1 = 0
Start Timer1

Do
Loop

End

Tulcsordul:
  Tm = Timer1
  Cls
  Lcd Tm
  Wait 3
Return
És a kijelző 7-et ír ki, vagyis lehet hogy csak akkor csinál megszakitást amikor a TIMER értéke már 7?
Bence
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Inkább már annyival túlpörgőt a timer mire kiolvasod.

A megszakítás végrehajtása előtt a verembe kerül a visszatérési cím. Ez alatt a timer tovább számol, kiolvasáskor ezt bekel kalkulálni. Vagyis ha 7 – 10 körüli értéket olvasol akkor valószínű még nem volt ideje a procinak léptetni a túlcsordulás számlálót.
A hozzászólást 2 alkalommal szerkesztették, utoljára kapu48 2009. június 25. csütörtök, 20:09-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Próbáld inkább így:
Timer1 Capture

A Timer1 konfigurálható ún. 'Capture' (kb. megfogás) módba is. Ez azt jelenti, hogy a Timer1 számolja a kontroller órajelét a meghatározott osztásviszony és az ICP bemeneten (PortD.6, 11. láb) impulzus érkezik a Timer1 regiszter tartalma a capture regiszterbe másolódik. Ezen az úton nagyon pontosan lehetséges mérni két impulzus közt eltelt időt.
http://avr.tavir.hu/modules.php?name=Co ... age&pid=18
:idea:
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Értem amit mondasz, de nekem az a +/- 10 nem számít (kb. +/- 0,00002 mp ami nagyon kevés), nekem az a bajom, hogy valamiért nem számítja a túlcsordulást az már 0,1 mp. Nem lehet, hogy az a baj hogy a timer csak 5-6. számolásnál csinál megszakítást és nem 0.-nál, mert ha már bent lenne a megszakításban akkor számolná a túlcsordulást. Amit én írtam ott a timer értéke 4 volt és nem volt túlcsordulás (pedig kellett volna lenni) vagyis nem volt megszakítás. Ha így működik ahogy írtam akkor lehetne úgy csinálni, hogy a végén amikor kiírja az időt, ha a timer értéke kevesebb mint 6 akkor hozzáad egyet a túlcsorduláshoz. Így elvileg működne, nem? Remélem érthető voltam.
Bence
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Elvileg igen.
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Na most megcsináltam úgy ahogy leírtam, és a következő a helyzet: beállítottam, hogy 40 túlcsordulás után állítsa le a mérőt. Bekapcsolom a két áramkört, mérés elindul, eltelik (elvileg) 40 túlcsordulásnyi idő, mérő megáll, érték 40 (úgy hogy mivel a timer kevesebb, mint 6 hozzáad 1-et).
Mérő és tesztelő visszaáll alaphelyzetbe (nem resetelek, magától) új mérés eredmény: 41 (vagyis most ha nem adna hozzá akkor jó lenne). Szóval lehet, hogy a mérő csak az első mérést csinálja rosszul? És csináltam még egy módosítást a mérőben (túlcsordulásnál a timer nem áll meg és így pontosabban mér, mert egy túlcsordulás pontosan 0,1 mp-ig tart):

Kód: Egész kijelölése

...

Const Szamlalo = 15535                                      

...

Tulcsordul:
  Timer1 = Szamlalo
  Tulcsordulas = Tulcsordulas + 1
Return

...
Átprogramozom a teszt áramkört, hogy először legyen 1 aztán 10, 40, 50, stb túlcsordulás és írom az eredményeket!

Szerk.:
Teszt áramkör: első mérés 30 túlcsordulás, második mérés 10 túlcsordulás. Eredmény (most a mérő nem ad hozzá még egy túlcsordulást, ha timer < 8 ): első mérés: 29 túlcsordulás, timer 7, második mérés: 11 túlcsordulás, timer 17. Vagyis megvan a hiányzó túlcsordulás (!) csak rossz helyen. :( Így érthető, hogy eddig mért csak az első mérés volt rossz. De miért adja hozzá a következő méréshez az előzőből hiányzó túlcsordulást?
Bence
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A megszakításban igaz nincs benne az LCD tölrlése? (CLS)?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

A vezérlő modulodban is lehet a hiba!

Kód: Egész kijelölése

 Tulcsordulas:
  Timer1 = Szamlalo
  Tulcsordulas = Tulcsordulas + 1
  If Tulcsordulas = 5 Then Goto Ide:                        'Ez itt nem jó! Igy a megszakításból szabálytalanul kilépsz!
  'Cls
  'Locate 2 , 1
  'Lcd Tulcsordulas
Return                                                      'Ez a return megszakításból tér vissza!




Ide:     ’Itt folytatod a megszakítást. Ez fölösleges ugrás volt! 
  Reset Portd.2
  Stop Timer1
  Waitms 10
  Set Portd.2
  Cls
  Lcd "Stop"
  Wait 5
Return                                                      'Ez a Return szubrutinból tér vissza. A 2-féle visszatérés nem ugyan az!
'És etöl a cseltől még az LCD kezelés benne maradt a megszakításban.
'Ami ezáltal olyan hosszú lesz, hogy minden ídőzítést elront.

:roll:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Más:
A 2 küllőn egységben levő számláló sosem lesz szinkronban.
Mert az indító és leállító rutinoknak is kel futás idő.
Ha INT0 előbb kapsz, mint Timer túlcsordulást. Akkor Timer megszakításnak meg kel várni az INT0 végét. (Pont ezt szabályozza a megszakítás végén levő Retun, ebben különbözik a közönséges Return-tól)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

TILOS interruptban hosszú dolgot tenni. max 2 szuám összeadása, jelzőbit bebillentés amit a főprogramban kiértékelsz!

Az LCD "STOP" ideje ~8-30 msec!!!!
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Köszi a segítséget! Működik! Az volt a baj amit kapu48 írt. A tesztprogramban ennyit módosítottam:

Kód: Egész kijelölése

...
Ennyitcs = 2
...
Do
  If Allj = 1 Then
    Reset Portd.2
    Stop Timer1
    Waitms 10
    Set Portd.2
    Cls
    Ennyitcs = Ennyitcs * 2
    Lcd "Stop"
    Allj = 0
    Wait 5
    Goto Ujmeres:
  End If
Loop

End

Tulcsordulas:
  Timer1 = Szamlalo
  Tulcsordulas = Tulcsordulas + 1
  If Tulcsordulas = Ennyitcs Then Allj = 1
Return
Így annyi túlcsordulást mér amennyit kell + a timer 17 (ami szerintem elhanyagolható, de lehetne úgy is csinálni, hogy a timer-ből kivonok 17-et). 128 túlcsordulásnál is jól mért, ami 12,8 mp és ennyire nem is nagyon van szükségem már.
Megszakításban nincs LCD (se törlés, se kiírás).
Bence
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

:D :wink:
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

Hozzászólás Szerző: kefeur »

Sziasztok.
Adott egy egyszerű kód :

Kód: Egész kijelölése

$regfile = "ATtiny13.dat"
$crystal = 9600000

Config Portb.0 = Output
Config Portb.1 = Input
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Input

Config Timer0 = Timer , Prescale = 1024

Config Int0 = Falling

Config Adc = Single , Prescaler = Auto

Dim A As Word
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte

Led0 Alias Portb.2
Ledfull Alias Portb.0
Triak Alias Portb.3

C = 1

Timer0 = 250

Enable Interrupts

On Int0 Nulla:

On Timer0 Ki:

Enable Int0

Enable Timer0

Start Adc

Start Timer0

'**********

   Do

A = Getadc(2)

 Waitms 10

B = A / 4
C = 254 - B

 If A > 20 Then

  Start Timer0
  Reset Led0

 Else

   Set Led0
   Stop Timer0
   Reset Triak

 End If

 If A > 1010 Then

  Set Ledfull

 Else

   Reset Ledfull

 End If

 Waitms 100

   Loop

'**********

Nulla:

 Reset Triak

 Stop Timer0
 Timer0 = C
 Start Timer0

Return

'**********

Ki:

Set Triak

Return

End
csak épp a timer0 nem csinál semmit.
Próbáltam , de egyszerű tesztprogrammal sem ment.

Eredetileg prescale=8

A"ki:" ben toggle val sem megy a dolog ,
Mintha bele sem futna a "ki:" be

És vajon mit ronthattam el?

7óra alatt nem jöttem rá
Volna valami ötletetek ?
Köszönöm
Kefeur
Avatar
SirLeslie
Pákabűvész
Hozzászólások: 247
Csatlakozott: 2005. április 14. csütörtök, 6:00

Hozzászólás Szerző: SirLeslie »

kefeur írta:Sziasztok.
Adott egy egyszerű kód...
...csak épp a timer0 nem csinál semmit.
...
Próbáltam , de egyszerű tesztprogrammal sem ment.

Próbáld meg az utolsó elötti hozzászólásban leírtakat...
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

Hozzászólás Szerző: kefeur »

Na igen , csak sajnos már ott tatok hogy ez sem megy:

Kód: Egész kijelölése

$regfile = "ATtiny13.dat"
$crystal = 9600000


Config Portb.0 = Output
Config Portb.1 = Input
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Input

Config Timer0 = Timer , Prescale = 256

Stop Timer0

Enable Interrupts
Enable Timer0

Timer0 = 1

On Timer0 Led:

Start Timer0

Do
nop
Loop

Led:
Toggle Portb.3
Return
Valamit szerintem nagyon elnéztem .
Nem tudom mit.

Van valakinek ötlete esetleg ?
Kefeur
Válasz küldése