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

    #31
    Otsisin välja oma vana robotiprojekti ja üle pika aja leidsin aega vähe PICutada. Oma paar kolm tundi läks, et olemasolevast vanast koodist taas aru saada (NB! Selgitustel on ka iseenda jaoks ja iseenda programmis suur mõte!!! ) Aga probleem nüüd selline, et Taimerid ei taha interrupte tekitada... Igaks juhuks panin kogu faili siia, natuke jurakas ta ju on, kuid ehk hakkab midagi seal silma, kus ise ei kahtlustagi...

    Kood:
      #include "p16f876a.inc"
      LIST P=16f876a
    
      errorlevel   -302  &#59;Suppress bank warning
    
      __CONFIG _WDT_OFF & _XT_OSC & _CP_OFF & _LVP_OFF
    
    
      cblock	0x20  &#59; local variables, only in bank 0
     R_Motor 	&#59; temp address to know the motor position
     L_Motor
     COUNTER1 &#59; Counters for
     COUNTER2 &#59; Stepper direction
     MOTOR_DIR1 &#59; Temp files for motor direction
     MOTOR_DIR2 &#59;
     W_Temp 	&#59;
     S_Temp 	&#59;
     TempL 	&#59;
     TempR 	&#59;
     Right_Speed &#59;
     Left_Speed
    	endc
    
    ;************************************************************
    ;*            Makrod   	*
    ;************************************************************
    
    BANK0 MACRO
     BCF	STATUS,RP1
     BCF	STATUS,RP0
     ENDM
    
    BANK1 MACRO
     BCF	STATUS,RP1
     BSF	STATUS,RP0
     ENDM
    
    BANK2 MACRO
     BSF	STATUS,RP1
     BCF	STATUS,RP0
     ENDM
    
    BANK3 MACRO
     BSF	STATUS,RP1
     BSF	STATUS,RP0
     ENDM
    
    DRIVE	macro	mdir1, mdir2, rspd, lspd
    	movlw	mdir1
    	movwf	MOTOR_DIR1
    	movlw	mdir2
    	movwf	MOTOR_DIR2
    	movlw	rspd
    	movwf	Right_Speed
    	movlw	lspd
    	movwf	Left_Speed
    	endm
    
    ;*************************************
    ;**** Hakkame aga pihta **************
    ;*************************************
    
    	org 0x00	&#59; reset vector
    	goto	Start
    
    ;===================================================================
    ;	Interruptid  
    ;===================================================================
    Interrupt org 0x04 &#59; interrupt vector 
      movwf	W_Temp &#59; salvestame hetkeollukorra
      swapf	STATUS,W 
      movwf	S_Temp
      bcf STATUS,RP0
    Disable_Int
      bcf INTCON,GIE	&#59; keelame globaalselt ära interruptid
      btfsc	INTCON,T0IF	&#59; kas TIMER0 lipp on püsti?
      goto	Right_Step	&#59; On küll!
      btfsc	PIR1,TMR2IF	&#59; kas TIMER2 lipp on püsti?
      goto	Left_Step	&#59; On küll!
    
    Pop  
      swapf	S_Temp,W	&#59; taastame enneinterruptiaegse olukorra
      movwf	STATUS
      swapf	W_Temp,f
      swapf	W_Temp,w
      retfie
    	
    
    	
    
    ;****The main program*****
    
    Start
    	CLRF	PORTB &#59; Initialize Port B
    	CLRW
    	BANK1  &#59; Select Register Bank 1
    	MOVWF	TRISB &#59; Set B to all outputs
    
    	CLRF TMR0 	&#59; Clear Timer0 register
    	CLRF INTCON 	&#59; Disable interrupts and clear T0IF
    	BANK1
    	MOVLW 0xC3 	&#59; PortB pull-ups are disabled,
    	MOVWF OPTION_REG &#59; Interrupt on rising edge of RB0
       &#59; Timer0 increment from internal clock
       &#59; with a prescaler of 1:16.
    	BANK0
    	CLRF T2CON 	&#59; Stop Timer2, Prescaler = 1:1,
       &#59; Postscaler = 1:1
    	CLRF TMR2 	&#59; Clear Timer2 register
    	BANK1
    	CLRF PIE1 	&#59; Disable peripheral interrupts
    	BANK0
    	CLRF PIR1 	&#59; Clear peripheral interrupts Flags
    	MOVLW 0x72 	&#59; Postscaler = 1:15, Prescaler = 1:16
    	MOVWF T2CON 	&#59; Timer2 is off
    	BSF T2CON, TMR2ON &#59; Timer2 starts to increment
    	BSF INTCON, T0IE &#59; Enable TMR0 interrupt
    	BSF INTCON, GIE &#59; Enable all interrupts
    
    MAIN
    
     DRIVE 1, 0, 0xC8, 0xC8
     goto MAIN
    
    ;===============================================
    ;	Mootorite astumised
    ;===============================================
    
    Right_Step
    	movlw	Right_Speed	&#59; loeme etteantud ajaväärtuse TIMER0 jaoks
    	movwf	TMR0 &#59; omistame väärtuse TIMER0-le
    	bcf INTCON,T0IF	&#59; nullime TIMER0 interrupt flägi
    
    	swapf	PORTB,w &#59; loeme mootori seisu, keerame tulemuse ringi
    	andlw	b'11110000'	&#59; nullime selle mootori bitid, teisi ei puudu
    	movwf TempL 	&#59; seivime
    	call	R_Motor_Pos	&#59; vaatame, mis on mootori A uus seis
    	movf R_Motor,W &#59; Loeme mootori A uue seisu
    	iorwf TempL,F &#59; valmis juhtsõna mootorite jaoks
    	movf TempL,W
    	movwf PORTB &#59; tulemus mootorite porti 
    	return
    
    Left_Step
    	movf	Left_Speed,w&#59; loeme etteantud ajaväärtuse TIMER2 jaoks
    	movwf	TMR2 &#59; omistame väärtuse TIMER2-le
    	bcf PIR1,TMR2IF	&#59; nullime TIMER2 interrupt flägi
    
    	movf	PORTB,w &#59; loeme mootori seisu
    	andlw	b'11110000'	&#59; nullime selle mootori bitid, teisi ei puudu
    	movwf TempR 	&#59; seivime
    	call	L_Motor_Pos	&#59; vaatame, mis on mootori B uus seis
    	movf L_Motor,W &#59; loeme mootori B uue seisu
    	iorwf TempR,F &#59; valmis juhtsõna mootorite jaoks
    	movf TempR,W
    	movwf PORTB 	&#59; tulemus mootorite porti 
    	return	
    
    R_Motor_Pos:
    	btfsc	MOTOR_DIR1,0&#59; Kas liigume edasi või tagasi?
    	incf	COUNTER1,f	&#59; Liigume edasi!
    	btfss	MOTOR_DIR1,0
    	decf	COUNTER1,f	&#59; Liigume tagasi!
    
    	movf	COUNTER1,w 
    	call	GET_R_MOTOR_POSITION&#59; pöördume tabeli poole
    	movwf	R_Motor &#59; salvestame tulemuse faili
    	return
    
    GET_R_MOTOR_POSITION:
      andlw  b'00000111' 
      addwf  PCL,F 
      retlw  0x8 
      retlw  0xA 
      retlw  0x2 
      retlw  0x6 
      retlw  0x4 
      retlw  0x5 
      retlw  0x1 
      retlw  0x9 
    
    L_Motor_Pos
    	btfsc	MOTOR_DIR2,0&#59; Kas liigume edasi või tagasi?
    	incf	COUNTER2,f	&#59;Liigume edasi!
    	btfss	MOTOR_DIR2,0
    	decf	COUNTER2,f	&#59;Liigume tagasi!
    
    	movf	COUNTER2,w
    	call	GET_L_MOTOR_POSITION&#59; pöördume tabeli poole
    	movwf	L_Motor &#59; salvestame tulemuse faili
    	return
    
    GET_L_MOTOR_POSITION:
      andlw  b'00000111' 
      addwf  PCL,F 
      retlw  0x8 
      retlw  0xA 
      retlw  0x2 
      retlw  0x6 
      retlw  0x4 
      retlw  0x5 
      retlw  0x1 
      retlw  0x9 
    
    	END
    Oota! Las ma teen seda natuke paremaks...

    Comment


      #32
      Kui kirjutaks init-isse: bsf INTCON,PEIE
      - 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


        #33
        jah, ning lisaks oleks tore peale interrupti läbiviimist globaalselt kõik interruptid lubada, eriti kui eelnevalt ise ära keelasin
        Oota! Las ma teen seda natuke paremaks...

        Comment


          #34
          Ei saa aru, mis talle ei meeldi, kompileerimisel ütleb:

          Kood:
          Error[115]  C:\ELECTRONICS\PROGRAMMING\BOT\BOT.ASM 464 : Duplicate label ("Right_count" or redefining symbol that cannot be redefined)
          Error[115]  C:\ELECTRONICS\PROGRAMMING\BOT\BOT.ASM 471 : Duplicate label ("Left_count" or redefining symbol that cannot be redefined)
          Koodi väljavõtted:

          Kood:
          Disable_Int
            bcf INTCON,GIE
            btfsc	INTCON,T0IF
            call	Right_count
            btfsc	PIR1,TMR2IF
            call	Left_count
          Kood:
          Right_count
           clrf	rcount
           decfsz	rcount,1
           return
           call	Right_Step
           return
          
          Left_count
           clrf	lcount
           incfsz	lcount,1
           return
           call	Left_Step
           return
          Oota! Las ma teen seda natuke paremaks...

          Comment


            #35
            Äkki oled Right_Count'i proge päises defineerinud? Kusagil ta peab olema, muidu sellist viga ei anta. Kui kasutad incluuditavaid mooduleid, vaata ka nende tekst üle...või muuda lihtsalt oma koodis märgendi nime (kasvõi Parem_count, Vasak_count).
            - 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


              #36
              olin jah defineerinud päises. :P Aga see selleks, nüüd uus mure.
              Kood:
              CORE-E0001: Stack over flow error occurred from instruction at 0x000060
              Nagu ma aru saan, pean vähendama üksteise "sees" olevaid CALL ja GOTO funktsioone? Üritama asja kuidagi muudmoodi kombineerida?
              Oota! Las ma teen seda natuke paremaks...

              Comment


                #37
                CALL on see, mis stacki ruumi kulutab. GOTO mitte. Kas asi tekib katkestusest?
                - 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


                  #38
                  jah, kusjuures, kui lasen simu käima, siis mingi aeg jookseb ilusasti ja siis viskab selle teate ette. Peale seda, kohe kui lasen uuesti käima, siis karjub sama.
                  Oota! Las ma teen seda natuke paremaks...

                  Comment


                    #39
                    Otsi üles worst-case alamprogede väljakutsumiste tee ja loe tarbitava stacki sügavus kokku. Tee järeldused, paranda koodi.
                    Omal olid samad mured ühe vidinaga kuid õnnestus tõsta terve "koodipuu" GOTO käskude alla. Midagi pole teha, vaid 18Fxxx-l ja vingematel on suurem stack.

                    PS. Jälgi ka PCLATH'i kui kood peaks üle 0x7FF minema (16F88 ja muude hästi varustet PICide puhul, aadressi vamńimat bitti pead sel juhul ise väänama )
                    - 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


                      #40
                      ok, alustasin asja nullist, tundus lihtsam.

                      Probleem jälle interruptidega, ei taha toimida nimelt... võrdlesin ka vana koodiga, mille siia postitasin aga ei näe viga...


                      Kood:
                      Interrupt  org  0x04    ; interrupt vector 
                         movwf   W_TEMP    ; 
                         swapf   STATUS,W  
                         movwf   S_TEMP 
                         bcf      STATUS,RP0 
                      
                      Disable_Int 
                         bcf      INTCON,GIE  &#59; 
                         btfsc   INTCON,T0IF; 
                         goto      Step  &#59;
                      
                      Pop    
                         swapf S_TEMP,W      ; 
                         movwf STATUS 
                         swapf W_TEMP,f 
                         swapf W_TEMP,w 
                         retfie 
                      
                       
                         #include "Bot.inc" 
                      
                      Start 
                         CLRF   PORTA        ; Initialize Port A 
                         CLRF   PORTB        ; Initialize Port B 
                         CLRF   PORTC        ; Initialize Port C 
                         CLRW 
                         BANK1              ; Select Register Bank 1 
                         MOVWF   TRISB        ; Set B to all outputs for stepper control 
                         BANK0 
                         CLRF    TMR0        &#59; Clear Timer0 register 
                         CLRF    INTCON        &#59; Disable interrupts and clear T0IF 
                         BANK1 
                         MOVLW    0xC7        &#59; PortB pull-ups are disabled, 
                         MOVWF    OPTION_REG      ; Interrupt on rising edge of RB0 
                                          ; Timer0 increment from internal clock 
                                          ; with a prescaler of 1:256. 
                         BANK0 
                         BSF   INTCON, T0IE    &#59; Enable Timer0 Interrupts 
                          BSF INTCON, GIE      ; Enable all interrupts 
                         BSF   INTCON, PEIE
                      Oota! Las ma teen seda natuke paremaks...

                      Comment


                        #41
                        Elou!

                        Huvitav... mismoodi ei taha toimida?
                        Proovisin... minul toimib.
                        Kui Sa proovisid simulaatoris ja klõpsisid hiirega "step into"
                        siis võtab natuke aega kui TMR0 muutub - Prescaler rate on 1:256.

                        Pane sinna "goto Step" kohale simulaatori katkestus ja käivita "Run".
                        aega kulub 65.5ms

                        parimat soovides,
                        gOb
                        Meie üle nalja ei mõisteta!

                        Comment


                          #42
                          müstika.... ok eks ma katsetan kodus uuesti. Sest just sedasi ma interrupte olengi proovinud, et panen katkestuse vahele ja lasen käima. Isegi jälgisin samas TIMER0 väärtust ja pausisin iga natukese aja tagant simu, jooksis ludinal üle 255 ja kukkus uuesti nulli, ei mingit interrupti.


                          Aga eks õhtul kontrollin üle uuesti.
                          Oota! Las ma teen seda natuke paremaks...

                          Comment


                            #43
                            Pane kursor INT-i algusesse ja ütle "run to cursor". Siis on oht katkestust mitte märgata väiksem. Kui jääb jooksma siis tõesti ei katkestu. Praegune kood töötab ka minu simuga.
                            - 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


                              #44
                              jah...ei saa aru mida ma eile õhtul tegin et ei toiminud. Täna töötab. :unsure:
                              Oota! Las ma teen seda natuke paremaks...

                              Comment

                              Working...
                              X