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

    MPLAB IDE ja PIC Tutorial

    Kood:
    
    ;*****Set up the constants**** 
    
    STATUS  equ       03h            ;Address of the STATUS register
    TRISA     equ       85h            ;Address of the tristate register for Port A
    PORTA    equ       05h             ;Address of Port A
    COUNT1  equ       08h            ;First counter for our delay loops
    COUNT2  equ       09h            ;Second counter for our delay loops 
    
    ;****Set up the port**** 
    
                bsf        STATUS,5      ;Switch to Bank 1
                movlw    01h              ;Set the Port A pins:
                movwf   TRISA          ;bit 1to output, bit 0 to input.
                bcf        STATUS,5     ;Switch back to Bank 0 
    
                movlw    02h            ; Set up our w register with 02h 
    
    ;****Turn the LED on and off**** 
    
    Start      xorwf    PORTA,1      ;Toggle the LED 
    
    ;****Check if the switch is closed
    
    BTFSC               PORTA,0      ;  Get the value from PORT A
                                             ;BIT 0.  If it is a zero,
                 call       Delay          ;carry on as normal.
                                             ;If is a 1, then add an 
                                             ;extra delay routine 
    
    ;****Add a delay 
    
    call       Delay 
    
    ;****Check if the switch is still closed
    
    BTFSC               PORTA,0      ;Get the value from PORT A 
                                             ;BIT 0.  If it is a zero,
    call                      Delay        ;carry on as normal.
                                            ;If is a 1, then add an 
                                            ;extra delay routine 
    
    ;****Add another delay**** 
    
    call                      Delay 
    
    ;****Now go back to the start of the program
    
          goto              Start         ;go back to Start and turn LED on again 
    
    ;****Here is our Subroutine
    
    Delay
    
    Loop1      decfsz   COUNT1,1    ;This second loop keeps the LED
                  goto     Loop1         ;turned off long enough for us to
                  decfsz   COUNT2,1    ;see it turned off
                  goto     Loop1        &#59;
    return 
    
    ;****End of the program**** 
    
    end      
    build all karjub, et vaja deklareerida õigetes kohtades kasutatavad muutujad. Hetkel ei saa kontrollida täpset sõnastust. Ühesõnaga mis oleks vaja lisada, et asi kompileeruks MPLAB IDE 7 assembleris?

    Kood ise on võetud SIIT. Muidu minu jaoks igati meeldiv õpetus, kui vaid toimiks.
    Oota! Las ma teen seda natuke paremaks...

    #2
    Proovisin huvi pärast järgi mul küll kompileerus ilusti. (MPLAB6.6). Kas sul on ->cnfigure -> select device -> device alt valitud õige mikrokontroller. Kui on valitud uuri datasheedist mälude struktuuri, kas programmis etteseatavad mälukohad ikka vastavad kontrolleri reaalsele mälule (kui ma ei eksi siis näiteks 16f84 kontrolleril ei asu TRIS? registrid esimeses mälupangas vaid bank0, veel võib kontrollida kas muutujad count1 ja count2 on määratud ikka general purpose registritesse). STATUS, TRISA ja PORTA mälukohtade deklareerimise võid ära jätta ja anda ette include faili. Näiteks kui kasutad 16f628 , siis lisa programmi algusesse #include <p16f628.inc>

    Comment


      #3
      Kompileerus kenasti MPLAB-7&#39;s.
      Delay tsükkel jookseb kokku, sest count muutujad on valedel aadressidel. Pane 0x20 ja 0x21. Muide, on viide 197mS&#33; Mitte 1s&#33;?
      include faili antud juhul ei olnudki vaj kuid sellega oleks tekst lihtsam ja arusaadavam.
      - 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


        #4
        Originally posted by felch@Jan 28 2005, 11:25
        Delay tsükkel jookseb kokku, sest count muutujad on valedel aadressidel. Pane 0x20 ja 0x21.
        R.I.P soovitusel võrdlesin hoolega datasheete ja jõudsin samale arvamusele. Kuna pole kodus, ei saanud kontrollida. Tänud igatahes teile mõlemale. Aga selline küsimus veel, et datasheedis on kirjas general purpose registrid. Aga seal on antud ainult see vahemik kus nad asuvad. Ja HEX koodina... kuidas ma tean millised registrid sinna vahemikku jäävad? Mingi HEX konverteriga?
        Oota! Las ma teen seda natuke paremaks...

        Comment


          #5
          Põhimõtteliselt ei ole siin midagi keerulist, võid aadressinumbri windowsi kalkulaatorit kasutades teisendada kümnendsüsteemi ja hiljem programmi kirjutades teisendada kümnendarvu hexiks.
          Siin on näide 16f628 datasheedist.



          General purpose register algab seal aadressil 20h ja lõppeb 6Fh ja peale selle on märgitud et selle registri maht on 80 baiti ehk 80 8bitist mälukohta. hex20 on kümnendsüsteemis 32 ja hex 6F on dec 111. Kui tahad kasutada neid registreid oma muutujate jaoks, siis võta lihtsalt mingi arv 32hest kuni 111ni teisenda see hexiks ja kirjuta koodi.
          Ehk siis näiteks kui sa tahad sellesse registrisse esimesele kolmele vabale mälukohale (kümnendsüsteemis 32,33 ja 34) deklareerida kolme muutujat.

          VARIABLE1 equ 20h
          VARIABLE2 equ 21h
          VARIABLE3 equ 22h

          Kui tahad ligipääsu teistes mälupankades paiknevatele registritele, siis ära unusta kunagi valimast õigeid bitte STATUS registris. Ja nii lihtne see ongi.
          Rõõmsat progemist.

          Comment


            #6
            Mõnikord on lihtsam panna definitsioonidesse "cblock". Määrad ainult tema alguse (628-l 20H) ja edasi kompilaator teab, et järgmine muutuja kirjutatakse aadressile 20H+1 jne.
            Fragment koodist:
            Kood:
            	INCLUDE &#34;P12F629.inc&#34; 
             __CONFIG _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _CP_OFF & _CPD_OFF  
              errorlevel -302  &#59; Compaileri vingumised ära
              errorlevel -305
              errorlevel -306 
            	
            ; ***** Variaablid *****  
            RAMbase     equ   20h      
            	cblock 	RAMbase         
              lipud         	&#59; süsteemi lipukesed
              lipud1
              lipud2
              tuledetmr   &#59; tulede taimer
              tuledetmrH   &#59; tulede taimer, vanem bait
              piduritmr  	&#59; piduri taimer
              piduritmrH
              l_loenditmr  	&#59; löögianduri pulsiloendi taimer
              s_loenditmr  	&#59; liikumisanduri pulsiloendi taimer
              l_loenditmrH  &#59; löögianduri pulsiloendi taimer
              s_loenditmrH  &#59; liikumisanduri pulsiloendi taimer
              s_loendi  	&#59; liikumisanduri loendi
              l_loendi  	&#59; löögianduri loendi
              pasunatmr  	&#59; pasuna röökimise taimer, time-outi saabudes jääb vait
              pasunatmrH
              pasuna_loendi  &#59; sireeni tooni kestuse loendi
              temp         	&#59; scratchpad
              temp_2 
              Table_Temp         
              W_Temp         
              S_Temp         
              T_Temp         
              Old_T_Temp         
              RC5_Bit_Count         &#59; RC5 infrapuna alamsüsteemi muutujad
              RC5_Command         
              RC5_Address
              Last_Cmd
              Last_Adr     
              CmdCounter
              piiksuloendi  &#59; piiksutamise kordade loendi
              piduriloendi  &#59; pidurdamise kordade loendi 
             endc 
            ; ***** raudwärk ******** 
            #define Pasun 	GPIO,5  &#59; Sireeni tüürimise väljund, aktiivne = HIGH
            #define Pidur    GPIO,4        &#59; võimaliku magnetpiduri väljund, aktiivne = HIGH
            #define	Toide 	GPIO,3  &#59; Patarei pinge jälgimise sisend/löögianduri sisend. Anduri aktiivne = LOW
            #define	IR  GPIO,2  &#59; IR-anduri sisend, aktiivne = LOW
            #
            - 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
              Kood:
                List   p=16f876A
                #include &#60;p16f876a.inc&#62;
              
              __CONFIG _CP_OFF&_WDT_ON&_BODEN_OFF&_PWRTE_ON_&_XT_OSC&_WRT_OFF&_LVP_ON&_CPD_OFF
              
                STATUS  equ  03h
                TRISB    equ  86h
                PORTB   equ  06h
                COUNT1 equ  20h
                COUNT2 equ  21h
                OPT       equ  81h
              
              
                clrf  01h
                bsf  STATUS,5
                clrwdt
                movlw  b&#39;111&#39;
                movwf  OPT
                movlw  00h
                movwf  TRISB
                bcf       STATUS,5
              
              
              Start   movlw  0Ch
                        movwf  PORTB
                        call       Delay
                        clrwdt
              
                        movlw  04h
              
              ...
              ...
              
              Siin vahel ülejäänud 4 sammu. 06h, 02h, 03h ja 01h
              ...
              ...
                        movlw  09h
                        movwf  PORTB
                        call       Delay
                        clrwdt
              
              
              
              .....edasi tuleb Delay  Subroutine nagu eelmises koodis. ja siis END.

              EDIT: Probleem lahenes.
              Oota! Las ma teen seda natuke paremaks...

              Comment


                #8
                Toimib. Probleem on watchdog timeris. Pean seda veel uurima. Hetkel disabled.

                Aga küsimus...


                kas võib Main programmi sedasi teha?

                Kood:
                Main   call   Forward
                      
                      BTFSC PORTA,0
                      call    Turnleft
                      
                      BTFSC PORTA,1
                      call    Turnright
                      
                      goto   Main
                Ja subroutinedes paika panna stepperite käitumise vastava liikumissuuna puhul.


                Ning veel...kas sain õigesti aru, et numbrid PORTA järel näitavad jalga mida kontrollitakse? Et antud juhul siis esimesel puhul RA0, teisel RA1?
                Oota! Las ma teen seda natuke paremaks...

                Comment


                  #9
                  õige kui sa pöördud mõne käsuga otse näiteks PORTA või VORTB poole, siis mõjub see kõigile porta või port(misiganes) viikudele. Kui määrad ära numbri 0-7, siis mõjub see määratud viigule.

                  Comment


                    #10
                    Millegipärast ei ole minu programm nõus aktsepteerima nupuvajutusi...


                    kood on selline nagu eespool mainisin:
                    Kood:
                    Start
                         call Forward
                         btfsc PORTA,0
                         call Rightturn
                         btfsc PORTA,1
                         call Leftturn
                         
                         goto Start
                    ning portA on sedasi paika seatud:
                    Kood:
                    movlw 03h
                    movwf TRISA
                    ilusti sealsamas kus port B



                    Kui lasin Start tsüklil lihtsalt teatud intervalliga erinevad liikumisreziimid välja tuua, toimib asi ilusti. Ning kui panin esimeseks reaks Start tsüklis btfsc PORTA,0 siis jäidki mootorid ootama nupuvajutust.


                    lülitid ise on ühendatud port A pinide 0 ja 1 külge sedasi, et ühes otsas 4k7 pullupid ning teised otsad miinuses. Et vältida debounce effekti.

                    Nii...sai vist kõik kirja...
                    Oota! Las ma teen seda natuke paremaks...

                    Comment


                      #11
                      karta on et debounce.
                      ei oska muud teha kui soovitada -> http://www.mikroelektronika.co.yu/english/...7_03chapter.htm
                      võib natuke segane olla, aga loodan et abiks ikka
                      http://www.alldatasheet.com/

                      Comment


                        #12
                        hmm....kuidas ma seda makrot saaksin ümber teha või kasutada nii, et reageeritaks kontaktide suletud olekule? Atud variant siis toimib ju sedasi, et vajutad, lased lahti ja siis alles hüpatakse kuhu vaja. Aga mul oleks vaja, et kohe kui vajutad ja nuppu peal hoiad, siis toimub mingi tsükkel korduvalt kuni nupu vabastamiseni.
                        Oota! Las ma teen seda natuke paremaks...

                        Comment


                          #13
                          Ikkagi tuleks teha "debounce" - kontakitd võivad anda mitu vajutust. Lihtsaim variant: ootab natuke ja loed uuesti. Ku tulemus sama, loed klahvi vajutatuks.
                          - 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


                            #14
                            nii...sain toimima. Kogu probleem oli selles, et Port A, mis on A/D, on vist defauldina analogue määratud? Sest kui kasutan Port C-d siis töötab nii nagu vaja. Eks puurin datasheeti ja üritan aru saada mis selle Port A-ga on.
                            Oota! Las ma teen seda natuke paremaks...

                            Comment


                              #15
                              mina teeks koodi ja raua veidi ümber veidi ümber.

                              Start
                              call Forward
                              btfss PORTA,0
                              call Rightturn
                              btfss PORTA,1
                              call Leftturn

                              goto Start


                              ja muudatused rauas.

                              Comment

                              Working...
                              X