Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

pici progemine

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    pici progemine

    Tere kõigepealt.

    Paljud igalpool foorumites vaidlevad et milline keel na kõige parem algajale on jne.
    Mina ka siin mõnda aega küberneerinud ja kuna pic on tiba teine teema siis
    koolis kasutasime pic-i progemisel alustuseks suht mugavat proget (just simuleerimise kohalt, indikaatorid) Pic Simulator IDE-t. Mõne aja möödudes jõudis kohale, et assembleri all ma oma projektiga kaugele ei jõua ja seega sai proget hakatud tegema
    Basic compilerit kasutades.

    Siit ka küsimus: Kuidas on võimalik käitatavat tsüklit hoida töös kindla aja jooksul?

    Tegu on sammmootori tarbeks väljundite tsükliga, seda vastavalt sisendile töös hoida ja luupida saab alati aga kas on võimalik anda ette kindel aeg ja teha talle selgeks et tee seda just nii kaua.

    #2
    kasuta interrupte ja sisemist kella selleks. vaata, mida su compilaatori help ütleb interruptide kohta.

    PS+OT: mis koolis pici progremist õpitakse?

    Comment


      #3
      loop'i while'ga niikaua, kuni mingi register enam null ei ole või kui nulliks saab. Seda registrit muudad siis taimeri katkestusest (kasulik on näiteks taimeri katkestuses sellest registrist üks maha lahutada kui ta juba null ei ole. Põhiprogrammis muudad ta siis mittenulliks ära ja ootad kuni nulli tagasi jõuab. Saad kenasti erineivaid viiteid teha).

      Teiseks,
      Miks sa tahad programmi põhitöö selleks ajaks peatada, kui mootori loop ootab? Parem tee juba kogu mootori juhtimine katkestusprogrammi töös ja peaprogramm saab siis, kui mootorit just ei muudeta, midagi muud tarka teha.


      Keele kohapealt niipalju:
      Kontrolleritele suhteliselt default keel on c. Seda just seepärast, et c on piisavalt riistvaralähedane ja sellega kirjutades on peaaegu täpselt teada, mis asm sellest transleeritakse. Muidugi c on ka seetõttu suhteliselt kergelt vigu läbi laskev keel - kui ikka mingi kood mingilgi moel on võimalik ära transleerida, siis seda ka tehakse sõltumata seal olevatest jaburustest.
      Assembleri poole pöördutakse siis, kui c jääb liiga aeglakseks. Kui on vaja ikka kontrollerist viimast võtta, siis väga hea assembleri oskusega ja kontrolleri raua tundmisega võib veel üksjagu kavalusi rakendada ja koodi optimeerida.
      Igasugused veel kõrgema taseme keeled kui c eriti kontrolleri jaoks ei kõlba, sellega lähed rauast liiga kaugele ja asi läheb ebaoptimaalseks.

      OT: Miks sa AVR'i ei kasuta? Vaata näiteks ATMega88 datasheeti ja hinda. Pole nagu võrreldav PIC'idega.

      Comment


        #4
        Originally posted by bloody-orc@Feb 22 2006, 20:24
        PS+OT: mis koolis pici progremist õpitakse?
        Tallinna polütehnikkumis neljandal kursusel.
        Pic-i osa on mind juba jupp aega huvitanud.
        kolmandal kursal loeti ka AVR-i aga see oleneb vahest ka õppejõust, kes millist mikroprotsessorit vajalikumaks peab või kuidagi nii(ok õppejõud on küll mõlemal juhul sama)

        Comment


          #5
          mulle esimesena pakutigi interruptidega aga too tundus algul suht keerulisena aga eks tuleb kõik läbi otsida

          Comment


            #6
            Aga kui natuke aega oled progenud, näed, et katkestused on maru kasulikud. Sa ei pea pidevalt mingit pinni või taimerit vms. kontrollima: kohe kui sündmus toimub, siirdutakse automatselt teenindavat alamproget täitma. Ei tohi vaid lasta katkestusel põhikoodi registreid solkida lasta.
            Sinu koodis paneksin taimeri sobivat aega tiksuma. Kui taimeri katkestus tuleb, on aeg täis. Katkestusprogramm laeb taimeri uuesti, täidab vajalikud ülesanded ja kõik( võib veel arvestada katkestuse teenindamisele kuluvat aega uue vääärtuse laadimisel taimerisse - aeg tuleb täpsem).
            - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
            - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

            Comment


              #7
              ahjaa... kui sa katkestust ei taha kasutada, siis on võimalik kasutada ikka taimerit ning ainult kontrollida taimeri poolt püsti pandavat katkestuse lippu, selle püsti tulemisel siis teed töö ära ja võtad lipu maha. See variant on näiteks siis hea, kui sa ei taha igal ajal katkestusel toimuda lasta (näiteks põhiprogramm mõõdab mingit ajast sõltuvat asja ja seda mõõtmist ei tohi vahepeal katkestada millegi muu juhtimiseks... Siis mõõdad ära ja pärast teed selle juhtimise, seda ainult siis kui lipp on püsti.
              ja kõige lihtsam variant viiteks: teed lihtsalt näiteks kahe loenduriga tsükli, mis mitte midagi ei tee.
              Katkestusega on muidu see jama, et iga katkestuse kutsumine ja sellest tagasi tulemine võtab märksa rohkem aega kui kontrollimine ja vajadusel jump ning pärast siis ise lipu maha võtmine. Seda enam, et siis ei ole vaja päästa akumulaatorit, staatuse registrit, fikseerida mälupanka, taastada pärast seda kõike jne jne. Kui väga kriitilises ajas kogu süsteem jookseb, siis mõnikord tuleb ka nii teha.

              Comment


                #8
                Igal juhul kasuta katkestust, vastasel juhul (pollides) raiskad prose ressurssi ja ei saavuta tegelikult soovitud täpsust. Katkestuse kasutamine picidel ja avridel on kukepea, kui võrrelda x86 platvormiga.

                Pead aga silmas pidama paari asja:

                1. jälgi, et katkestuse handler taastaks kõik muudetud registrid
                2. kui katkestus updateb mingit muutujat siis kasuta kas semafore või tee muutujast kaks versiooni: üks mida katkestus muudab ja teine, millesse algoritm kopeerib katkestuse poolt kontrollitava muutuja. Vastasel juhul võib katkestus keset algoritmi muutuja väärtust muuta ja see viib enamasti jaburate vigadeni. Või siis pane flag püsti ja katkestus, nähes seda flagi,
                skipib handleri. Mõlemal meetodil on omad plussid ja miinused.

                Muuseas, katkestus, reboot jms ei ole mingid ebanormaalsed või erilised sündmused, mikrokontrate puhul on see üks peamisi meetode. Taimeriga on ka selline variant, et võid prose sleepi panna ja lasta katkestusel ta üles äratada. Mida ta vahepeal ikka niisama käiab.

                Kes teil kontravärki õpetab ? Sammal ?

                P.S. AtMega8 küsi minu käest, saad sigaodavalt. Mul neid palju.

                Comment


                  #9
                  Originally posted by KaruTEC@Feb 24 2006, 13:37
                  Kes teil kontravärki õpetab ? Sammal ?
                  Ei. Nelus.

                  Aga tagasi teema juurde.
                  Mul ikka vastik komme algusest peale kuidagi lihvtiisiliselt realiseerida.
                  Ühes olen täiesti nõus et sleep´i kasutades tuleb loomulikult katkestusega üles ajada ja siis on asi jalul ja teeb mis vaja - sleep läheb ka käiku aga teise koha peal.
                  Kuid taimeriga on konkreetselt see lugu et sammmootori tsükkel peaks kestma kuni 15 seki(rauas oleks seda vajalik jumperitega muuta milledeks on 7 sis.pinni ja nendest lähtudes tiksub ettenähtud aega). Sellist suurusjärku aega oleks loogilisem ette anda kuidagi time (ms), sest registris toimub loendamine hoopis teise kiirusega ja alati tuleks seda ümber arvestada ja sekundite peale välja jõudmine oleks hetkel nagu väga raskendatud.

                  Comment


                    #10
                    Aga kasuta mingit kordavat tsüklit, mis kutsub iga sõõru ajal välja seda lühemat delay tsüklit? Olen näinud sellist moodust hes LEDide vilgutamise koodis PIC16F84-le.

                    Eggy@pole pmselt PIc'idega niipalju tegelenud, et julgeks öelda, et oleks tegelenud.

                    Comment


                      #11
                      Kui kasutad Basicut, peaks ju päris lihtne olema - ütled mingi käsuga, mis tal kindlasti on, et delay 15s ja kogu lugu. Ei saanud aru, mis probleemid sellega on - pole sellist käsku või tahaksid ikkagi asmis teha?
                      Ja Basicu puhul polegi tähtis, kas kompilaator saavutab nõutud aja katkestuste abil või mitte. See on tema mure.
                      Üks Basciu fännide nurgake: http://www.picbasic.co.uk/forum/
                      - Vend Hieronymus tunneb Motorola toodete nimekirja kõige paremini, las tema ütleb.
                      - Motorola poolt loodud kiipide hulgas ei ole teda üles tähendatud. - Tähendab: ta on Intelist!

                      Comment


                        #12
                        kas mingi sellises stiilis koodi

                        for a=0 to 255
                        for b=0 to 255
                        next b
                        next a

                        optimeerib kompilaator välja kui funktsionaalselt kasutu (mõni c-kompilaator igatahes saab sellega hakkama). Kui ei, siis saad seda tüüpi koodiga kenasti aega viita.

                        Mina teeks ikkagi nii, et üks katkestus käib iga ms tagant (või siis mingi täisarvu ms tagant, oleneb võimalustest) ja siis liidetakse ühele ms loendurile pidevalt ühte otsa. Mootori juhtija loeb selle loenduri ning liidab viivituse aja otsa. Programm on nagu ikka lõpmatu tsükkel ja niikaua kui ms loendur ei ole jõudnud selle mootori viivitusega numbrini, hüpatakse mootori juhtimise koodist üle. Tsükkel ikka käib, seega watchdogile saab kenasti jalaga anda igal ringil ja saab kenasti jadasides suhelda teistega.
                        ps, 8-bit ms loendurist saad kuni 256ms. Seega vaja kas lugeda näiteks hoopis 50ms ühikutes vms. või siis võtta kasutusele mitu baiti
                        ps2: märksa lihtsam on välise jumperduse järgi taimeri kiirust /taimeri intervalli muuta kui kogu programmi ajastust mingite if'ide kolooniana ümber arvutaga.
                        ps3: kas ei oleks mugavam see kiiruse parameeter üldse eeprommi kirjutada programmi enda poolt ja siis jadasidega kamandades seda muuta kui hakata mingit segast jumperdust looma?

                        Comment

                        Working...
                        X