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