Interrupt?

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

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?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Mi a feldolgozandó jel sebessége? mi a változás illetve a jelszint által kiváltott INT beavatkozási gyorsaságigénye?
Mi van ha INT alatt esik be egy másik (pl belső ) INT?
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Hoppla.-)

Megjelenik egyáltalán ez a változás ha a progi a do ban van megakasztva?
A fene enné meg:-)
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

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.
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

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?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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.
8)
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

[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ő.
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

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.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Akor az INT Change a jó neked:

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!*";

Return
Valahogy igy!
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Köszi ma sajna nem jutottam idáig de holnap kiprószálva.
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Szervusztok.

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.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ne lehet kiugrani csak igy:

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
Különben elszáll a vermed!
:roll:
De valami logikai bukfenc van az egész kódodban!?
Exit Sub helyett If-et kellene használni!
Gondold újra!

:wink:
É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  
Rá ismersz még :?:
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

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 
Nézd csak át a feltételed!
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.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Éppen ezért javítottam neki:

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

 Szenzor Alias Pind.3                                       ' a szenzor mindenkori allapota megjegyeszve 
  Gomb Alias Pinc.4                                          ' a kapcsolo allapota
Így mindig az aktuális bemenetet vizsgálja.
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

Láttam. Az aliasokat már nem is említettem.
Igazából, ha leírná pontosan, mit kellene vizsgálni, akkor sokkal jobb lenne.

Én pl a gomb, kapcsoló ,stb bemeneteket, mindig bit-ben tárolom, aztán azt vizsgálom. Persze van olyan, mikor közvetlen a bemenetet kell vizsgálni.
Válasz küldése