 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Pon Dec 12, 2005 8:53 am Naslov sporočila: Kako sprogramirati dvigalo v BASCOM-AVR |
|
|
Delam na projektu "Dvigalo za 3 nadstropja". Dvigalo sem že naredil z alfa mikrokontrolerjem, z profi labom itd, ker pa iščem najcenejšo rešitev sem se odločil, da nekako osvojim delo z AVR. V takšnem programiranju sem nov in prosim za pomoč.
Naj opišem, kako bi izgledal moj projekt.
Sprogramirati nameravam dvigalo za tri nadstropja Z vhodi T1, KS1,T2, KS2, T3, KS3 (Tx je tipka s katero prikličemo dvigalo v toločeno nadstropje, KSx pa je končno stikalo nadstropja. Izhoda pa sta, MG MD ( Motor Gor in Motor Dol)
****************************************************************************************
Kombinacije dvigala:
1.Potovanje gor:
- Potovanje iz 1. nadstropja v 2.
MG se aktivira, ko je KS1 = 1 in pritisnemo tipko T2. Dvigalo začne potovati gor, Mi spustimo T2, KS1 se zaradi potovanja dvigala razklene, MG se ustavi šele ko se sklene KS2.
- Potovanje iz 2. nadstropja v 3.
MG se aktivira, ko je KS2 = 1 in pritisnemo tipko T3. Dvigalo začne potovati gor, Mi spustimo T3, KS2 se zaradi potovanja dvigala razklene, MG se ustavi šele ko se sklene KS3.
- Potovanje iz 1. nadstropja v 3.
MG se aktivira, ko je KS1 = 1 in pritisnemo tipko T3. Dvigalo začne potovati gor, Mi spustimo T3, KS1 se zaradi potovanja dvigala razklene, MG se ustavi šele ko se sklene KS3.
Potovanje dol:
Potovanje iz 3. nadstropja v 2.
MD se aktivira, ko je KS3 = 1 in pritisnemo tipko T2. Dvigalo začne potovati dol, Mi spustimo T3, KS3 se zaradi potovanja dvigala razklene, MD se ustavi šele ko se sklene KS2.
Potovanje iz 2. nadstropja v 1.
MD se aktivira, ko je KS2 = 1 in pritisnemo tipko T1. Dvigalo začne potovati dol, Mi spustimo T1, KS2 se zaradi potovanja dvigala razklene, MD se ustavi šele ko se sklene KS1.
Potovanje iz 3. nadstropja v 1.
MD se aktivira, ko je KS3 = 1 in pritisnemo tipko T1. Dvigalo začne potovati dol, Mi spustimo T1, KS3 se zaradi potovanja dvigala razklene, MD se ustavi šele ko se sklene KS1.
****************************************************************************************
Nekaj sem že sprogramiral, vendar pa ta zadeva deluje zelo čudno oziroma sploh ne deluje .
Moj program:
Koda: |
'Program - DVIGALO"
' definicija vhodno izhodnih spremenljivk"
Dim Ks1 As Bit
Dim T1 As Bit
Dim Ks2 As Bit
Dim T2 As Bit
Dim Ks3 As Bit
Dim T3 As Bit
Dim Mg As Bit
Dim M1 As Bit
Dim M2 As Bit
Dim M3 As Bit
Dim M4 As Bit
Dim Md As Bit
Ks1 Alias Pind.0
T1 Alias Pind.1
Ks2 Alias Pind.2
T2 Alias Pind.3
Ks3 Alias Pind.4
T3 Alias Pind. 5
Mg Alias Portb.4
Md Alias Portb.3
M1 Alias Portb.2
M2 Alias Portb.1
M3 Alias Portb.0
M4 Alias Portd.6
Config Portd = &B1011111
Portd = 255
Config Portb = 255
Portb = 1
Do
Reset M1
Reset M2
Reset M3
Reset M4
'Potovanje gor"
'potovanje iz 1. v 2. nadstropje"
If Ks1 = 1 Then
If T2 = 1 Then
Mg = 1
End If
End If
If Ks2 = 1 Then
Mg = 0
End If
'potovanje iz 2. v 3. nadstropje"
If Ks2 = 1 Then
If T3 = 1 Then
Mg = 1
End If
End If
If Ks3 = 1 Then
Mg = 0
End If
'potovanje iz 1. v 3. nadstropje"
If Ks1 = 1 Then
If T3 = 1 Then
Mg = 1
End If
End If
If Ks3 = 1 Then
Mg = 0
End If
'Potovanje dol"
'potovanje iz 3. v 2. nadstropje"
If Ks3 = 1 Then
If T2 = 1 Then
Md = 1
End If
End If
If Ks2 = 1 Then
Mg = 0
End If
'potovanje iz 2. v 1. nadstropje"
If Ks2 = 1 Then
If T1 = 1 Then
Md = 1
End If
End If
If Ks1 = 1 Then
Mg = 0
End If
'potovanje iz 3. v 1. nadstropje"
If Ks3 = 1 Then
If T1 = 1 Then
Md = 1
End If
End If
If Ks1 = 1 Then
Md = 0
End If
Loop |
Za pomoč se že v naprej zahvaljujem |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Pon Dec 12, 2005 12:46 pm Naslov sporočila: dvigalo |
|
|
Na tvojem mestu bi rajši uporabil ukaz debounce kot samo preverjanje tipk.
Kaj pa so M1 M2 M3 M4?
Program kot ga imas sigurno ne deluje:
'Potovanje gor"
'potovanje iz 1. v 2. nadstropje"
If Ks1 = 1 Then
If T2 = 1 Then
Mg = 1
End If
End If
tole je samo del tvojega programa, takoj ko spustis tipko ni vec pogoja za MG=1.
Predlagam da opazujes tipke in potem skocis na podprogram ki bo izvedel operacijo ki jo zelis glede na pritisnjeno tipko in trenutni polozaj dvigala.
Ce ne bo slo se oglasi pod zasebno.
Vlado |
|
Nazaj na vrh |
|
 |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Pon Dec 12, 2005 3:01 pm Naslov sporočila: |
|
|
Hvala za odgovor.
Kot sem že omenil sem na področju programiranja nov in ŠE ne vem skoraj nič. Prosil bi za kak primer s tem "debounce" ukazom glede na moje potrebe.
M1 M2 M3 M4 so izhodi ki jih kasneje mislim uporabit Za prikazovalnik BCD kode za njimi priključit BCD/7seg dekoder in na njega diplay, to bi mi prikazovalo trenutno nadstropje, ampak zaenkrat bi bilo dovolj dvigalo, tisto za BCD bo pomoje še najmanjši problem .
Glede tega dela programa:
Koda: |
'Potovanje gor"
'potovanje iz 1. v 2. nadstropje"
If Ks1 = 1 Then
If T2 = 1 Then
Mg = 1
End If
End If
If Ks2 = 1 Then
Mg = 0
End If |
Ko sem sprogramiral samo to je zadeva delovala ko sem pritisnil obe tipki naenkrat "1&1" se je aktiviral izhod in je ta ostal aktiviran neglede na stanja na vhodu. Stanje na izhodu je bilo "0" šele, ko se pritisnil tipko za ta namen, v mojem primeru Ks2. Problemi so nastajali, ko sem začev dodajati druga nadstropja. |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Dec 12, 2005 3:28 pm Naslov sporočila: |
|
|
MIKRON,
En splošen nasvet. Kljub navidez enostavnosti je dvigalo zelo zahteven projekt. Zato ti kot prvo svetujem, da si narišeš digagram poteka. Dvigalo namreč ni le upravljanje motorja za vožnjo gor dol ter tipke za klic ter tipke za izbiro v dvigalu. Dodati moraš se vse "varovalke" kot so fotocelice na vratah, če gre za avtomatska vrata mehanske omejitve, zaklepanje vrat, zasilni izklopi, ... itd...
Sam sem pred časom delal eno podobno zadevo (dvigalo za hrano, ki je vozilo le med nastropji) Moram reči, da mi je stvar vzela kar precej časa, da sem jo sprvil do meje, da je delalo kot je treba. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Pon Dec 12, 2005 4:27 pm Naslov sporočila: |
|
|
Že, ampak to je testna zadeva, ki ne bo prevažala ničesar, rabi samo stvari ki sem jih opisal. To je projekt, ki ga izdelujem v šoli, in tam imajo že narejen modul. Motor, ki preko "vijačnega" prenosa premika "kletko". Na voljo so 3 končna stikala in 3 tipke. Ta kletka pa se mora, dvignit za toliko kolikor šefe pritisnejo . Ko bojo pa hoteli imeti še kakšne druge stvari, varnostne senzorje... bodo pa moralii dati na voljo še kaj druga ko pa AT90S2313, ki ga trenutno uporabljam. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pon Dec 12, 2005 4:56 pm Naslov sporočila: |
|
|
Na podlagi dodatnih informacij sklepam, da potovanje gor in dol ni trenutno in se motor tudi sam ne ustavi, ko pride dvigalo do cilja. Sam bi se zadeve lotil drugace:
- na zacetku programa cakas na pritisk tipke v neskoncni zanki; po pritisku mora biti cilj drugacen od trenutnega nadstropja, kar ti pove vhod [slovenščina je zame španska vas], ce prav razumem. Ob tem upostevaj morebitne prednostne pomike (recimo da je zazeljeno, da se dvigalo raje premakne samo eno nadstropje kot pa dve, torej stanje vseh treh tipk hkrati odcitaj kot eno vrednost in nato obravnavaj to vrednost po prednostnih kriterijih).
- glede na dejstvo, da je moznih kombinacij nadstropij, med katerimi se je potrebno premakniti zelo malo, je bolj enostavno obdelati vsako kombinacijo posebej, ceprav v splosnem taka resitev ni najbolj elegantna. To torej pomeni, da glede na ciljno nadstropje skocis na zanko (oz. poklices proceduro; preberi help za ukaz "gosub"), ki spravi dvigalo v ustrezno nadstropje (spodaj je primer samo za eno od kombinacij, mislim, da bos znal ostale dodati sam)
- premik dvigala iz 3. v 1. nadstropje (primer): vkljucis motor za pomik navzdol (Md = 1) ter v zanki spremljas pozicijo dvigala (moj basic je zelo "zrjavel", a zdi se mi, da v basicu tudi obstajajo while zanke) in dokler je pozicija drugacna od koncne vztrajas v zanki, ko pa je vendarle enaka zeljeni (v tem primeru Ks1 = 1), pa motor ugasnes (Md = 0) in gres ven iz te procedure oz. skocis na zakljucek glavnega programa (odvisno od izvedbe) ter cakas na nov pritisk gumba. Vse ostale pritiske med voznjo tako ignoriras.
Rabis se pomik dvigala iz 3. v 2., iz 1. v 2. ter iz 1. v 3. nadstropje po zvornjem primeru in to je vse.
Pa se to: ce je naloga ocenjena s stevilsko oceno (torej ne samo "opravil" oz. "ni opravil"), potem bi jaz kot ucitelj dal visjo oceno za splosno resitev, brez obravnavanja vseh stirih moznih kombinacij posebej, za zgoraj opisano pa le pozitivno in nic vec. Mocno ti svetujem, da sam prides tudi do splosne resitve (torej ko bos obravnaval le dva primera - ali je treba pognati motor navzdol ali navzgor, ne glede na to, koliko nadstropij je vmes in preverjati, ali si ze prisel do koncne postaje ali ne) in jo ucitelju tudi predstavis, ter pojasnis, zakaj je za tako enostaven primer sicer posebna resitev (opisana zgoraj) cisto dovolj dobra in prakticno enako ucinkovita, takoj ko se spremenijo razmere (recimo da imas deset ali sto nadstropij namesto treh), pa postane povsem nesmiselna, saj stevilo kombinacij narasca cez vse meje, s tem pa tudi velikost tako "butasto" napisanega programa. Splosna resitev se poveca le marginalno, ce dodas recimo 1000000 nadstropij in v tem je (po moje) car programiranja - ucinkovitost. Splosno resitev za bistveno vec kot tri nadstropja bi se vseeno lahko izvedel z izbranim mikrokontrolerjem (in nekoliko bolj smotrno uporabo I/O linij) ali pa z katerim od vecjih bratov doticnega mikrokontrolerja - program lahko ostane prakticno isti. |
|
Nazaj na vrh |
|
 |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Pon Dec 12, 2005 7:32 pm Naslov sporočila: |
|
|
Sokrat je napisal/a: |
Na podlagi dodatnih informacij sklepam, da potovanje gor in dol ni trenutno in se motor tudi sam ne ustavi, ko pride dvigalo do cilja. |
Motor se ustavi takrat ko pride do cilja in sklene katero od končnih stikal.
Sokrat je napisal/a: |
To torej pomeni, da glede na ciljno nadstropje skocis na zanko (oz. poklices proceduro; preberi help za ukaz "gosub"), ki spravi dvigalo v ustrezno nadstropje |
Ja, zgleda da bo res v tem rešitev. S Vladovo pomočjo spoznavam ukaz debounce in nastal je testni program:
Koda: |
Do
Debounce T1 , 0 , I_nadstropje , Sub
Debounce T2 , 0 , Ii_nadstropje , Sub
Debounce T3 , 0 , Iii_nadstropje , Sub
Loop Until Ks3 = 1
I_nadstropje:
If Ks1 = 1 Then
Set Mg
Else
Reset Mg
End If
Return
II_Nadstropje:
If T1 = 1 Then
Set Mg
Else
Reset Mg
End If
Return
III_nadstropje:
If Ks1 = 1 And Ks2 = 1 Then
Set Mg
Else
Reset Mg
End If
Return |
Ko program preizkusim mi ne javi nobene napake, vendar ko hočem program presneti na čip, se pisanje programa pa 1/4 ustavi. ZAKAJ?
Sokrat je napisal/a: |
Splosno resitev za bistveno vec kot tri nadstropja bi se vseeno lahko izvedel z izbranim mikrokontrolerjem (in nekoliko bolj smotrno uporabo I/O linij) ali pa z katerim od vecjih bratov doticnega mikrokontrolerja - program lahko ostane prakticno isti |
Če bi delal dvigalo za več nadstropji potem, bi resno premislil ali se mi bolj splača kupiti zmoglivejši mikrokontroler ali pa vhode in izhode tega pomnoževati naprimer na 2 na peto možnih kombinacij. Pomoje je bol racionalno uporabiti zmoglivejši mikrokontoler.
Bolje, da začnem pri treh nadstropjih in se začnem učiti postopoma. Nadstropja se bodo pa nizala, z nizanjem mojega znanja. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pon Dec 12, 2005 10:02 pm Naslov sporočila: |
|
|
S tem sem hotel poudariti, da ce prides do splosne resitve, bos tudi posebno lazje naredil in bos tudi razumel kdaj je katera boljsa (mejni primeri, kot bi recimo bil tak samo z dvema nadstropjema in torej tudi samo dvema moznima pomikoma).
Zdaj pa k tvojemu programu: na basic se sicer ne razumem, mislim pa, da si program napisal narobe. V cem je smisel tistega pogoja Ks3 = 1 ? Ce sem prav razumel nalogo, mora program teci v neskoncnost in vsakic, ko stoji pri miru, upostevati pritisnjeno tipko in ustrezno odreagirati, tvoj program pa bi tekel dokler ne pride dvigalo do vrha (Ks3 = 1) in potem ne bi bilo vec nic (mikrokontroler bi se najbrz zaciklal).
Tudi preostanek kode se mi zdi nenaveden - kako je lahko hkrati Ks1 = 1 And Ks2 = 1, ce je stikalo sklenjeno, ko je dvigalo v doticnem nadstropju (in ne more biti v dveh hkrati) ?
Ti moras najprej preveriti, katera tipka je pritisnjena in ali se trenutno nahajas v nadstropju, ki ravno ustreza tej tipki (v tem primeru pritisk ignoriras in spet beres stanje tipk, torej ce je T3 pritisnjena in Ks3 = 1, potem ne naredis nic z dvigalom). Ce je pritisnjena tipka, v nadstropju katere se ne nahaja dvigalo (recimo T3 je pritisnjena in Ks1 = 1), potem preveris kje se nahaja dvigalo in ustrezno ukrepas - torej ce je T3 pritisnjena, preveris ali je Ks1 = 1 (torej moras dati komando za voznjo navzgor najprej enkrat, da prides v drugo nadstropje, potem pa se enkrat, da prides v tretje) oz. ali je Ks2 = 1 (torej moras dati komado za gor samo enkrat); to da bi bil Ks3 = 1 ves da ni res, ker si ravno pred tem preveril. Ko si v tretjem nadstropju skocis ven iz procedure za pritisnjeno tipko T3 spet v glavo zanko, v kateri preverjas stanje tipk in katera mora teci v neskoncnost.
Analogno velja za tipki T1 in T2, s tem, da je premik dvigala seveda drugacen (pri T1 samo enkrat ali dvakrat navzdol, pri T2 pa lahko ali navzgor ali navzdol, vsako samo po enkrat). |
|
Nazaj na vrh |
|
 |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Tor Dec 13, 2005 1:10 am Naslov sporočila: |
|
|
Sokrat Vezje ki je napisano zgoraj je bil sam test, namen je bil spoznati funkcijo "debounce". Program nima veze z dvigalom, je pa osnova ki jo imam namen preprogramirati v meni zadovoljivo programsko kodo.
Krivda je moja:
MIKRON je napisal/a: |
Ja, zgleda da bo res v tem rešitev. S Vladovo pomočjo spoznavam ukaz debounce in nastal je testni program: |
Slabo sem se izrazil, se iskreno opravičujem! Testni bi moral zamenjati z kakšno drugo besedo oz. s stavkom.
S programom napisanim zgoraj sem hotel opazovati preskoke med "sub" ter "Naslov:" Treba je vsako funcijo spoznati čim bolj temelito, saj ne bom v življenju programiral samo dvigal . |
|
Nazaj na vrh |
|
 |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Tor Dec 13, 2005 2:05 pm Naslov sporočila: |
|
|
MIKRON je napisal/a: |
Ko program preizkusim mi ne javi nobene napake, vendar ko hočem program presneti na čip, se pisanje programa pri 1/4 ustavi. ZAKAJ? |
Do zdaj mi to ni delalo težav, samo pri tem pogramu se mi ustavi.
A se je to komu že dogajalo? In če se je, kako je odpravil napako? Ali je morda krivo to, da je moj program (BASCOM-AVR) demo? |
|
Nazaj na vrh |
|
 |
MIKRON Član


Pridružen-a: Pon 12 Dec 2005 8:37 Prispevkov: 10 Aktiv.: 0.04 Kraj: Velenje
|
Objavljeno: Tor Dec 13, 2005 4:49 pm Naslov sporočila: |
|
|
Zdaj pa mislim da sem napredoval .
Napisal sem program. Program sem uspešno prenesel na mikroprocesor. Neverjetno je, da celo dokaj dobro deluje. Treba bo odpraviti hrošča, da bom lahko tipko pritisnil in spustil in bo zadeva delala. V tem primeru moram tipko držati, dokler ne pride dvigalo na cilj. Kakšne ideje?
Pa še moje čudo :
Koda: |
Do
If T1 = 1 Then Gosub I_nadstropje
If T2 = 1 Then Gosub Ii_nadstropje
If T3 = 1 Then Gosub Iii_nadstropje
Loop
I_nadstropje:
If Ks3 = 1 Then Md = 1
If Ks3 = 1 Then Mg = 0
If Ks2 = 1 Then Md = 1
If Ks2 = 1 Then Mg = 0
If Ks1 = 1 Then Md = 0
If Ks1 = 1 Then Mg = 0
Return
Ii_nadstropje:
If Ks3 = 1 Then Md = 1
If Ks3 = 1 Then Mg = 0
If Ks2 = 1 Then Md = 0
If Ks2 = 1 Then Mg = 0
If Ks1 = 1 Then Md = 0
if ks1 = 1 then mg = 1
Return
III_nadstropje:
If Ks3 = 1 Then Md = 0
If Ks3 = 1 Then Mg = 0
If Ks2 = 1 Then Md = 0
If Ks2 = 1 Then Mg = 1
If Ks1 = 1 Then Md = 0
if ks1 = 1 then mg = 1
Return |
|
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Tor Dec 13, 2005 5:10 pm Naslov sporočila: |
|
|
Se tretjic: ne skoci takoj na zacetek programa ko se dvigalo zacne premikati, ampak pocakaj v while znaki da pride do naslednje/koncne postaje in potem ustrezno ukrepaj - ce je postaja vmesna, potem se enkrat pozenes dvigalo in pocakas da pride na cilj, sicer pa skocis spet na zacetek programa (= ven iz tvoje procedure). |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|