PIC 16F877A pwm modulü için xc8 de yazmış olduğum kod şimdi çalışmıyor

Başlatan mertlama, 16 Mayıs 2015, 19:42:49

mertlama

Başına daha önce böyle bişey gelen var mı acaba bu kodu başka bir program içinde daha önce kullanmıştım gayet sorunsuz bir şekilde çalışıyordu. Ama içine başka şeyler eklemeye kalktım ve pwm ilginç bir şekilde çalışmamaya başladı şöyle açıklıyım CCPR1L değişkenini adc den okumaya ve ya direk bir değer atadığımda pwm çalışmıyor ama aynı şeyi periyodu değiştirmek için PR2 yi değiştirdiğimde çıkış alıyorum bir türlü çözemedim aldığım yedeklerden kodun eski kullandığım halinede baktım aynı şekilde. kodu aşağıda paylaşıyorum bilgisi olan arkadaşların yardımını rica ediyorum.

#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#include <xc.h>



// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

void adc_setup(void)
{
    ADCS2=0;
    ADCS1=1;
    ADCS0=0;

    PCFG3=0; // AN0,AN1,AN3 analog Vref=vdd,vss
    PCFG2=0;
    PCFG1=1;
    PCFG0=0;

    ADFM=0; 
    ADON=1; // ADC on
}

int adc_go(char channel)
{   int ADCResult;

    CHS2=0; // AN0 seçiliyor
    CHS1=0;
    CHS0=channel;
    __delay_us(25); 
    ADCON0bits.GO = 1;   //Starts ADC conversion
     while (ADCON0bits.nDONE) continue;   //wait till ADC conversion is over

    ADCResult =ADRESH;    //Merging the MSB and LSB
    return ADCResult;

}


void pwm_setup(void)
{ 
 
    CCPR1L=0x00;//Duty register=0
    CCP1X=0; 
    CCP1Y=0;
    T2CKPS1=1; // Prescaler 1:16 
    T2CKPS0=1;
    TOUTPS3=0; // Postscale 1:1 
    TOUTPS2=0;
    TOUTPS1=0;
    TOUTPS0=0;
    CCP1M0=1; // CCP1 PWM 
    CCP1M1=1;
    CCP1M2=1;
    CCP1M3=1;
    TMR2ON=1; // Timer 2 

}


void main(void) 
{
    TRISA=0x03; 
    TRISC=0x00;
    PORTC=0x00;
    PORTB=0x00;
    pwm_setup(); 
    adc_setup(); 
    GIE=1; 
while(1)
{
 CCPR1L=adc_go(); 
}
}

alexsi

hata 1 :
main icerisinde
CCPR1L=adc_go();
şeklinde okumanın doğru olmadığını düşünüyorum.
hata 2:
CCPR1L icerisine adc_go() dan nasıl deger donecek onu anladım. Register kafadan deger dondurur ise eywallah.
Ama sen bunu istemiyorsundur. Return ile geri ne döndürmek istediğin şeye iyi bak.
CCPR1L sabit bir  deger ver, LCD ya da Display de ya da Ledte bak bakalım atadıgın değeri görüyor  musun ?
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?