Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
OC na PIC-u
#1
Pozdrav svima,
da li je neko radio sa Output compare na PIC-u?

Modul sam po sebi nije komplikovan ali ne uspevam par dana da ga nateram da radi Sad

Ideja mi je da ga koristim za duzinu step impulsa za koracne motore.
Treba mi da kada se software-ski trigeruje da napravi single step 50uS
Reply
#2
Milane,

evo koda za jedan impuls sirine 50us. Kada se zavrsi impuls, generise se interapt.

PHP Code:
    LIST P=12F683
    
#INCLUDE "P12F683.INC"
    

;*****    CONFIGURATION WORD  *****
    
__CONFIG    _INTOSCIO _INTRC_OSC_NOCLKOUT _WDT_OFF _PWRTE_ON _MCLRE_OFF _CP_OFF _BOD_ON _IESO_OFF _FCMEN_OFF


;***********************
;* 
KORISNICKI REGISTRI *
;***********************
W_TEMP                EQU        0x20
STATUS_TEMP            EQU        0x21
PULSE_WIDTH_HI            EQU        0x23
PULSE_WIDTH_LO            EQU        0x24

    ORG    0x00
    
GOTO    INIT

; ***** INTERAPT RUTIN *****

    
ORG    0x04

    MOVWF    W_TEMP                    
;COPY W TO TEMP REGISTER
    SWAPF    STATUS
,W                ;SWAP STATUS TO BE SAVED INTO W
                            
;SWAPF ARE USED BECAUSE THEY DO NOT AFFECT STATUS BITS
    BCF    STATUS
,RP0                ;SELECT BANK 0
    MOVWF    STATUS_TEMP                
;SAVE STATUS TO BANK ZERO STATUS_TEMP REGISTER

    BTFSS    PIF1
,CCP1IF                ;ISPITIVANJE INTERAPTA OD CCP modula
    
GOTO    INTEND
    BCF    PIR1
CCP1IF                OCISTI CLEAR ON MATCH flag

;***** OVDE SE PISE PROGRAM KOJI SE IZVRSAVA KADA SE ZAVRSI GENERISANJE IMPULSA *****


INTEND
    SWAPF    STATUS_TEMP
,W                ;SWAP STATUS_TEMP REGISTER INTO W (SETS BANK TO ORIGINAL STATE)
    
MOVWF    STATUS                    ;MOVE W INTO STATUS REGISTER
    SWAPF    W_TEMP
,F                ;SWAP W_TEMP
    SWAPF    W_TEMP
,W                ;SWAP W_TEMP INTO W
    RETFIE                        
;RETURN FROM INTERRUPT

; ***** INICIJALIZACIJA MIKROKONTROLERA *****
INIT
    BSF    STATUS
,RP0                ;SELECT BANK 1
    MOVLW    
B'01110001'                ;INTERNI OSCILATOR 8MHz
    MOVWF    OSCCON
    BCF    STATUS
,RP0                ;SELECT BANK 0
    MOVLW    07H
    MOVWF    CMCON0                    
;ISKLJUCI KOMPARATORSKI MODUL
    
BSF    STATUS,RP0                ;SELECT BANK 1
    MOVLW    
B'00000'
    
MOVWF    TRISIO                
    BCF    STATUS
,RP0                ;SELECT BANK 0
    CLRF    GPIO
    BCF    PIR1
,CCP1IF
    BSF    INTCON
,GIE                ;GLOBAL INTERRUPT ENABLE.

; ***** 
SIRINA IMPULSA 50US ******    
    
MOVLW    0x00
    MOVWF    PULSE_WIDTH_HI
    MOVLW    0xc7
    MOVWF    PULSE_WIDTH_LO

    MOVLW    
B'00000001'
    
MOVWF    T1CON                    TMR1 RADI U FREE RUNNING MODUNEMA DELJENJA TAKTA    

LAB2    MOVF    PULSE_WIDTH_HI
,W
    MOVWF    CCPR1H
    MOVF    PULSE_WIDTH_LO
,W
    MOVWF    CCPR1L
    CLRF    TMR1H
    CLRF    TMR1L        
    BCF    PIR1
,CCP1IF
    MOVLW    
B'00001001'                ;COMPARE MODULECLEAR ON COMPARE MATCH
    MOVWF    CCP1CON    
    BSF    PIE1
CCP1IE                OMOGUCI INTERAPT CCP-A        

MAIN
    
GOTO    MAIN

    END 
Reply
#3
Iako nisam pristalica instant rešenja, ipak, možda možeš da ga iskoristiš za "template", pa ćeš nakon toga da prilagodiš sebi inicijalno generisani kod.
U pitanju je MCC (code generator) koga možeš naći u sklopu MBLAB X-a, instaliraš ga kao plugin.
http://www.microchip.com/mplab/mplab-x-ide
http://www.microchip.com/mplab/mplab-code-configurator
Reply
#4
Pozdrav svima i srecna vam nova godina Smile

Da ne otvaram novu temu....

Hteo sam da iskoristim OC modul da generisem ismpuls od 50us

Code:
for(i=0;i<10000;i++)
   {
       
       
       OC1TMR = 0;
       OC1CON1 = 0;
       OC1R = 10;
       OC1RS = 810;
       OC1TMR = 0;
       OC1CON1 = 0x1C04;
       
       
       __delay_us(1000);
   }

Na prvi pogled sve je ok ali kada se bolje pogleda prednja ivica nesto se cudno desava





Da li mozda neko zna gde je greska?

Pozdrav
Reply
#5
Sta ti je cudno sa prednjom ivicom?
Reply
#6
Oznacio sam na slici

Reply
#7
Jel to lazni impuls? Na njega mislis?
Reply
#8
Da da, bas na njega mislim.
Ne bi trebalo da je tu Smile
Reply
#9
Koji PIC je u pitanju?
Reply
#10
PIC24FJ64GA204
Reply
#11
Jesi probao ovako?


Code:
OC1CON1 = 0;
OC1TMR = 0;
OC1R = 10;
OC1RS = 810;

for(i=0;i<10000;i++)
{
  OC1TMR = 0;            //mozda i ovo da se izbaci iz petlje
  OC1CON1 = 0x1C04;
   
  __delay_us(1000);
}
Reply
#12
Ne treba ti ta petlja uopšte. Kada se desi OC prekid (zadnja ivica) potrebno je da zaustaviš OC modul. Dodaj još jedan tajmer na čiji ćeš prekid da omogućiš rad OC modula i to je sve.
Kako ti je podešen OC1CON2?
Reply
#13
Problem je resen.
Hvala gorankg, vojinilic, enaB

U petlji je ostalo samo :
Code:
for(i=0;i<100000;i++)
    {
        OC1CON1bits.OCM = 4;      
        __delay_us(300);
    }

Inace ova petlja mi je samo za probu.
Cela ideja sa OC modulima je da bila da imam mogucnost da pokrenem generisanje impulsa odredjene sirine a da se OC modul bavi spustanjem pina na 0 kada vreme istekne.
Ovo se naravno moze oradi i sa tajmerom ali nemam ni jedan slobodan a trebaju mi 3 pina za impulse.

Ovako je OC modul podesen:

Code:
void OC1_Initialize (void)
{
    // ENFLT0 disabled; ENFLT1 disabled; OCFLT2 disabled; ENFLT2 disabled; OCSIDL disabled; OCM Double Compare Single-Shot mode; OCFLT1 disabled; OCFLT0 disabled; OCTSEL FOSC/2; TRIGMODE Only Software;
    OC1CON1 = 0x1C04;
    // SYNCSEL None; TRIGSTAT disabled; DCB Start of instruction cycle; OCINV enabled; OCTRIG Trigger; OC32 disabled; FLTOUT disabled; OCTRIS disabled; FLTMD Cycle; FLTTRIEN disabled;
    OC1CON2 = 0x1080;
    // OC1RS 0;
    OC1RS = 0x0000;
    // OC1R 0;
    OC1R = 0x0000;
    
    gOC1Mode = OC1CON1bits.OCM;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)