Benötigen Sie Hilfe bei der PWM-Ausgabe von PIC16F887

Ich versuche, das PWM-Subsystem auf einem PIC16F887 zum Laufen zu bringen. Ich habe das mehrmals durchgegangen und kann einfach nicht scheinen, mein Problem zu finden.
Dies ist Teil eines größeren Programms, aber der Einfachheit halber habe ich nur den PWM-Teil neu geschrieben. Ich verwende das Datenblatt als Leitfaden für die Konfiguration des PWM-Subsystems, insbesondere Seite 131. Ich mache mir keine Sorgen, ob ich eine bestimmte Frequenz oder einen bestimmten Arbeitszyklus herausbekomme. Ich versuche nur, eine Art Wellenform aus den PWM-Pins zu sehen.
Code lässt sich gut kompilieren, aber ich erhalte keine Ausgabe von RC2.

Vielen Dank für jede Hilfe.
Ich bin mir nicht sicher, warum die Tabulatortaste des Codes beim Einfügen in diese Frage etwas verstümmelt wurde.

Platine: PIC16F887 mit 44-poliger Demoplatine (Microchip).
Programmierer: PICkit3
Compiler: gpasm

;*******************************************************
;Notes
;PWM is used on CCP1 which is P1A which is RC2
;********************************************************
    INCLUDE registers.asm
    __CONFIG 0X2EFF20E5

    ORG 0x00
    GOTO    MAIN

;******************************************************
;Main Program Loop
;******************************************************
    ORG 0X05
MAIN
    CALL    SETUP
    CALL    SETUP_PWM
wait
    BTFSS   PIR1,1  ;TEST TR2IF
    GOTO    wait
    BSF STATUS,5    ;Select Bank1
    CLRF    TRISC   ;START PWM
    BCF STATUS,5    ;Select Bank0
    BSF PORTD,0     ;ENTERING MAIN LOOP
main_loop
    GOTO    main_loop

;****************************************************************
;Setup Subroutine
;general setup
;****************************************************************
SETUP
    BSF STATUS,6    ;SELECT BANK 3
    BSF STATUS,5
    MOVLW   0X00
    MOVWF   ANSELH  ;CONFIGURE ALL PINS FOR DIGITAL IO
    MOVWF   ANSEL  
    BCF STATUS,6    ;SELECT BANK1
    BSF OSCCON,4    ;OSCILLATOR TO LOW SPEED
    BSF OSCCON,5
    BSF OSCCON,6
    MOVLW   0XFF    
    CLRF    INTCON  ;DISABLE INTERRUPTS
    CLRF    TRISD   ;PORTD AS OUTPUT  
    BCF STATUS,5    ;SELECT BANK0
    RETURN  
;********************************************************
;SETUP PWM MODULE 
;********************************************************
SETUP_PWM
    BCF STATUS,6    ;SELECT BANK1
    BSF STATUS,5
    MOVLW   0XFF    ;DEFINE PORT B AS INPUT
    MOVWF   TRISC   ;PORT C INPUT
    MOVWF   PR2     ;SET PWM PERIOD TO 33ms

    BCF STATUS,5    ;SELECT BANK0
    MOVLW   0X0C    ;SET FOR SINGLE OUTPUT ON P1A AND
    MOVWF   CCP1CON ;ACTIVE HIGH. LSBS OF DUTY =0
    MOVLW   0X25
    MOVWF   CCPR1L  ;SET HIGH BITS FOR DC=50% (Roughly)
    BCF PIR1,1      ;CLEAR TMR2IF
    BCF T2CON,0     ;SET TIMER2 PRESCALER TO 1
    BCF T2CON,1
    BSF T2CON,2     ;START TMR2
    RETURN  
    END

Wie angefordert, registers.asm

;*******************************************
;ANY BANK
;*******************************************
STATUS  equ 0x03    
INTCON  equ 0x0B

;*******************************************
;Bank 0 Registers
;*******************************************
PORTB   equ 0x06    
PORTC   equ 0x07    
PORTD   equ 0x08
PIR1    equ 0x0c    
T2CON   equ 0x12    
CCPR1L  equ 0x15    
CCPR1H  equ 0x16    
CCP1CON equ 0x17
CCPR2L  equ 0x1b    
CCPR2H  equ 0x1c    
CCP2CON equ 0x1d

;*******************************************
;Bank 1 Registers
;*******************************************
OPTION_REG  equ 0x81
TRISB   equ 0x86    
TRISC   equ 0x87    
TRISD   equ 0x88    
PIE1    equ 0x8c
OSCCON  equ 0x8f
PR2 equ 0x92    
WPUB    equ 0x95    

;*******************************************
;Bank 3 Registers
;*******************************************
ANSEL   equ 0x0188
ANSELH  equ 0x0189
Bitte posten Sie Ihre registers.asm-Datei.
getan, obwohl ich die beiden Codeblöcke anscheinend nicht trennen konnte.
'MOVWF PR2 ;PWM-PERIODE AUF 33ms SETZEN' überprüfen Sie diese Zeile zurück. Ich glaube, Sie haben 33 nicht geladen.
Du hast Recht. Ich habe die OSCCON-Einstellung vermasselt. Seltsam, dass es die PWM am Laufen gehindert hätte ... Scheint jetzt aber zu funktionieren. Geben Sie Ihre Antwort in eine Antwort ein und ich werde akzeptieren.
Genauso wie eine Seite nicht, gerade Montage ist der Teufel. Ich bin froh, dass es funktioniert hat, vielleicht wird @sandundhammika seine Antwort posten. Ohne das @ und seinen Namen wird er jedoch nicht benachrichtigt, dass Sie geantwortet haben.
Danke. Das habe ich vergessen. Ich schätze, ich bin einer der wenigen Menschen, die (ernsthaft) Spaß an der Montage für einfache Projekte haben. und danke @m.Alin für die Änderungen.

Antworten (1)

Dies ist ein Projekt in einem anderen Compiler (MPASM) und einem anderen PIC16, aber es könnte Ihnen helfen, die Konfiguration des Registers zu beachten. Der nächste Code wird verwendet, um die Geschwindigkeit eines Motors mit einer H-Brücke zu steuern, ich hoffe, dass es für Sie funktioniert:

`   ;use of the CCP module to control motor speed using PWM 
           include p16F877A.inc `

`cntr equ 20
cntr1 equ 21 `


` __CONFIG _RC_OSC & _CP_OFF & _WDT_OFF 
               org 00
             goto start
               org 04
             goto ISR
               org 06
;main program************************************* 
start       bsf STATUS, RP0
            bcf STATUS, RP1 ; select bank 1
            movlw 00
            movwf TRISC 
            movlw B'11111111'
            movwf TRISB
            movwf PR2 ; 255 to PR2
            bcf OPTION_REG, 7 ; active pull-up
            bcf STATUS, RP0 ; select bank 0
            movlw 00
            movwf PORTC
            movlw B'00001100' ; enable PWM
            movwf CCP1CON
            movlw D'128'
            movwf CCPR1 ; 50% duty cycle(motor off)
            bsf T2CON, TMR2ON ; shoot tmr2 without post nor preescale 
            bsf T2CON, T2CKPS1 ; prescaler in 16
            movlw B'10001000' ; INTCON pattern
            movwf INTCON
            goto $
;*************************************************
;SUBROUTINE DELAY*********************************
;*************************************************
delay       movlw D'255'
            movwf cntr
     del1   movlw D'10'
            movwf cntr1
     del    decfsz cntr1
            goto del  
            decfsz cntr
            goto del1
            return
;************************************************`

`;************************************************* 
;INTERRUPT SERVICE ROUTINE************************
;************************************************* 
ISR         btfss PORTB, RB4
            goto incSpeed
            btfss PORTB, RB5
            goto decSpeed
            goto exit`

`incSpeed    movlw D'255'
            xorwf CCPR1, W
            btfsc STATUS, Z ;test increment limit
            goto exit     
            call delay
            movlw D'1'
            addwf CCPR1, F
            btfss PORTB, RB4
            goto incSpeed
            goto exit`

`decSpeed    movlw 0
            xorwf CCPR1, W
            btfsc STATUS, Z ;test decrement limit
            goto exit     
            call delay
            movlw D'1'
            subwf CCPR1, F
            btfss PORTB, RB5
            goto decSpeed
            goto exit`

`exit        bcf INTCON, RBIF
            retfie 
;********************************************  `            
           ` end `

Ich schlage vor, in C-Compiler zu programmieren

schau dir die Hardw an (ISIS PROTEUS):Geben Sie hier die Bildbeschreibung ein