Interrupt?
Mi a gyorsabb?
Ha én egy rövid do hurokban ahol csak egy utasitás lesz végrehajtva,
(bekapcsolunk valamit ami ekkor majd elmozdul) és ez ha megtörtént ahogy kivánt egy bemeneti lábon változást okoz el kell hagyni.
Ha én most ezt nem egy interrupttal mert ott akármilyen rövid is egy rakás takt szükséges még akkor is ha nosev vagy assemblerel leröviditjük hanem a változást egyszerüen egy bitbe iratom amit ha az megjelent azt valahogy igy az elhagyást kiváltaná.
Loop until Bit<>Bit
togle bit
Return
A progi itt csak a do ban robog ami meg igen rövid.
Megy ilyesmi, van értelme?
Ha én egy rövid do hurokban ahol csak egy utasitás lesz végrehajtva,
(bekapcsolunk valamit ami ekkor majd elmozdul) és ez ha megtörtént ahogy kivánt egy bemeneti lábon változást okoz el kell hagyni.
Ha én most ezt nem egy interrupttal mert ott akármilyen rövid is egy rakás takt szükséges még akkor is ha nosev vagy assemblerel leröviditjük hanem a változást egyszerüen egy bitbe iratom amit ha az megjelent azt valahogy igy az elhagyást kiváltaná.
Loop until Bit<>Bit
togle bit
Return
A progi itt csak a do ban robog ami meg igen rövid.
Megy ilyesmi, van értelme?
Igazából nem valami gyors.
Maga ami a do ban történne (a kapscolások) azok felgyorsulnak sec 50 ig.
A szenzor tud a dokuja szerin 5kHz.-t. és gondolom a jel meredek. De ez megy elöször egy optokoplerra ami leviszi 5V re igy megy az Mc be onnan meg megin egy optokolerrel felfelé aztán tranyhó onnan Mosfet.
itt egy rakás késésel kell számolni ill. ezen nem tudok változtatni.
Még jönne a do ba egy timmer figyelés ami a bekapcsolt időtartam hosszát figyelné és ha az a megengedettet tullépné mindent megszakit mert ekkor valami gáz van és leéghet a cucc ami meghajtva lessz.
Maga ami a do ban történne (a kapscolások) azok felgyorsulnak sec 50 ig.
A szenzor tud a dokuja szerin 5kHz.-t. és gondolom a jel meredek. De ez megy elöször egy optokoplerra ami leviszi 5V re igy megy az Mc be onnan meg megin egy optokolerrel felfelé aztán tranyhó onnan Mosfet.
itt egy rakás késésel kell számolni ill. ezen nem tudok változtatni.
Még jönne a do ba egy timmer figyelés ami a bekapcsolt időtartam hosszát figyelné és ha az a megengedettet tullépné mindent megszakit mert ekkor valami gáz van és leéghet a cucc ami meghajtva lessz.
Foglald már össze, mit is szeretnél pontosan, illetve kicsit összeszedettebben írd le a mondanivalód, légyszi.
Ha jól értem van valami gép, ami két irányba mozog. Ezt a mozgást egy enkóder figyeli. Ennek a jelét nyilván interrupttal kell feldolgozni. Ez tiszta sor.
Továbbá, szeretnél egy fedőidőt. De ez mire szolgál? Adott idő alatt, jönnie kell X impulzusnak, vagy el kell érni egy végállásba?
Van végállás érzékelés egyáltalán?
Ha jól értem van valami gép, ami két irányba mozog. Ezt a mozgást egy enkóder figyeli. Ennek a jelét nyilván interrupttal kell feldolgozni. Ez tiszta sor.
Továbbá, szeretnél egy fedőidőt. De ez mire szolgál? Adott idő alatt, jönnie kell X impulzusnak, vagy el kell érni egy végállásba?
Van végállás érzékelés egyáltalán?
Szerintem a Timer túlcsordulást is tegyed megszakításba, ne a várakozás rutinba figyeljed!
A folyamat ábrát pontosan ismerni kellene a program jó megtervezéséhez!
Ha jól értem Enkóder töl jön a megszakítás impulzus, ha mozog a rendszer?
Ebben a megszakításban elindítod elölről a timert, és engedélyezed a megszakítását.
Stb….
Return
Most él 2 megszakítás engedélyezés.
Ha időben jön a lépést jelző enkóder jel, akkor kezdődik, minden előröl.
Ha nem jön enkóder töl jel. Beesik 1 timer megszakítás oda írhatod a vészhelyzet rutint!
De ha sok helyről jöhet megszakítás 1 időben lehet, hogy torlódás miatt akadályozni fogják egymást.

A folyamat ábrát pontosan ismerni kellene a program jó megtervezéséhez!
Ha jól értem Enkóder töl jön a megszakítás impulzus, ha mozog a rendszer?
Ebben a megszakításban elindítod elölről a timert, és engedélyezed a megszakítását.
Stb….
Return
Most él 2 megszakítás engedélyezés.
Ha időben jön a lépést jelző enkóder jel, akkor kezdődik, minden előröl.
Ha nem jön enkóder töl jel. Beesik 1 timer megszakítás oda írhatod a vészhelyzet rutint!
De ha sok helyről jöhet megszakítás 1 időben lehet, hogy torlódás miatt akadályozni fogják egymást.
[quote="kovacsna"]Foglald már össze, mit is szeretnél pontosan, illetve kicsit összeszedettebben írd le a mondanivalód, légyszi.
Amenyire én tudtam megpróbálltam.
Ha nem sikerált bocs.
Ezt talán a legjobban mert a problema analóg, a rail gun példáján tudnám szemléltetni,
Sorban vannank elektomágnesek. Ezeket kell egyenként egymásután be és természetessen kikapcsolni úgy ahogy az általluk elmozditot tárgy begyorsúljon, ha nem mozdúl illetve nem éri el a következő mágnest egy megadott idő allat akkor azt jelenteni. Ez a folyamat aztán megy folyamatossan mert mindig új tárgy jön majd egy darabig.
Az encoder meg a tárgyon van és nem tudni még, hogy az induláskor melyik állapotban és ha majd mozog akkor minden egyes mágnes elérésekkor csak az állapotát változtatja. Ezt a változást tudnám a következő mágnes kapcsolására használni (persze valamivel elötte de ez más kérdés, beállitható).
Én úgy gondoltam hogy az indulás előtt megvizsgálom melyik állaptban is van mert ez megy. Ha ezt megjegyzem egy Bitben vagy ahogy ezt illene akkor ennek változása a köverkező utasitást indithatja mert oly mindegy mi is a valós állapot 0 vagy 1. Csak a változás a döntő.
Amenyire én tudtam megpróbálltam.
Ha nem sikerált bocs.
Ezt talán a legjobban mert a problema analóg, a rail gun példáján tudnám szemléltetni,
Sorban vannank elektomágnesek. Ezeket kell egyenként egymásután be és természetessen kikapcsolni úgy ahogy az általluk elmozditot tárgy begyorsúljon, ha nem mozdúl illetve nem éri el a következő mágnest egy megadott idő allat akkor azt jelenteni. Ez a folyamat aztán megy folyamatossan mert mindig új tárgy jön majd egy darabig.
Az encoder meg a tárgyon van és nem tudni még, hogy az induláskor melyik állapotban és ha majd mozog akkor minden egyes mágnes elérésekkor csak az állapotát változtatja. Ezt a változást tudnám a következő mágnes kapcsolására használni (persze valamivel elötte de ez más kérdés, beállitható).
Én úgy gondoltam hogy az indulás előtt megvizsgálom melyik állaptban is van mert ez megy. Ha ezt megjegyzem egy Bitben vagy ahogy ezt illene akkor ennek változása a köverkező utasitást indithatja mert oly mindegy mi is a valós állapot 0 vagy 1. Csak a változás a döntő.
Ja mégvalami, a tárgy mindig az első mágnes közelében kerül a rendszerbe. Itt azonban nincs arra biztositék, hogy nem e épp az első és a második közt van. Igy előforúlhat hogy az első lépés nem előre hanem épp visszafelé moszditaná de ez igazán nem volna veszélyes mert a következő lépés már innen csak egy irányba vihetné.
De ha egyszerűen elkerülhető lenne azt érdemes volna azért megoldani.
De ha egyszerűen elkerülhető lenne azt érdemes volna azért megoldani.
Akor az INT Change a jó neked:
Valahogy igy!
Kód: Egész kijelölése
' file: INT0.BAS
' demo: ON INT0 .. , RETURN
'--------------------------------------------------------------
$regfile = "m88def.dat"
$hwstack = 40
$swstack = 32
$framesize = 32
Const Maxstep = 10 ' = a léptetések számával
Dim V1 As Integer
Dim Count As Integer , Ts As Byte
' CHANGE to generate an interrupt on the change of the edge. Not all microprocessors support CHANGE.
' CHANGE generál egy megszakítást a minden változás a élén. Nem minden mikroprocesszorok támogatja VÁLTOZÁS.
Config Int0 = Change
On Int0 Int0_int 'Initialise the INT0 Interrupt
Rem On Int0 Int0_int Nosave 'Initialise the INT0 Interrupt
Rem Use The Nosave Option When You Dont Want The Internal Registers To Be Saved/restored In
Rem The Interrupt Routine
'Configute the timer to use the clock divided by 1024
Config Timer0 = Timer , Prescale = 1024
'Define the ISR handler
On Ovf0 Tim0_isr
'you may also use TIMER0 for OVF0, it is the same
Enable Interrupts
Enable Int0 'enable the interrupt
Enable Timer0 ' enable the timer interrupt
Count = 0 'reset counter
Do
V1 = V1 + 1
Ts = Inkey() 'get key from serial device
Loop Until Ts = 27 'loop until users presses ESC key
End
'-------------------------------------------------------------------------------
Rem The Interrupt Handler For The Int0 Interrupt
Int0_int:
Timer0 = 0 ' Időzitő Számolás elölröl
Start Timer0
Incr Count
If Count = Maxstep Then ' Ha vége a futónak
Stop Timer0
' Print "Int 0 occured"
Count = 0
' Lekapcsoljuk a mágnesokat
'...
End If
' Kapcsoljuk a Count-al mutatot mágnest
'....
Return 'notice the return
'-------------------------------------------------------------------------------
'the following code is executed when the timer rolls over
Tim0_isr:
Print "*Letelt az idöd!*";
ReturnSzervusztok.
Fel tudnátok homályositani mi itt a hiba?
Szeretnék itt egy subban egy szenzor változást használni de nem interruptal.
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd.5 = Output ' ledek
Config Portd.7 = Output
Config Pinc.4 = Input ' kapcsolo a progi inditasra
Portc.4 = 1
Config Pind.3 = Input ' itt a szenzor
Portd.3 = 1
Declare Sub lepj
Dim Szenzor As Bit ' ide irnam a szenzor allapotat
Dim Ujszenzor As Bit ' ide meg mindig az ellenkazöjet
Dim Gomb As Bit ' ide meg a kapcsolo allapotat
Do
Szenzor = Pind.3 ' a szenzor mindenkori allapota megjegyeszve
Gomb = Pinc.4 ' a kapcsolo allapota
If Gomb = 0 Then Gosub lepj ' erre meg reagal
Loop
End
lepj:
Do
Do
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1
Portd.5 = 1
Loop Until Szenzor = Ujszenzor ' idaig jut el es marad is, de miert?
Portd.5 = 0
Return
'ez meg lenne a következö most a masik leddel
Do
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1
Portd.7 = 1
Loop Until Szenzor = Ujszenzor
Portd.7 = 0
Return
Loop Until Gomb = 1
Return
Köszi előre is.
Fel tudnátok homályositani mi itt a hiba?
Szeretnék itt egy subban egy szenzor változást használni de nem interruptal.
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd.5 = Output ' ledek
Config Portd.7 = Output
Config Pinc.4 = Input ' kapcsolo a progi inditasra
Portc.4 = 1
Config Pind.3 = Input ' itt a szenzor
Portd.3 = 1
Declare Sub lepj
Dim Szenzor As Bit ' ide irnam a szenzor allapotat
Dim Ujszenzor As Bit ' ide meg mindig az ellenkazöjet
Dim Gomb As Bit ' ide meg a kapcsolo allapotat
Do
Szenzor = Pind.3 ' a szenzor mindenkori allapota megjegyeszve
Gomb = Pinc.4 ' a kapcsolo allapota
If Gomb = 0 Then Gosub lepj ' erre meg reagal
Loop
End
lepj:
Do
Do
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1
Portd.5 = 1
Loop Until Szenzor = Ujszenzor ' idaig jut el es marad is, de miert?
Portd.5 = 0
Return
'ez meg lenne a következö most a masik leddel
Do
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1
Portd.7 = 1
Loop Until Szenzor = Ujszenzor
Portd.7 = 0
Return
Loop Until Gomb = 1
Return
Köszi előre is.
Ne lehet kiugrani csak igy:
Különben elszáll a vermed!

De valami logikai bukfenc van az egész kódodban!?
Exit Sub helyett If-et kellene használni!
Gondold újra!

És nem lehet 1 sorban:
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1
Rá ismersz még 
Kód: Egész kijelölése
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd.5 = Output ' ledek
Config Portd.7 = Output
Config Pinc.4 = Input ' kapcsolo a progi inditasra
Portc.4 = 1
Config Pind.3 = Input ' itt a szenzor
Portd.3 = 1
Declare Sub lepj
' Dim Szenzor As Bit ' ide irnam a szenzor allapotat
Dim Ujszenzor As Bit ' ide meg mindig az ellenkazöjet
' Dim Gomb As Bit ' ide meg a kapcsolo allapotat
Szenzor Alias Pind.3 ' a szenzor mindenkori allapota megjegyeszve
Gomb Alias Pinc.4 ' a kapcsolo allapota
Do
If Gomb = 0 Then Call Lepj ' erre meg reagal
Loop
End
Sub Lepj
Do
Do
If Szenzor = 1 Then
Ujszenzor = 0
Else
Ujszenzor = 1
End If
Portd.5 = 1
Loop Until Szenzor = Ujszenzor ' idaig jut el es marad is, de miert?
Portd.5 = 0
' Return
Exit Sub
'ez meg lenne a következö most a masik leddel
Do
If Szenzor = 1 Then
Ujszenzor = 0
Else
Ujszenzor = 1
End If
Portd.7 = 1
Loop Until Szenzor = Ujszenzor
Portd.7 = 0
' Return
Exit Sub
Loop Until Gomb = 1
End Sub
De valami logikai bukfenc van az egész kódodban!?
Exit Sub helyett If-et kellene használni!
Gondold újra!
És nem lehet 1 sorban:
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1
Kód: Egész kijelölése
If Szenzor = 1 Then
Ujszenzor = 0
Else
Ujszenzor = 1
End if
Kód: Egész kijelölése
If Szenzor = 1 Then
Ujszenzor = 0
Else
Ujszenzor = 1
End If
Portd.5 = 1
Loop Until Szenzor = Ujszenzor
Sosem lesz egyenlő a kettő!!!! Teljes joggal mard ott!
Szemantikai hiba van!
Ha szenzor 1 akkor ujeszenor 0. Ha szenzor 0 akkor ujszenzor 1.
Te pedig addig vársz amíg a kettő meg nem egyezik. Csakhogy sosem fog!
Még szubrutin sem kell. Amúgy meg kerüld a gosub utasítást. Ahhoz amúgy sem kell deklaráció, tehát a declare sub lepj, felesleges.
A helyedben a If Gomb = 0 Then vezérlésbe tenném az egészet.
Éppen ezért javítottam neki:
Így mindig az aktuális bemenetet vizsgálja.
Kód: Egész kijelölése
Szenzor Alias Pind.3 ' a szenzor mindenkori allapota megjegyeszve
Gomb Alias Pinc.4 ' a kapcsolo allapota