Teade

Collapse

Foorumi reeglid.

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

MPLAB IDE ja PIC Tutorial

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

    #16
    Originally posted by raitl@Jan 31 2005, 10:10
    nii...sain toimima. Kogu probleem oli selles, et Port A, mis on A/D, on vist defauldina analogue määratud?
    On tõesti. Lülita A/D muundi välja. Register ADCON1.
    - 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


      #17
      kas keegi oskab soovitada analogue input tutoriali? Siiani pole seda teemat nagu üheski kätte sattunud PIC tutorialis eriti käsitletud.
      Oota! Las ma teen seda natuke paremaks...

      Comment


        #18
        ;************************************************* *************

        #include <P16f876.INC>
        ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES (ei kisata nende peale)
        ;************************************************* *********
        ;Ma kasutasin siin otse registrite nimesid kui tahad teada nende aadresse uuri datasheeti

        ;Analoogsisendite init
        ; ADC sisselülitamine
        BSF ADCON0, 0 ; ADON=1

        ; ADC-sisend AN0 valimine
        BCF ADCON0, 5 ; ADCHS2=0
        BCF ADCON0, 4 ; ADCHS1=0
        BCF ADCON0, 3 ; ADCHS0=0

        ; ADC kiirus 20 MHz
        BSF ADCON0, 7 ; ADCS1=1
        BCF ADCON0, 6 ; ADCS0=0

        ; ADRESL baidi kõige väiksem bitt on 0
        BSF STATUS,RP0 ; Bank1
        BCF ADCON1, 7 ; ADFM=0
        BCF STATUS,RP0 ; Bank0
        ;************************************************* *********

        Main

        BSF ADCON0, 2 ; Käivita AD muundur
        loop

        BTFSC ADCON0, 2 ; kas analoogväärtus sisendis loetud?
        GOTO loop ; ei oota veel

        ;siia tuleks lisada veel väike viide, kuna AD muunduril kulub veidi aega et uuesti
        ;algsesse tööstaadiumi jõuda
        ;Analoogsisendist väljaloetav väärtus kirjutatakse kahte baiti, mis on
        ;registrites ADRESH ja ADRESL , (need väärtused kirjutatakse iga kord üle)
        ;Analoogväärtus kümnendkujul=ADRESH*255+ADRESL

        goto Main
        end
        ;************************************************* *********


        Raud ühenda niimoodi, poteka asemel võib olla mida iganes mis annab välja muutuvat pinget 0 - 5v kui on tegemist kõrgema pingega tuleb kasutada pingejagurit.




        kui saksa keelest aru saad, siis on väga hea PICI alane lehekülge
        http://www.sprut.de

        Comment


          #19
          hei&#33;
          a/d jaoks üks link -> http://members.cox.net/sonjarob/TUTs/uP4Idiots.html
          head lugemist

          ega ausalt öeldes mina kõigets aru ei saanud aga
          http://www.alldatasheet.com/

          Comment


            #20
            Ei tahtnud uut teemat teha, kuna endal hiljem parem otsida kui vaja läheb.

            Ühesõnaga probleem koodiga. Vaja kahele stepperile anda vajadusel erinevad pausid sammude vahel, et seeläbi siis roboti liikumise suunda korrigeerida. Aga kuidas muuta PORTB esimesed või viimased 4 bitti ilma ülejäänud 4 puutumata?

            Proovisin sedasi:

            Kood:
            STEPPER_R&#58;
            blabla
            	call	GET_R_MOTOR_POSITION
            	movwf	TEMP_REG2
            	WAIT	STEP_SPEED_R
            	iorwf	TEMP_REG,w
            	movwf	PORTB
            
            	return
            
            GET_R_MOTOR_POSITION&#58;
               andlw   b&#39;00000111&#39; 
               addwf   PCL,F 
               retlw   0x8 
               retlw   0xA 
               retlw   0x2 
               retlw   0x6 
               retlw   0x4 
               retlw   0x5 
               retlw   0x1 
               retlw   0x9 
            
            
            
            STEPPER_L&#58;
            blabla
            	call	GET_L_MOTOR_POSITION
            	movwf	TEMP_REG
            	swapf	TEMP_REG,f
            	WAIT	STEP_SPEED_L
            	iorwf	TEMP_REG2,w
            	movwf	PORTB
            	return
            
            GET_L_MOTOR_POSITION&#58;
               andlw   b&#39;00000111&#39; 
               addwf   PCL,F 
               retlw   0x8 
               retlw   0xA 
               retlw   0x2 
               retlw   0x6 
               retlw   0x4 
               retlw   0x5 
               retlw   0x1 
               retlw   0x9
            
            
            STEPPER&#58;
            	call	STEPPER_R
            	call	STEPPER_L
            	decfsz	STEPCOUNT,f
            	goto	STEPPER
            	return
            Hetkel tekib tohutu tohuvabohu, sest iga kord nullitakse teise mootori väljundid ära.
            Oota! Las ma teen seda natuke paremaks...

            Comment


              #21
              leidsin sellise koodijupi...
              Kood:
              MOVLW  &#39;H&#39; 
              MOVWF  TempVar      &#59;save the value 
              SWAPF  TempVar, W    &#59;and swap its nibbles, save to W 
              ANDLW  b&#39;00001111&#39;    &#59;AND with 0x0f to clear out the upper bits 
              MOVWF  TempVar      &#59;save it temporary 
               
              MOVF   PORTB, W     &#59;copy portb value to W 
              ANDLW  b&#39;11110000&#39;    &#59;&#39;And&#39; it so only the upper 4 bits remain 
              IORWF  TempVar, W    &#59;OR the value with W; save to W 
              MOVWF  PORTB       &#59;save to portb
              Aga ei suuda kuidagi seda oma kasuks toimima panna...
              Oota! Las ma teen seda natuke paremaks...

              Comment


                #22
                ma üritan selgitada, kuidas seda mina teen:

                ma ei tea kas asmis saab predefinida erinevaid variabelisid, et sa saaksid variaabelid stp11, stp12,stp13,stp14...;stp21,stp22...

                kirjutad neisse sisse dec väärtused(võibolla saab ka muud kirjaviisi kasutada), mis on võrdsed ühe steperi ühe sammu tegemiseks vajalike pinide asetust. nt stp11 = 0000 1001 e. 9

                siis kui on vaja kahte liigutada, siis midagi nii

                pinide väärtuseks stp11+21
                paus
                pinide väärtuseks stp12+22
                paus
                pinide väärtuseks stp13+23
                paus
                pinide väärtuseks stp14+24


                ja siis luubid seda.

                enne luubi lõppu või algusesse paned siis need commandid, mis andurite olekus, ta peab siis sellest loobist väljuma.

                Comment


                  #23
                  kahjuks ei toimi ju selline lähenemine...kuna mul peamiseks kriteeriumiks on kiiruse muutmise võimalus mõlemal mootoril eraldi, siis ei saa ma ju lihtsa variablite liitmisega probleemi lahendada... sest kui ühe mootori pausid on 2ühikut ja teisel 4, siis üks mootor ju pöörleb poole aeglasemalt. Seetõttu olekski vaja, et võtan PORTB hetkeväärtuse, muudan ära ühe mootori bitid ning teise mootori omad jäävad muutumatuks niikauaks, kuni tuleb teise mootori kord edasi sammuda. Samas....praegu hakkasin mõtlema...kas see on üldse võimalik variant? Sest sel ajal, kui esimene mootor pausib....seisab ka teine mootor....

                  On õige arutlus?
                  Oota! Las ma teen seda natuke paremaks...

                  Comment


                    #24
                    Ma küll progen AVR&#39;isid, kuid nendega teeks niimoodi:
                    võtaks ühe taimeri ja paneks mingi kiirusega käima. Taimeril on kaks compare katkestust. Üks siis ühele mootorile, teine teisele. Kuskile registritesse kiirus(tegelt kiiruse pöördväärtus ehk siis mida väiksem seda kiirem) ehk siis taimeri taktide arv, mille järel mootorit edasi keeratakse. Katkestuse alamprogrammi siis see kood, mis keerab vajalikus suunas sammmootori järgmisele sammule. Seejärel liidetakse praegusele taimeri väärtusele kiirus otsa ja väljutakse alamprogrammist. Taimer ise jookseb tsükliliselt üle ja seega ei ole probleemi tema juhtimisega ega mingite taktide loendamisega. Enam-vähem kõik käib ju eraldi rauas. Takti numbrile kiiruse juurde liitmine jookseb ka ise üle ja seal ei ole vaja mingit eriolukorra töötlust.

                    Comment


                      #25
                      Digitalil õigus - peaksid ikka taimerite ja katkestustega asja ajama. Muidu aga: kas su alamprogramm WAIT STEP_SPEED_R ei riku W registri sisu ära?
                      - 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


                        #26
                        Kas on kuskil mõni õpetus, kuidas kasutada korraga mitut interrupti? Ei suuda leida midagi googlist.
                        Oota! Las ma teen seda natuke paremaks...

                        Comment


                          #27
                          Korraga ei saa, reaalselt täidetakse neid järjest. Küll aga võib olla korraga mitu katkestust lubatud. Täidetakse esimesena tulev ja (kui sa ise midagi ei muuda) järgmisena järgmine mis tellitud sai (lipp püsti).
                          Näide? Kui viitsid, vaata kasvõi Arvutikasutajast sellist lugu nagu Fanbus. Seal kasutasin 2 taimeri katkestusi. Lisaks serial.
                          - 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


                            #28
                            Kaks taimerit jooksevad oma rada, vastavalt vajadusele laetakse suurem või väiksem väärtus taimeritesse. Katkestusel jooksutatakse üht või teist mootori sammu võrra edasi. See kõik toimib...aga ikkagi tekib ju probleem sellega, et kuidas (mis käsuga) saab muuta ainult pooled bitid portb-st, et mitte puutuda mootorit, mille astumise aeg pole veel kätte jõudnud?
                            Oota! Las ma teen seda natuke paremaks...

                            Comment


                              #29
                              Olgu registris mootorB 4 vanemat bitti need, mis mootorile lähevad. PortB-s on 2 mootorit. Lihtsuse mõttes olgu B-mmotor samuti vanemate bittide küljes.

                              movf portb,w ; loeme mootori seisu
                              movwf tempB ; seivime
                              movf mootorB,W ; loeme mootori B uue seisu
                              andlw B&#39;11110000&#39; ; kindluse mõttes maskeerime (nullime) A-mootori bitid
                              iorwf tempB,F ; valmis juhtsõna mootorite jaoks
                              movf tempB,W
                              movwf portB ; tulemus mootorite porti
                              - 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


                                #30
                                Õige&#33; Selle peale ei tulnudki, et lugeda ühe mootori bitid ennem teise mootori omade kirjutamist. Tänud&#33;
                                Oota! Las ma teen seda natuke paremaks...

                                Comment

                                Working...
                                X