Jelkésleltetési idő
Jelkésleltetési idő
Sziasztok!
Két bemeneti értéktől függően kellene egy harmadik de kimeneti értéket generálni.
(Shift regisztert emulálok MEGA16-on, ami 16MHz es külső kvarcról jár.)
A probléma az hogy 12us késéssel történnek a dolgok BASCOM-ban.
Például.
config pind.4=output
config pind.3=input
do
If pind.3=0 then set portd.4 else reset portd.4
loop
Egy ilyen műveletnél, 1.49us
eltérés van a a pind.3 bemeneti és portd.4 kimeneti négyszögjele közt.
Ha SET és RESET helyett =1 és =0-t használok, csak nő az időbeni különbség.
Egy megszakításba beugrani és magas szintre állítnaoi egy kimeneti lábat
4us.
Szerintetek ez normális vagy esetleg valamit rosszul
állítottam a fusebiteknél, ennyit tud a BASCOM, stb.
Köszi: Peti
Két bemeneti értéktől függően kellene egy harmadik de kimeneti értéket generálni.
(Shift regisztert emulálok MEGA16-on, ami 16MHz es külső kvarcról jár.)
A probléma az hogy 12us késéssel történnek a dolgok BASCOM-ban.
Például.
config pind.4=output
config pind.3=input
do
If pind.3=0 then set portd.4 else reset portd.4
loop
Egy ilyen műveletnél, 1.49us
eltérés van a a pind.3 bemeneti és portd.4 kimeneti négyszögjele közt.
Ha SET és RESET helyett =1 és =0-t használok, csak nő az időbeni különbség.
Egy megszakításba beugrani és magas szintre állítnaoi egy kimeneti lábat
4us.
Szerintetek ez normális vagy esetleg valamit rosszul
állítottam a fusebiteknél, ennyit tud a BASCOM, stb.
Köszi: Peti
Re: Jelkésleltetési idő
Nem tudom, szerintem normális. (De majd Robert pontosan kiszámolja, hogy mennyiUbul írta:Sziasztok!
Két bemeneti értéktől függően kellene egy harmadik de kimeneti értéket generálni.
(Shift regisztert emulálok MEGA16-on, ami 16MHz es külső kvarcról jár.)
A probléma az hogy 12us késéssel történnek a dolgok BASCOM-ban.
Például.
config pind.4=output
config pind.3=input
do
If pind.3=0 then set portd.4 else reset portd.4
loop
Egy ilyen műveletnél, 1.49us
eltérés van a a pind.3 bemeneti és portd.4 kimeneti négyszögjele közt.
Ha SET és RESET helyett =1 és =0-t használok, csak nő az időbeni különbség.
Egy megszakításba beugrani és magas szintre állítnaoi egy kimeneti lábat
4us.
Szerintetek ez normális vagy esetleg valamit rosszul
állítottam a fusebiteknél, ennyit tud a BASCOM, stb.
Köszi: Peti
UI. megnéztem szimulátorban ahol a következő programmal mindenféle trükközés nélkül sikerült 0.31 usecet elérnem.
Kód: Egész kijelölése
.include "m16def.inc"
.cseg
.org 0x0
ldi r16,1<<pa3
ldi r17,1<<dda4
out porta,r16
out ddra,r17
ldi r16,0x8
cikl: in r17,pina
eor r17,r16
andi r17,0x8
lsl r17
out porta,r17
rjmp cikl
A hozzászólást 2 alkalommal szerkesztették, utoljára btotyi 2006. július 3. hétfő, 21:25-kor.
Ha szimulálod a programot a BASCOM-ban, akkor ott alul kiírja, hogy mennyi idő telik el...
Amúgy szerintem az IF utasítás miatt lassú a dolog! Próbáld meg értékül adni a bemenet komplementerét a kimenetnek! Így nem kell ellenőrízgetni, hogy mi is a bejövő jel!
Amúgy szerintem az IF utasítás miatt lassú a dolog! Próbáld meg értékül adni a bemenet komplementerét a kimenetnek! Így nem kell ellenőrízgetni, hogy mi is a bejövő jel!
A hozzászólást 1 alkalommal szerkesztették, utoljára pkedvessy 2006. július 3. hétfő, 21:18-kor.
Erre gondoltam:
Megnéztem, a szimulátor szerint a te verziód 1,666 us alatt, az enyém meg 1,5834 us alatt végzi el amit szeretnél! Nem sokkal, de valamivel gyorsabb 
Kód: Egész kijelölése
do
Pind.4 = Not Pind.3
Loop
Szia!
Az a baj hogy kell IF.
Attól függően hogy egy változónak milyen értéke van,
egy másik eszköz órajellel szinkronnal ki kell edni egy négyszögjelet.
A másik eszköz órajele jön a MEGA16 egyik lábára,
a 8db 'változó' vagy inkább nyomógomb 8 másik lábra és van egy kimeneti láb.
Ha nyomva van az adott nyomógomb, és a másik eszköz
órajele 1 et ad a MEGA adott lábára, AZONNAL ki kellene küldeni 5 voltot.
Épp, 9.81us nál tartok.
Elég gyenge eredmény...
Peti
Az a baj hogy kell IF.
Attól függően hogy egy változónak milyen értéke van,
egy másik eszköz órajellel szinkronnal ki kell edni egy négyszögjelet.
A másik eszköz órajele jön a MEGA16 egyik lábára,
a 8db 'változó' vagy inkább nyomógomb 8 másik lábra és van egy kimeneti láb.
Ha nyomva van az adott nyomógomb, és a másik eszköz
órajele 1 et ad a MEGA adott lábára, AZONNAL ki kellene küldeni 5 voltot.
Épp, 9.81us nál tartok.
Elég gyenge eredmény...
Peti
Bocs hogybeleszólok:
az a 10 uS késleltetés kb. 100kHz-nak felel meg....
Az általad elért 1 us körüli érték 1 MHz-s shiftregisztert jelent...
Mihez kell ilyen gyors shift regiszter?
Az INT rutinban ha nincsen benne változóval való művelet, akkor a nosave paraméterrel hívd meg. Nem menti ekkor a regisztereket, így 25 órajelet spórolsz.
M16 helyett használj Tiny2313/M48 vagy újabbakat (alapban 20 MHz), de húzható 24-25 MHz-ig...
Az IF helyett használj SELECT-CASE feltételt, illetve direkt portelérést.
És hogy bele is szóljak: a mechanikus nyomógomb az prelleg. Ennek ideje 5-10 msec....
Esetleg nem lehet hogy nem mikrokontrollert használsz, hanem más eszközt? Pl. GAL/PAL, CPLD stb.- Azok inkabb erre lettek kitalálva.
A Bascom sem a gyorsvonat kategória ilyen ennyire időkritikus feladatra. arra max az ASM jó.
Tesztek:
Config Pind.4 = Output
config pind.3=input
do
Select case Pind.3
Case 1 : Set Portd.4
Case 0 : Reset Portd.4
End Select
loop
27 órajelciklus.
IF megoldás (If pind.3=0 then set portd.4 else reset portd.4 ):
17 órajel
Portmatatas (Pind.4 = Not Pind.3)
16 órajel
Órajellel szinkron négyszögjel kiadása esetén a fel/lefutási időt is számolj.
Az órajel megfogást INT llábon tenném, amikor kell az órajel, akkor Enable Intx-l engedélyezmém az órajelet és az int rutinban a portállítást megcsionálnám. ott már nem számolnék, csak a főprogramban. És nosave paraméterrel használnám. Így az órajel beesése után ~10-20 utasítással már beállt láb. Ennek ideje (késleltetés) 20 MHz esetén (ezt a M16 is bírja) ~1usec.
Vagy kénytelen vagy logikai kapukól megépíteni.... (HCT sorozat ~25-30 MHz-ig jó)
De ha megmondod mihez kell ekkora reakcióidő, akkor hátha tudunk más megoldást...
az a 10 uS késleltetés kb. 100kHz-nak felel meg....
Az általad elért 1 us körüli érték 1 MHz-s shiftregisztert jelent...
Mihez kell ilyen gyors shift regiszter?
Az INT rutinban ha nincsen benne változóval való művelet, akkor a nosave paraméterrel hívd meg. Nem menti ekkor a regisztereket, így 25 órajelet spórolsz.
M16 helyett használj Tiny2313/M48 vagy újabbakat (alapban 20 MHz), de húzható 24-25 MHz-ig...
Az IF helyett használj SELECT-CASE feltételt, illetve direkt portelérést.
És hogy bele is szóljak: a mechanikus nyomógomb az prelleg. Ennek ideje 5-10 msec....
Esetleg nem lehet hogy nem mikrokontrollert használsz, hanem más eszközt? Pl. GAL/PAL, CPLD stb.- Azok inkabb erre lettek kitalálva.
A Bascom sem a gyorsvonat kategória ilyen ennyire időkritikus feladatra. arra max az ASM jó.
Tesztek:
Config Pind.4 = Output
config pind.3=input
do
Select case Pind.3
Case 1 : Set Portd.4
Case 0 : Reset Portd.4
End Select
loop
27 órajelciklus.
IF megoldás (If pind.3=0 then set portd.4 else reset portd.4 ):
17 órajel
Portmatatas (Pind.4 = Not Pind.3)
16 órajel
Órajellel szinkron négyszögjel kiadása esetén a fel/lefutási időt is számolj.
Az órajel megfogást INT llábon tenném, amikor kell az órajel, akkor Enable Intx-l engedélyezmém az órajelet és az int rutinban a portállítást megcsionálnám. ott már nem számolnék, csak a főprogramban. És nosave paraméterrel használnám. Így az órajel beesése után ~10-20 utasítással már beállt láb. Ennek ideje (késleltetés) 20 MHz esetén (ezt a M16 is bírja) ~1usec.
Vagy kénytelen vagy logikai kapukól megépíteni.... (HCT sorozat ~25-30 MHz-ig jó)
De ha megmondod mihez kell ekkora reakcióidő, akkor hátha tudunk más megoldást...
-
Robert-
Sziasztok!
Tulajdonképpen egy meglévő eszköz SHIFT REGISZTER-ét
kellene kiváltani.
Megy is, de 10us késéssel.
Az órajelet, INT1 megszakítással követem, de mire kilép a megszakításba
az 4us.
A megoldás egyébként már megvan fejben.
Egy D tárolón fogom átvezetni aa dolgokat, aminek a preset lábára lesz kötve az eredeti órajel.
Szóval egy egész órajelet fog késni a rendszer, de legalább pontos lesz.
Ödv: Peti
Tulajdonképpen egy meglévő eszköz SHIFT REGISZTER-ét
kellene kiváltani.
Megy is, de 10us késéssel.
Az órajelet, INT1 megszakítással követem, de mire kilép a megszakításba
az 4us.
A megoldás egyébként már megvan fejben.
Egy D tárolón fogom átvezetni aa dolgokat, aminek a preset lábára lesz kötve az eredeti órajel.
Szóval egy egész órajelet fog késni a rendszer, de legalább pontos lesz.
Ödv: Peti
