mega644 - komparator - timer1

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

mega644 - komparator - timer1

#1 Příspěvek 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?
Naposledy upravil(a) apam dne 01 led 2011, 19:49, celkem upraveno 1 x.
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#2 Příspěvek 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".
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

#3 Příspěvek 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
Naposledy upravil(a) apam dne 01 led 2011, 19:49, celkem upraveno 1 x.
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#4 Příspěvek 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.
Uživatelský avatar
apam
Příspěvky: 111
Registrován: 17 bře 2007, 00:00

#5 Příspěvek 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?
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#6 Příspěvek 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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“