Int-ből adódó hiba
Int-ből adódó hiba
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.
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.
É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.

Állítsd be: CONFIG INTx = CHANGE
Minden változásra megszakítást kér.

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)?
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.
Állítsd be: CONFIG INTx = CHANGE
Minden változásra megszakítást kér.
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)?
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:
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?
Í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
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?
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
atmega 128 adtalap[/code]
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.
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.
é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.
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:
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.
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
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.
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:
- 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