Stránka 1 z 1

mega644 - komparator - timer1

Napsal: 01 led 2011, 16:16
od apam
Ví někdo proč mi stale vypisuje hodnotu index_1 = 0
potřebuji měřit čas překlopení komparatoru.
program je v Bascomu.

Kód: Vybrat vše

...
start adc
Timer1 = 0
Bitwait Acsr.aco , Reset
Start Timer1
Bitwait Acsr.aco , Set
Stop Timer1
Index_1 = Timer1
stop adc
...

jak by to vypadalo s přerušením?

Napsal: 01 led 2011, 16:45
od AB1
Co z toho máme poznat?
Pošli kompletní překladu schopný kód, zkrácený tak aby ukazoval problém.
A pokud možno použij tlačítko "Code".

Napsal: 01 led 2011, 17:26
od apam

Kód: Vybrat vše

$regfile = "m644def.dat"
$crystal = 20000000
$sim

Config Lcd = 16 * 2
Config Adc = Single , Prescaler = 16 , Reference = Avcc
Config Timer1 = Timer
Acsr.acbg = 1                                               'ain na interni ref
Dim Strt As String * 5 , Index_1 As Word , Ad As Word

Do
   Start Adc

   Ad = Getadc(0)
   Strt = Str(ad)
   Strt = Format(strt , "     ")
   Locate 1 , 1
   Lcd "ADC 0  ="
   Locate 1 , 10
   Lcd Strt

   Timer1 = 0
   Bitwait Acsr.5 , Reset
   Start Timer1
   Bitwait Acsr.5 , Set
   Stop Timer1

   Stop Adc

   Index_1 = Timer1
   Strt = Str(index_1)
   Strt = Format(strt , "     ")
   Locate 2 , 1
   Lcd "Timer1 ="
   Locate 2 , 10
   Lcd Strt
Loop

End

Napsal: 01 led 2011, 18:31
od AB1
1.

Kód: Vybrat vše

Config Timer1 = Timer

Takto se timer1 nerozběhne. Je nutné přidat prescaler.

Kód: Vybrat vše

Config Timer1 = Timer, prescale = 1


2.

Kód: Vybrat vše

Timer1 = 0
Bitwait Acsr.5 , Reset
Start Timer1
Bitwait Acsr.5 , Set
Stop Timer1

To nebude fungovat. Čítání se spustí např. i v okamžiku kdy Acsr.5 je už nějakou
dobu v úrovni 0, takže změříš jenom část pulsu.

3.
Vynech Start ADC a Stop ADC v hlavní smyčce.
Pro maximální přesnost má být frekvence ADC mezi 50 a 200 kHz,
takže předdělič ADC by měl být 128.

Běžnější způsob měření délky pulsu je pomocí Input Capture.

Napsal: 01 led 2011, 19:37
od apam
S tou předděličkou mě to nějak uteklo... Diky za radu. Timer se rozbehl, bohužel jak píšeš přesnost měření není moc velká. Jde o to, že ve skutečnosti chci vyrobit osciloskop, který využívá vestavěný adc převodník, pin AIN0 je připojený na offset (2,45V) vstupního oz a AIN1 je spojen se vstupem ADC0 a tvoří jakýsi triger, kterým se spouští načítání dat do datové řady která se dál zpracovává, ve skutečnosti je to takhle:

Kód: Vybrat vše

Start Adc
  Bitwait Acsr.5 , Set       
  For Poz_x = 1 To 132
    Ad_w(poz_x) = Getadc(0)
  Next
Stop Adc

Timer1 = 0
Bitwait Acsr.5 , Set                                   
Start Timer1

Bitwait Acsr.5 , Reset
Stop Timer1

Index_1 = Timer1
...
...

snažím se, aby byl program co nejrychlejší a zapojení co nejjednodušší.
cílem té části s tím timer1 je zjistit délku periody
možná by mi pomohlo řešit to měření času pomocí přerušení vyvolaným překlopením komparatoru. to ale nevím jak obsloužit, nebo je jiný vhodnější způsob?

Napsal: 01 led 2011, 20:22
od AB1
přesnost měření není moc velká
Nevím jestli jsi mi rozumněl.
Přesnost není malá ale nulová.
Pro určitou délku pulsu dostaneš náhodně hodnoty 0 až délka.

Příkaz "Bitwait bit, reset" nečeká na sestupnou hranu,
pokud je bit 0 tak program jde hned dál.

Můžeš tento kód použít, ale na začátku musíš čekat na sestupnou hranu:
Bitwait bit, set
Bitwait bit, reset
Start timer

Já bych zkusil hotové řešení
http://www.serasidis.gr/circuits/AVR_oscilloscope/avr_oscilloscope.htm