Jelkésleltetési idő

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

Jelkésleltetési idő

Hozzászólás Szerző: Ubul »

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
Avatar
btotyi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2005. december 11. vasárnap, 7:00

Re: Jelkésleltetési idő

Hozzászólás Szerző: btotyi »

Ubul í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
Nem tudom, szerintem normális. (De majd Robert pontosan kiszámolja, hogy mennyi :D ). Viccet félrtéve ha ennél nagyobb sebesség kell akkor használj assemblert. Ott ugyanis ezt a feladatot végrehajtó utasítás sorozat kb. 6 gépi utasítás szemben a lefordított basic kóddal. Ha az assembly nem megy annyira, próbáld meg a c-t, tapasztalataim alapján nagyon jól optimalizál.

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.
Avatar
pkedvessy
Tranzisztorgyógyász
Hozzászólások: 198
Csatlakozott: 2006. január 1. vasárnap, 7:00

Hozzászólás Szerző: pkedvessy »

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!
A hozzászólást 1 alkalommal szerkesztették, utoljára pkedvessy 2006. július 3. hétfő, 21:18-kor.
Avatar
pkedvessy
Tranzisztorgyógyász
Hozzászólások: 198
Csatlakozott: 2006. január 1. vasárnap, 7:00

Hozzászólás Szerző: pkedvessy »

Erre gondoltam:

Kód: Egész kijelölése

do

Pind.4 = Not Pind.3

Loop
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 :D
Avatar
pkedvessy
Tranzisztorgyógyász
Hozzászólások: 198
Csatlakozott: 2006. január 1. vasárnap, 7:00

Hozzászólás Szerző: pkedvessy »

Bocsi, de amiket számoltam, az 12 Mhz-es kvarccal lettek számolva, és nem 16-ossal!
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

Hozzászólás Szerző: Ubul »

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
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

Hozzászólás Szerző: Ubul »

Szia!

És C alatt mennyi idő lenne a:

do

pind.x=pind.y

loop
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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

Hozzászólás Szerző: Robert- »

Hülye ötlet:

Ha órajelet kell kikapuzni, akkor azt egy logikai ÉS kapuval megoldani?
Avatar
btotyi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2005. december 11. vasárnap, 7:00

Hozzászólás Szerző: btotyi »

Ubul írta:Szia!

És C alatt mennyi idő lenne a:

do

pind.x=pind.y

loop
Ha még aktuális, este otthon megnézem mivel a benti gépemen nincs fenn az avrstudio + avrgcc páros
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

Hozzászólás Szerző: Ubul »

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
Válasz küldése