megszakítások !! egy pici elakadás!

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
Kapcsolat:

megszakítások !! egy pici elakadás!

HozzászólásSzerző: szovhoz » 2008. május 29. csütörtök, 21:06

egy kicsit elakadtam az új projectben!

de mártartok vele valahol!

ez egy vezérlő lessz zsalukat fog mozgatni a cumó!

van benne egy fázis figyelés egy okos barátomtól aki a nasanal dolgozott még pár éve és most csak az atmeloknak él azt a tanácsot kaptam hogy int0 és int 1-et használjam erre ezért én így cselekedtem!

az adc-ket pedig sub rutinokba tettem!

tehát fut a főprogram amiben figyeli az adc channel0 és channel1 a bejövő ágat amin 0.4v felett vagy alatt van ennek függvényében engedélyezi az egyik motorvezérlő ic-t vagy a másikat ezzel nincs iss gond!

a harmadik adc figyeli az aksikat ha e
gy bizonyos töltöttségi szint alatt elkezd riasztani ami majd egy duda lessz de a proci mindígy csak logikai magas vagy alacsony szintet kell kiadjon magából! ez a rész is működik szépen! a riasztást utánn egy reset gomb megnyomásával ki lehet kapcsolni de attól még egy led bekapcsolva marad ami jelzi hogy az aksit lassan ki kell cserélni!

a reset gomb az int1 megszakítás kezeli ez is működik!

a gond a fázis figyeléssel van! a proci figyeli hogy elmegy e az áram vagy nem ha elmegy az aksisk tartják jó pár órán át a rendszert 3db aksi 12v 1.3mAh-ak! ezzel 5x lehet a 2 motort fel le engedni!

az kellene valahogy elérnem hogy a pillanatnyi áram ingadozásokat ne vegye észre a proci csak mondjuk azt hogy elmegy az áram és ki is marad legalább 10s ig!

a másik hogy a kiamaradás után egyből felgyulladjon a led Riaszt Alias Portc.3 -on de maradjon égve 1s idejig viszont közben attól az adc folyamatosan figyeljen! és ha gebasz van akkor vinnyogjon a dudám!

természetesen a reset gomb megnyomásra ez is ki kell aludjon!

kb ennyi majd még lesznek gondok itt az edig megírt program ami működik issss!

kivéve a két hibát ami fontos!

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

$regfile = "M16def.dat"
$crystal = 16000000


Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Pinb.2 = Input
Config Pina.0 = Input
Config Pina.1 = Input
Config Portc = Output
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Portc.3 = Output
Config Portc.2 = Output
' megszakításhoz       ------------------------
On Int0 Fazisjel
On Int1 Resetgomb
Config Int0 = Falling
Config Int1 = Rising
Enable Interrupts
Enable Int0
Enable Int1
' megszakításhoz vége  -------------------------


Rem Nyomógombok
Fazis Alias Pinb.2
Fgomb Alias Pinb.0                                          ' fel állítása
Lgomb Alias Pinb.1                                          ' le állítása
E1 Alias Portc.7
E2 Alias Portc.4
L12 Alias Portc.6
F12 Alias Portc.5
Riaszt Alias Portc.3
Akkuled Alias Portc.2
Dim Ido As Byte
Dim A As Byte
Dim W As Word , Channel1 As Word
Channel1 = 0
Dim Z As Word , Channel2 As Word
Channel2 = 1
Dim X As Word , Channel3 As Word
Channel3 = 2
Const Debouncetime = 75
Admux = &B01000000

Declare Sub Adccurrent1(byref Channel1 As Word , W As Word )
Declare Sub Adccurrent2(byref Channel2 As Word , Z As Word )
Declare Sub Adccurrent3(byref Channel3 As Word , X As Word )

Start Adc

Riaszt = 1
A = 1
                                                   'Call Fazis0(a)



Do

Disable Int0
Call Adccurrent1(channel1 , W)
Call Adccurrent2(channel2 , Z)
Call Adccurrent3(channel3 , X)
Enable Int0

'L12 = 1
'F12 = 1


Waitms 50
If Fgomb = 0 Then F12 = 1 Else F12 = 0

Waitms 50
If Lgomb = 0 Then L12 = 1 Else L12 = 0



Loop                                                        ' Until Fazis = 1


Fazisjel:
L12 = 1
[color=red]Waitms 100[/color]
Riaszt = 0
[color=red]Waitms Debouncetime[/color]
Return

Resetgomb:
Riaszt = 1
Waitms 50
Return

Sub Adccurrent1(byref Channel1 As Word , W As Word )        ' adc 1 sub
W = 0
W = Getadc(channel1)
If W => 160 Then E1 = 0 Else E1 = 1
End Sub



Sub Adccurrent2(byref Channel2 As Word , Z As Word )        ' adc 2 sub
Z = 0
Z = Getadc(channel2)
If Z => 160 Then E2 = 0 Else E2 = 1
End Sub

Sub Adccurrent3(byval Channel3 As Word , X As Word )        ' adc 3 sub

X = 0
X = Getadc(channel3)

If X => 1000 Then Akkuled = 0 Else Akkuled = 1
If X <= 1000 Then Riaszt = 0


End Sub


End

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10064
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2008. május 29. csütörtök, 21:43

Feszingadozást hogy nézed?
a, A bemeneten ellenállásosztó van? ha igen, egyszerű: Ha 10k-1k leosztás van, akkor az 1k (ez van a GND fele) ~100uF kondit tegyél oda. Ez bufferel... i
b, a vett adatok utolsó 10 darabját jegyzed, és átlagolod. Így a tüskéket sikerül átlagolnod.... Azaz nem lesz megrántrása a mért adatoknak.... Ez az ún. futóátlag....

A LED be/kikapcsolást egy szubrutinba tedd bele, vagy egy belső változó, ami H/L állapotot írja le.
Én az 1sec-t úgy saccolnám, hogy ennyi idő alatt a Do-Loop lefut ~150235-szor. Igy egyszerűen egy long tip. változót léptetném, akkor ha a RisztóLED=1. Ha eléri a longf változó a 150235-t, akkor LED kiolt és számláló nulláz.

/off
U.i.: az írásjeleket ha kiraknád, sokkal könyebben olvasható lenne az írás, 1-2 helyen nem igazán világos - pont emiatt.

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. május 31. szombat, 12:55

az adc channel3 figyeli a fázist!

hardveres dolgokat nem tudok mondani csak softvert írok és stk500-ban tesztelgetem! eddig!

a számlálós várakozásos részt nem értem!

Én úgy szeretném megoldani hogy párhuzamosan egyszerrre több dolgot csináljon a procim! az adc-t figyelje mind a 3-at, és mellette szépen számoljon vissza 1s ideig.

mi volt amit nem értettél leírom újra szívesen!

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. június 1. vasárnap, 18:37

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

Fazisjel:
L12 = 1
Waitms 100
Riaszt = 0
Waitms Debouncetime
Return



ezt a rész hogyan lehetne mondjuk 1s idővel eltolni?

arra gondoltam hogy egy for ciklussal megírom hogy vizsgálja meg többször mondjuk 1000x és ha akkor is fen áll a megszakítás akkor riasztást bekapcsolhatja de nem jó mert akkor a proci addig egyhelyben áll!
Az adc-ket pedig addig nem tudja figyelni nekem ez a legnagyobb gondom!

Meg kellene valahogy oldalni?

ötlet?

Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00
Tartózkodási hely: Törökbálint

HozzászólásSzerző: herc1234 » 2008. június 2. hétfő, 11:57

Nekem erre volna ötletem
ugyanazt a változót használnám arra hogy a fázisjelet "flageljem"
ill. egy timer 1s megszakításonként figyelje és törölje az
állapotot...
bár konkrét kód elképzelésem nincs
mert én a hasonló problémát hardwaresen oldottam meg..

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. június 3. kedd, 4:50

hrdveresen se lehet pontosan csak időzítő ic vel!

de hogyan oldanád meg hardveresen egy kacsolást mutass!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10064
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2008. június 3. kedd, 4:57

Belső timer használata.....

Kérdés, hogy kell-e kristálypontos 1 sec.....



Tipp: Ezt a gombfigyelést kirakod szubrutinba. A főprogramodból meghívod, és belül növelsz egy változót. Ha aváltozó egy kritikus értéket átlép, akkor riasztasz.
Kérdés, hogy ha az 1 sec, 1.05 sec az zavaró-e?

Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

HozzászólásSzerző: kovacsna » 2008. június 3. kedd, 7:53

Szia.

Én ezt használnám: Moeller EMR4-A.

Háromfázisú hálózatokon a fázisok aszimmetriájának figyelése.
Fáziskiesés felismerése, motor 95%-os feszültségvisszatáplálása esetén
Meghúzáskésleltetés 0,5 s.
Beállítható aszimmetriaküszöb:
– 15%.
Fázissorrend felismerése.
Tápfeszültség = mérőfeszültség

Erre találták ki. Minden csoda dolgot figyel a fázisokkal kapcsolatban a végén meg van egy morze érinkező amit tudsz figyelni a controllerel.
Megspóroltál sok programozást, hibalehetőséget.
Nem olcsó valószínűleg, de ilyen esetben szerintem nem nem kell spórolni.
Mert az kevés ha fáziskimaradást figyelsz. Mivan ha eltolódnak a fázisok?
A fázisszög figyelése azért nem egyszerű dolog!

Üdv

Kovács Nándor

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. június 3. kedd, 8:49

Robert írta:Belső timer használata.....

Kérdés, hogy kell-e kristálypontos 1 sec.....



Tipp: Ezt a gombfigyelést kirakod szubrutinba. A főprogramodból meghívod, és belül növelsz egy változót. Ha aváltozó egy kritikus értéket átlép, akkor riasztasz.
Kérdés, hogy ha az 1 sec, 1.05 sec az zavaró-e?


ezt a dolgot leírnád bascom nyelven is mert én megpróbáltam de nem sikerült és nem probléma ha több lesz belőlle is akár 2s is lehet! a lényeg hogy ki küszöböljem a pillanatnyi ingadozást pl vihar esetén csak a folyamatost jelőlje!

A másik hogy ezt nem csak úgy magától fogja van valami hardveres eszköz ami jelez nekem a procihoz de azt nem tudom hogy működik csak magas és alacsony szintet kell figyelnem! Lehet pont az amit teh írsz de ez a feladat és megoldásra vár!

A pénz számít mivel minél több dolgot integrálok a prociba annál kevesebb alkatrész kell az egészhez és azzal nagyon haszon realizálás lessz! Hisz mindenki ezért dolgozik :D!

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. június 6. péntek, 5:55

Azt szeretném tudni hogy néhány értéket el e tudok tárolni a proci eeprom-jában?

hogy ha véletlen le álla rendszer akkor onann vissza tudjon mindent állítani magának.

míndíg beírná és induláskor lekérdezné!

az elején minden érték még 0 de később már nem.

ez azért fontos mert a zalu mozgató motorok impulzusokat adnak ki pontosan nem tudom memnnyit de szeretném ha megszámolná a proci hogy mennyi a max impulzus és a fel le kimenet állásásból eltudja dönteni - vagy +-ba megy!

azért van erreszükség hogy a kézi vezérlésnél ne tudja az illető lejjebb vagy feljebb húzni így teljesen lenegedi magát a rendszer majd és onann vissza számol 10 impulzust. Ez lessz a 0 pontja ehez fog számolni majd. Egy Word válztozóban elférnek az impulzusok. az nem nagy szám.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10064
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2008. június 6. péntek, 7:35

/off
Nem lehetne, hogy vessző is kerüljön a mondatokba? kb. 4 perc volt mire értelmeztem....
/on


EEPOROMba byte-ket tudsz letárolni.
Writeeeprom illetve Readeeprom utasítás.

A wordot bytera szétszedni a:
alsó=low(word) és a
felső=high(word)
lehet.

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. június 6. péntek, 8:21

bocs! Meg próbálom a vesszőket is felhasználni!

Mutatnál rá egy minta példát?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10064
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2008. június 6. péntek, 9:03

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

$regfile = "m48def.dat"                                     ' specify the used micro
$crystal = 8000000                                          ' used crystal frequency
$baud = 19200                                               ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

'dimension some variables
Dim W As Word

'You can also dimension variables that must be stored into EEPROM

Dim Ew As Eram word At 20

'We use the AT to indicate the address because we are using both modes in this example
'Normally you dont need this
'Ezek alapban az EEPROM helyen tárolódó változók. FONTOS: közel em változó értéke legyen, mert az EEPROM 100.000 írást bír ki!

W=65123
'write word
Writeeeprom W , 11
'11 és 12. címre ír.

Readeeprom W , 11
Print W
'11,12ről olvassa vissza

'Fontos: Word/long/Integer szintű írás-olvasás csak a 1.11.8.1 (?) verziótól működik, a 1.11.7.4-ben nem!

'Egyszerűbb:
'De:
Ew=65345
'Kikapcs és ezt  a sort REMeld ki


W=Ew
Print "Ew:";Ew
Print "W :";W



Az EEPROM 0. címére ne írj, mert áramkimaradáskor adatvesztés lehet!
Fontos még, hogy EEPROM írása alatt nem fogyhat el az áram, mert a címen levő beírás alatti adat sérül!

Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00
Kapcsolat:

HozzászólásSzerző: szovhoz » 2008. június 6. péntek, 9:52

Azért tettük az aksit, hogy 5 órát bírjon a rendszer ha véletlen elmegy az áram.

Köszi a mintaprogit okosan fogom használni!

amikor elmegy az áram a zsalukat le kell engedni.
Amikor vissza jön, eeprom alapján vissza állítani eredeti helyzetbe ahol volt előtte!

Közben manuálisanszabályozható a dolog.

elég összetett a rendszer.

sokszámítást kell végezni a procival majd, a pontos pozíció miatt.

még nem találtuk ki pontosan hogyan fog ez működni, ma esünk neki! tegnap csak az impulzus számolássával babráltunk. majd írok fejleményeket.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10064
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2008. június 6. péntek, 10:46

Lehet érdemes lenne egy "eseménytár", ami főbb üzemzavarokat/hibákat naplózza. I2Cs eeprom, pl.

Itt óra/perc: áram elment, zsalu megszorult stb.....
Utána könnyű kezelni a hibákat:)


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: Bing [Bot] valamint 1 vendég