Int-ből adódó hiba

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Int-ből adódó hiba

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

Van egy motorom aminek a végén van egy reed és egy mágnes amiben vannak +-+-+- pólusok. Ez így egy impulzus jeladó!

Egy atmega 64 procival számolom az impulzusokat INT alapon.

Ha a motor kifele megy akkor hozzá adom az impulzust ha visszafele akkor elvesz egyet.

Így megszámolja hogy egy motor milyen hosszú és mindíg tudja mikor hol van.

a hiba akkor adódik, amikor a motor az alján van és az impulzusok szinte egyet se nőnnek de vissza fele húzásnál mindíg egyel kevesebbet számol.

a motor végénél pedig ugyan ezt fordítva egyet többet.

Ha egy tartományon belül mozgatom a motort a hiba halmozódik és így nem pontos az impulzusok száma ami egy végzetes hibához vezet.

én arra gondolok hogy mondjuk a rising-nél a felfutó éleket figyelve ugye.
2 felfutó él között mozgok és a másodikat soha sem érem el így hozzá nem tud adni csak elvenni, ha a motor aljánál vagyok.

elvileg nem szabadna ennek előfordulni.

Az érdekelne hogy találkoztzatok e hasonló hibával, illetve számoltatok e már impulzust int alapon oda vissza adott tartományon belül?

A gifr parancs ezen nem segítene?

nekem a pontos impulzus szám nagyon fontos soha nem téveszthetek max évente 1-2-t !

Köszi.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

És most tőlünk mit vársz? Ilyen kevés információ birtokában még nem tudunk neked segíteni!
Legfeljebb vagy beteszel végállás kapcsolót, vagy 1 bizonyos lépés számon túl nem engeded tovább fordulni a motorod.
Zavar szűrés van, az int bemeneten?
Esetleg figyeled, mikor akad meg a végén, és visszaindulásnál korrigálod 1-el a számlálót!?
De ha látnánk a megszakítás rutint, lehet kiszűrnénk a hibát.
:roll:
Állítsd be: CONFIG INTx = CHANGE
Minden változásra megszakítást kér.
:idea:
Ahogy leírtad odafele +-ról indulsz, visszafele –+ ról! (+-+-+-) Az átmenetek nem jönnek ki szinkronban, így jobb lenne: (+-+-+-+). Feltéve, hogy +- átmenetet figyelsz (FALLING)?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Tipp:

Normál INT-re:
- Change

Fejlettebb chip esetén
- Pinchange

A előző és a jelenlegi lábállapot alapján tudod, hogy felfele, vagy lefele volt a váltás.
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

Kapu48: Köszönöm az első szép megnyilvánulást. A másik 20 ampernél a végállás kapcsoló úgy felrobban hogy szép lesz nézni! Amúgy a motorban vannak végállás kapcsolók de pont azért tartok tőle 10 impulzusnyi távot hogy ne érjen oda. Az int bementetek digitális Schmitt trigger optoval vannak leválasztva kimondottan ( Microprocessor compatible drive ) típust választottunk mely leválassza a külső reed relayoktól.
Így a hiba lehetősége és a zavarok = 0 -val!

Kérted az intet hát itt van:

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


On Int4 2reed                                               'II REED SENSOR
On Int7 1reed                                               'I REED SENSOR
Config Int4 = Rising
Config Int7 = Rising
Enable Interrupts
Enable Int4
Enable Int7

1reed:
If 1motorfel = 0 Then Incr A
If 1motorle = 0 Then Decr A
Return

2reed:
If 2motorfel = 0 Then Incr B
If 2motorle = 0 Then Decr B
Return

Róbert: Nem is tudtam hogy van sima change beállítás az intnek.
A fejlettebben mit értesz ATmega64 a proci írtam fentebb. A pinchaneget ismerem még nem használtam mert nem volt rá szükség.
Meg nézem a helpben ezt a changet meg itt a könyvben is.
A change lényege a változás lenne a ha jól értem a fel és le futót is figyeli?
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

azt írja a bascom hogy nem találja a DAt fileban a changet! ATMEGA64 legujjabb bascom.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha nincsen Change próbáld a Pinchange-t! De kalkuláld be, hogy így 2* annyi megszakítást kapsz. Nem csak felfutó, hanem lefutó élre is.
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

nincs pinchange benne! a 3x annyi se baj csak menne! word be számolom 65000 ig mehet!

az adatlap szerint mindkettő tudja de a bascom nemkezeli a 64ben a changet.

atmega 64 adtalap

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

To avoid unintentional changes of Interrupt Vector
tables, a special write procedure must be followed to change the IVSEL bit:
1. Write the Interrupt Vector Change Enable (IVCE) bit to one.
2. Within four cycles, write the desired value to IVSEL while writing a zero to IVCE.


Bit 0 – IVCE: Interrupt Vector Change Enable
The IVCE bit must be written to logic one to enable change of the IVSEL bit. IVCE is cleared by
hardware four cycles after it is written or when IVSEL is written. Setting the IVCE bit will disable
interrupts, as explained in the IVSEL description above. See code examples below.

atmega 128 adtalap

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

To avoid unintentional changes of interrupt vector
tables, a special write procedure must be followed to change the IVSEL bit:
1. Write the Interrupt Vector Change Enable (IVCE) bit to one.
2. Within four cycles, write the desired value to IVSEL while writing a zero to IVCE.

Bit 0 – IVCE: Interrupt Vector Change Enable
The IVCE bit must be written to logic one to enable change of the IVSEL bit. IVCE is cleared by
hardware four cycles after it is written or when IVSEL is written. Setting the IVCE bit will disable
interrupts, as explained in the IVSEL description above. See Code Example below.
[/code]
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

nem lehet hogy mivel 2 motort egyszerre figyelek int alapon amikor az egyikbe jön az int a másik elbukja olyankor azt az impulzust?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Az infó tényleg kevés:(

A végálláskapcsolón nem muszály a teljes mototáramnak átmenni, a processzor is kezelheti, vagy ha motorvédelem, akkor relét is kapcsolhat...

A pinchange a M64-ben nincs. A 641/1281/2561 chipekben van csak benne...
A változásra ad INT-et...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

A bejövő INT az sorbaállítódik, ha énn INTben vagy. És az előző megszakításból kiléápés során az újonan beesettbe megy bele, KIVÉVE, ha a regiszterét törölted (GIFR)!

INT alatt ha azonos INTből 2 esik be, a második törlődik....
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

milyen infó kellene még?

én egyszerre szeretném számolni a fel és lefuto éleket intben.
2 intel két motort.

A projectről bővebben:
2db egyenáramú motort vezérlek reed relay adja vissza az impulzusokat ami optikailag elvan választva a procitól, ahogy írtam feljebb is.

2 nyomógombbal hajtom a motort fel le. ha gyorsan oda vissza forgatom a motort akkor néha 1-1 impulzust elbukok és ezzel változik az impulzusok száma. Ami nekem hibát jelez.
Mert a szoft elején egy kalibrációs részben megszámolom a motorok teljes impulzus számát. Ez a két végállás kapcsoló közötti táv. Utánna 10-10 impulzust eltartok a két végállástól hogy többet ne nyomja meg. ebben a tartományban mozgatom a motorokat. és ha mondjuk 100 a teljes impulzus a motorban és játszom vele oda-vissza gyorsan. akkor mindig egy egy impulzust elbukok és attól a motor halad előre. így a végén mikor teljesen kimegy a motor nem 100 impulzus lessz hanem csak 90 és akkor újra eléri a végállást.

amúgy nem lenne ezzel baj ha teljesen az elejétől a végéig és vissza menne a motor, mert akkor az aljánál egyet -ba hibáz a tetejénél egyet +ba hibázik így azok összege 0 lenne. ki javítva egymást. de nekem össze vissza is kell tudja mozgatni őket gombal meg mással is.

ez már egy működő project és sajnos ezt a hibát most fedeztük fel. Pedig teszteltük rendesen de most csak szórakozásból nyomogattuk a gombokat és így vettük észre.
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

másik kérdés.

Ha int működik mondjuk pl a portb6-on azon egyszerre int mellet tudom figyelni küülön hogy mikor 1?

leírom szoftosan mire gondolok:

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

config pinb.6 = input

On Int7 1reed                                               'I REED SENSOR
Config Int4 = Rising
Enable Interrupts

Enable Int7


Do

Inf pinb.6 = 1 then
motorstop
else
motorenged

Loop



1reed:
If 1motorfel = 0 Then Incr A
If 1motorle = 0 Then Decr A
Return

valami ilyesmi de ez csak nagy vázlatban .
A lényege hogy a motort akkor álítanám meg amikor éppen a reed össze van zárva. így mindíg magas szint lenne nem tudna téveszteni soha. Mert szerintünk a hiba abból adódik , hogy ha alacsony szint van előre és ott állok meg vissza már felfutás jön ugye és -1 lessz pedig még nem értem el előre el a +1-et.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ami nekem hiányzik:
- a magnes+reed relé prellmentesítése megtörténik?
A pinchange ha nincs benne van más tipp is:
vazlat:

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


Config int1 =falling 'azaz a lefutó élt várod
IntMethod=1
Enable int1
enable interrupts
on int1 INT1van

do
nop
loop


int1van:
if intmethod= 1 then 
   'ez lefuto volt, tessek feldolgozni...
   intmethod=0'a kovetkezo felfuto lesz
   config int1 = rising
   else
   'ez felfuto volt, tessek feldolgozni...
   intmethod=1
   config int1 = falling 'lefuto lesz a kov., ezt varom
end if
return

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

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

Persze. Az INT láb bemeneti láb, így a pin.láb is működik. Azaz nyugodtan használd a pinport.láb formát.
Lehet h a PRG elején nem árt ha a Config intport.lab as input utasítást is berakod. Fontos!
Az int láb ugye nem tud lebegni? fel/lehúzóellenállás is van az optocsatolón?
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

a digitális optocsatoló kimeneti lába fel van húzva a processzorhoz közel.
Prellé mentesítés megoldva.

érdekel nagyon ez a szoft amit írtál csak első olvasásra nem fogtam fel.
meg értettem a dolgot de az intmethod parancsot még nem láttam.

küldök egy doboz csokit ha ez sikerül megoldani ezzel!!!! :D :D
Válasz küldése