Teade

Collapse

Foorumi reeglid.

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

PIC16F876

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

    #31
    teine küsimus ka kohe... kuidas lahendada (if, and) küsimusi programmis? Tahaks teha midagi sellist, et:

    KUI parem switch closed JA vasak open, SIIS keera vasakule.
    KUI vasak switch closed JA parem closed, SIIS keera ringi.

    jne.

    Basicus leidsin küll näiteid aga ASMis mitte..
    Oota! Las ma teen seda natuke paremaks...

    Comment


      #32
      branch'id abiks. sõltuvalt viimase tehte flag'idest (tehe võib ka compare olla) saad siis teha tingimuslikke jump'e.

      Comment


        #33
        Kood:
        loop:
         call IR_test
         call go_forward
         goto loop
        
        ;*******My subroutines*******
        
        PWM_Enable:
         bsf CCP1CON, 3
         bsf CCP1CON, 2
         return
        
        PWM_Disable:
         bcf CCP1CON, 3
         bcf CCP1CON, 2
         return
        
        IR_test:
         call PWM_Enable
         btfss PORTA,0
         goto IR_obstacle
         call PWM_Disable
         return
        
        IR_obstacle:
         call PWM_Disable
         STEPS .10
         goto Turn_right
         return
        Nii..probleem selline, et ei taha sellisel moel minu IR-takistuse leidja toimida. Õigemini saatja pool on vait sest suva puldiga proovides toimib. Kuid kui panen ennem loop-i kutse PWM_Enable jaoks, siis asi toimib. Kuid sel juhul on ju kogu aeg PWM töös, mida ma ei taha voolu kokkuhoiu mõttes. Miks ta ei ole nõus lülima PWM-i vastavalt vajadusele?
        Oota! Las ma teen seda natuke paremaks...

        Comment


          #34
          Ise küsin ise vastan.

          Probleem oli selles, et PWM oli sisse lülitatud ainult mõne mikrosekundi. Selle ajaga ei saanud vastuvõtja lugemit kätte. Lisasin sinna pisikese delay ja korras.



          Nüüd siis järgmine küsimus. Tahaks teise LEDi ka infrapuna saatma panna. Kuid ei taha neid samal ajal töös hoida. Järelikult läheb kasutusse PIC-i CCP2 väljund. Aga kas piisab, kui lisan siia:
          Kood:
          SetupPWM:
          ; initializes PWM to 38KHz for IR LED
          BANK1               &#59; select register bank 1
          movlw 0x34    &#59; used to calculate PWM period
          movwf PR2
          BANK0               &#59; register bank 0
          bsf CCP1CON, 4   &#59; CCP1CON<4:5> used to determine
          bcf CCP1CON, 5   &#59; PWM duty cycle
          movlw 0x08   &#59; set duty cycle
          movwf CCPR1L
          BANK1               &#59; register bank 1
          bcf TRISC, 2     &#59; port c is an output
          BANK0               &#59; register bank 0
          movlw b'00000100'    &#59; 
          movwf T2CON     &#59; enable PWM on TIMER2
          return
          sellised read vastavatesse kohtadesse:
          Kood:
          ...
          bsf CCP2CON, 4
          bcf CCP2CON, 5
          ...
          movwf CCPR2L
          ...
          bcf TRISC, 1
          ...
          Või pean põhjalikumalt midagi muutma?
          Oota! Las ma teen seda natuke paremaks...

          Comment


            #35
            vastuseks iseendale: Jah, just sedasi asi toimib.

            Aga küsimus suurele ringile on seekord selline:

            Tahaks vähendada IR navigatsiooni muust valgusest tulenevaid häireid (noise). Selleks mõõdan enne LED-ide sisselülitamist ära TSOPile langevate impulsside arvu, ning peale LED-ide süttimist võtan uue lugemi mida võrdlen esimesega. Igaks juhuks lisasin "noise" lugemile ka konstantse arvu, et vältidajuhust kus teisel korral lihtsalt ollakse valgusallikale lähemale jõudnud vms.
            Probleem selles, et asi ei ole nõus toimima... Kogu aeg käitub, nagu saaks positiivse lugemi. Ehk siis sooritab parempööret. Seda isegi juhul, kui keeran potekatest LED-ide takistused nii suureks, et nad enam ei sütti. (2Megaoomi)

            kus on kala?

            Kood:
            IR_test:
              call	Noise_CountR
              call	RIGHT_PWM_Enable
              WAIT	.02
              call	Sig_CountR
             if	RSIG_TMP>RNOISE_TMP
              goto	Right_IR_obstacle
             else
              call	RIGHT_PWM_Disable
             endif
            
              call	Noise_CountL
              call	LEFT_PWM_Enable
              WAIT	.02
              call	Sig_CountL
             if	LSIG_TMP>LNOISE_TMP
              goto	Left_IR_obstacle
             else
              call	LEFT_PWM_Disable
             endif
             return
            
            Noise_CountR:
              movlw	0x00
              movwf	TEMP
             while	TEMP<0x1E
              btfss	PORTA,0
              incf	RNOISE_TMP,1
              WAIT	.1
              incfsz	TEMP,1
             endw
              movlw	0x05
              addwf	RNOISE_TMP,1
             return
            
            Sig_CountR:
              movlw	0x00
              movwf	TEMP
             while	TEMP<0x1E
              btfss	PORTA,0
              incf	RSIG_TMP,1
              WAIT	.1
              incfsz	TEMP,1
             endw
             return
            Oota! Las ma teen seda natuke paremaks...

            Comment

            Working...
            X