Külső megszakítások
Külső megszakítások
Használta már valaki a Capture utasítást?
Két impulzus között eltelt időt mérni.
Ha jól tudom a PD.6 -os lábra kell csatlakoztatni a bemenő jelet. Nekem nem működik.
Ugyan ezt szerintem meg lehet oldani akármelyik INTx lábbal. Mivel különb ha a PD.6 os ICP lábat (pint) használom?
Két impulzus között eltelt időt mérni.
Ha jól tudom a PD.6 -os lábra kell csatlakoztatni a bemenő jelet. Nekem nem működik.
Ugyan ezt szerintem meg lehet oldani akármelyik INTx lábbal. Mivel különb ha a PD.6 os ICP lábat (pint) használom?
A capture esetben a timerrel machinálsz.Elvileg a Timer fejezetben van rá minta (még nem próbáltam ki).
A sima Int esetén lefoglalod az Int lábat és az egyik timert is...
valamint 2 impulzus közötti időmérésre a Timer alapú elegánsabb...
Én is Int+Timert használok, a capture nem is jutott eszembe:).
A sima Int esetén lefoglalod az Int lábat és az egyik timert is...
valamint 2 impulzus közötti időmérésre a Timer alapú elegánsabb...
Én is Int+Timert használok, a capture nem is jutott eszembe:).
Na most értem is, meg nem is amit írtál
Timer-t mindenképp kell használnom. Az meg hogy a külső jel melyik lábon jön be az megint mindegy, így is, úgy is kell hozzá egy láb.
Tegnap kipróbáltam amit írtál a megszakítások fejezetben, de az meg se nyekken. (CAPTURE) Jön a jel, a láb bemenetnek konfigurálva felhúzó ellenállásal, stb..
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
On Capture1 Hallmegszak
Ha jól értem a dolgot ennek , úgy kellene működnie, hogy a TIMER1 számolja az órajeleket leosztva jelen esetben 64-el, és ha jön egy lefutó él a PD.6-os lábon akkor CAPTURE beállítás miatt "heghívódik" a Hallmegszak rutin. A megszak pillanatában a TIMER1 értéke átmásolódik a Capture1-be.
A megszak nem történik. Az tuti.
Mééér?
Robi, van tipped?
Ha nagyon nem megy akkor inkább átteszem inkább az INT0 lábra.
Csak azért gondoltam hogy kipróbálom mert "állítólag" a PORTD.6 (MEGA32-n) azaz az ICP láb direkte erre van "kitalálva".
Timer-t mindenképp kell használnom. Az meg hogy a külső jel melyik lábon jön be az megint mindegy, így is, úgy is kell hozzá egy láb.
Tegnap kipróbáltam amit írtál a megszakítások fejezetben, de az meg se nyekken. (CAPTURE) Jön a jel, a láb bemenetnek konfigurálva felhúzó ellenállásal, stb..
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
On Capture1 Hallmegszak
Ha jól értem a dolgot ennek , úgy kellene működnie, hogy a TIMER1 számolja az órajeleket leosztva jelen esetben 64-el, és ha jön egy lefutó él a PD.6-os lábon akkor CAPTURE beállítás miatt "heghívódik" a Hallmegszak rutin. A megszak pillanatában a TIMER1 értéke átmásolódik a Capture1-be.
A megszak nem történik. Az tuti.
Mééér?
Ha nagyon nem megy akkor inkább átteszem inkább az INT0 lábra.
Csak azért gondoltam hogy kipróbálom mert "állítólag" a PORTD.6 (MEGA32-n) azaz az ICP láb direkte erre van "kitalálva".
Int1 lábon 10k-s felhúzó ellenállás, a láb bemenetként konfigolva. Ezzel a kóddal próbálkoztam, de nem reagál. A lábra 100us-os impulzusok érkeznének, próbaként. (A kvarc 14,7456 MHz-es).
Itt a kód lényegi része:
Config Timer1 = Counter , Prescale = 1 , Edge = Rising
Dim Wtime As Byte
Dim Timercounter As Word
Wtime = 50
Timercounter = 0
Do
Waitus Wtime
Timercounter = Timer1
If Timercounter > 0 Then
Print Timercounter ; " " ;
Else
End If
Loop
Itt a kód lényegi része:
Config Timer1 = Counter , Prescale = 1 , Edge = Rising
Dim Wtime As Byte
Dim Timercounter As Word
Wtime = 50
Timercounter = 0
Do
Waitus Wtime
Timercounter = Timer1
If Timercounter > 0 Then
Print Timercounter ; " " ;
Else
End If
Loop
http://www.atmel.com/dyn/resources/prod ... oc2553.pdf
Itt a GIFR helyett EIFR.
EIFR.0 - INT0
EIFR.1 - INT1
De:
GIFR.7 - INT1
GIFR.6 - INT0
Itt a GIFR helyett EIFR.
EIFR.0 - INT0
EIFR.1 - INT1
De:
GIFR.7 - INT1
GIFR.6 - INT0
Bocsánatot kérek, de a fenti példaprogram kvázi megegyezik a Bascom-könyv megszakításokkal foglalkozó fejezetében szereplő, 'counter2.bas' példaprogrammal, ami ugyebár az impulzusszámlálást hivatott demonstrálni. Ott sincs szó megszakításról a mintaprogramban...Robert írta:Az INT-et nem kezeled ezzel a kóddal le....
Config int1=....
On Int1....
Enable interruptes....
A fentiek alátámasztására kénytelen vagyok bemásolni az ottani szöveget:
Én itt nem látok megszakítást engedélyező utasítást...Figyelj oda, hogyha a Timer0 és a Timer1 számlálót/időzítőt külső impulzusszámlálásra használod a kontroller a Tx lábat az órajellel szinkronban vizsgálja. Ez azt jelenti, hogy a számolandó impulzusok, vagy impulzusfrekvencia soha nem lehet nagyobb, mint a kontroller órajelének a fele (Nyquist törvény/diagram). Ha biztosan akarunk mérni, akkor a mérendő impulzus a processzor órajelének 40%-a alatt legyen. Azaz például, ha az órajel 4 MHz, akkor ne próbáljunk meg 1,6 MHz feletti frekvenciát mérni vele.
Próbáld ki, hogy egy TTL impulzusgenerátort kötsz a T1 lábra (PortD.5, az AT90S2313 9. lába):
counter1.bas
$regfile = "2313def.dat"
$crystal = 4000000
Config Pind.6 = Output
Config Timer1 = Counter , Edge = Falling , Prescale = 1
Stop Counter1
Set Portd.6
Waitms 1000
Reset Portd.6
Waitms 1000
Cls
Do
Counter1 = 0
Start Counter1
Waitms 25
Stop Counter1
Cls
Lcd "Counter1: " ; Counter1
Waitms 100
Loop
End
