PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   EPWM trong Pic18f458 ! (http://www.picvietnam.com/forum/showthread.php?t=826)

daihang86 29-12-2006 08:45 AM

EPWM trong Pic18f458 !
 
Em dùng CCS để lập trình full-bridge với khối EPWM trong PIC, nhưng không chạy ! Đại ca nào làm chạy rồi chỉ cho em phát.
Cảm ơn.

namqn 29-12-2006 08:42 PM

Trích:

Nguyên văn bởi daihang86 (Post 6621)
Em dùng CCS để lập trình full-bridge với khối EPWM trong PIC, nhưng không chạy ! Đại ca nào làm chạy rồi chỉ cho em phát.
Cảm ơn.

Bạn viết code như thế nào mà không chạy?

Thân,

daihang86 29-12-2006 11:09 PM

Em dung cac ham nhu sau:

setup_timer_2();
setup_ccp1(CCP_PWM1_H_H) hoac "CCP_PWM_FULL_BRIDGE"
set_pwm1_duty(400)

Em dung cac ham nay cho pwm binh thuong thi chay ngon, nhung cho epwm thi chiu. Mong bac giup em phat, em rat khoai cai epwm cua no, do phai them mach ngoai.

namqn 30-12-2006 08:11 AM

Trích:

Nguyên văn bởi daihang86 (Post 6630)
Em dung cac ham nhu sau:

setup_timer_2();
setup_ccp1(CCP_PWM1_H_H) hoac "CCP_PWM_FULL_BRIDGE"
set_pwm1_duty(400)

Em dung cac ham nay cho pwm binh thuong thi chay ngon, nhung cho epwm thi chiu. Mong bac giup em phat, em rat khoai cai epwm cua no, do phai them mach ngoai.

Dùng ECCP1 thì phải set up theo khuyến cáo của hãng, trình tự ở mục 16.5.8 trong datasheet của PIC18F458. Nếu dùng các hàm có sẵn của CCS thì không có gì đảm bảo thứ tự set up, hơn nữa, địa chỉ của ECCP1 ứng với CCP2 trong CCS.

Thân,

bantrang25 01-01-2007 08:39 AM

Anh Namqn oi! anh co ctrinh mau CCS nao viet cho con AD 16bit (AD7715) ko?No co ctr mau trong CCS, em viet theo no ma ko chay?

namqn 01-01-2007 09:38 PM

Trích:

Nguyên văn bởi bantrang25 (Post 6653)
Anh Namqn oi! anh co ctrinh mau CCS nao viet cho con AD 16bit (AD7715) ko?No co ctr mau trong CCS, em viet theo no ma ko chay?

CCS C đã có driver cho AD7715 rồi, bạn chỉ cần đặt các hàm (bit banging) đó vào trong chương trình của bạn, rồi dùng chúng là được. Bạn nên post phần code mà bạn đã thử, và cả sơ đồ phần cứng của bạn nữa.

Thân,

daihang86 02-01-2007 05:11 PM

To Namqn, em đã thử với ECCP2 vẫn chẳng thấy tín hiệu ra cả, anh có thời gian xem hộ em phát. Chứ em thử hết các kiểu trong CCS rồi, vì mỗi EPWM mà phải học thêm phần mền biên dịch khác thì cũng mệt.

namqn 02-01-2007 08:07 PM

Trích:

Nguyên văn bởi daihang86 (Post 6660)
To Namqn, em đã thử với ECCP2 vẫn chẳng thấy tín hiệu ra cả, anh có thời gian xem hộ em phát. Chứ em thử hết các kiểu trong CCS rồi, vì mỗi EPWM mà phải học thêm phần mền biên dịch khác thì cũng mệt.

Dưới đây là đoạn chương trình thử ECCP của tôi, viết trong Basic của PIC18 Simulator, bạn chuyển thành CCS C đi nhé:

Code:

TRISD = TRISD Or 0xf0
PR2 = 0x80
ECCPR1L = 0x40
ECCP1CON = 0x4c
PIR1.TMR2IF = 0
T2CON = T2CON And 0xfc
T2CON.TMR2ON = 1
While PIR1.TMR2IF = 0
Wend
TRISD = TRISD And 0x0f
loop:
Goto loop  'loop forever

Thân,

Sangcao 05-01-2007 10:10 AM

Anh Nam a , day la ctr cua em, em hien thi tren led 7 doan, phan hien thi ko co gi , chan cua ad7715 em noi chan nhu trong huong dan. day la code:
Code:

#include <16f877.h>
#include <defs_16f877A.h>
//#include <AD7715.c>
//#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT//HS,NOWDT,NOLVP,NOPUT, NOCPD, NOWRT, NOBROWNOUT, NOPROTECT  //NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=11059200)  // Su dung Fuse nay thi co nhieu , ko biet tai sao?
#use fast_io(b)
#use fast_io(d)
#use fast_io(c)

int8 const  BCD2LED[]={ 0x41, 0xED, 0x54, 0xC4, 0xE8,\
                                                        0xC2, 0x42, 0xE5, 0x40, 0xC0, };
int8      COUNT1 ,COUNT2;

int16    COUNTX,T1,T2;          // Bien trong ngat
int16      BUFF[4], Y0, Y1;        // Bo dem de hien thi so tat hay khong
int8      BCD[4];
 int16 value;
//-------------------------------------------------------------//
#define LED1 RB4              // =0 thi LED sang
#define LED2 RB5
#define LED3 RB6
#define LED4 RB7
//-----------
#define ADC_CS    RC7  // Noi dat GND
#define ADC_RESET RC6  // Noi VCC
#define ADC_DRDY  RC2
#define ADC_DI    RC4
#define ADC_DO    RC5
#define ADC_CLK  RC3



 Void LamTuoi()

  {
      if(COUNT1 >=4)  {COUNT1 = 0;    }
                    PORTB = 0xf0;
          PORTD = BCD2LED[BCD[COUNT1]];  // CHOT*/

              switch (COUNT1) {
              case 0: LED1 =0; //bat led1
                      break;
              case 1: LED2 =0; //bat led2
                      break;
              case 2: LED3 =0; //bat led3
                      break;
              case 3: LED4 =0; //bat led4
                      break;

                      }
              COUNT1 ++;
 }
#int_timer0
void ngat()
  {
      Set_timer0(0);
            COUNT2 ++;
      if (Count2 == 10){
                        Count2 = 0;
                        LamTuoi();
                        //COUNTX = read_adc();
                        }
  }
void InBCD(int8 value4,int8 value3,int8 value2,int8 value1)
    {
          BCD[0]= value4;
          BCD[1]= value3;
          BCD[2]= value2;
          BCD[3]= value1;
    }


void LedView( int16 Value) // DUA SO VAO DE HIEN THI
  {
          BUFF[3]  = Value/1000;
          Y0      = Value%1000;
          BUFF[2]  = Y0/100;
          Y1      = Y0%100;
          BUFF[1]  = Y1/10;
          BUFF[0]  = Y1%10;

          InBCD(BUFF[3],BUFF[2],BUFF[1],BUFF[0]);
  }

void write_adc_byte(Byte data);

adc_init()
{
        ADC_RESET = 0;
  ADC_CLK =1;
        ADC_CS =1;        //Set low to AD7715 chip select low pin
        ADC_RESET =1;        //Set high to AD7715 reset low pin
        delay_ms(30);

        write_adc_byte( 0x12 );                        //Communications Register
        write_adc_byte( 0x62 );                        //Setup Register info here
}

void write_adc_byte(BYTE data) {
    int8 i;

    ADC_CS =0;
  for(i=1;i<=8;++i) {
      ADC_CLK =0;
    output_bit(PIN_C4,shift_left(&data,1,0));  // Output the MSB of data to

    // DI and at the same time  shift 0 into the LSB of data

      ADC_CLK =1;
                      }
  ADC_CS =1;
}


 int16 read_adc_word() {
  int8 i;
  BYTE data;

  ADC_CS =0;
  for(i=1;i<=16;++i) {
      ADC_CLK =0;
      ADC_CLK =1;
      shift_left(&data,2,input(PIN_C5));
  }
  ADC_CS =1;
  return data;
}



 int16 read_adc_value() {
        int16 value;  //long mac dinh kieu int16

        while ( input(PIN_C2) );
        while ( !input(PIN_C2) );
        while ( input(PIN_C2) );

        write_adc_byte(0x3a);
        value=read_adc_word();

//        return value;
}



void KhoiTao()
{
    set_tris_b(0b00001111);          // 1 Dau vao =0 la dau ra
    set_tris_d(0);                    // ra
    set_tris_c(0b11111111);
    enable_interrupts(global);
    //enable_interrupts(int_ext);
    enable_interrupts(int_timer0);
    Setup_timer_0(RTCC_INTERNAL| RTCC_DIV_4);
    Set_timer0(0) ;              //vao
    Value=0;
    Delay_ms(10);

}
    //-------------------------------------------------------------


void main()
 {    Khoitao();
    adc_init();
      ledview(Value);
      Lamtuoi();

  while (1) {

      read_adc_value() ;

      ledview(Value);
      Lamtuoi();

  }


 }


Sangcao 05-01-2007 10:20 AM

Anh xem cho em tai sao lai ko chay nhe! Em nghi chi can trong ctr chinh goi ham Read_adc_value(), sau do hien thi kq value la ok, em lam the sao no ko chay? anh xem ho em nhe! thank!

namqn 05-01-2007 09:33 PM

Trích:

Nguyên văn bởi Sangcao (Post 6689)
Anh xem cho em tai sao lai ko chay nhe! Em nghi chi can trong ctr chinh goi ham Read_adc_value(), sau do hien thi kq value la ok, em lam the sao no ko chay? anh xem ho em nhe! thank!

Lệnh gọi hàm read_adc_value() trả về giá trị 16-bit, nhưng trong main lại không ghi giá trị trả về đó vào biến value. Trong C, hai biến 'Value' và 'value' có phải là 1 biến hay không?

Chương trình con read_adc_value() dùng biến cục bộ value để lưu giá trị trả về, sau đó trả về bằng lệnh return. Bạn lại chú thích lệnh return đó, do đó chương trình không thực hiện đúng ý đồ là lẽ đương nhiên.

Thân,

Sangcao 08-01-2007 12:55 PM

Cam on anh Nam nhieu! Ve nha em se thu lai! co gi em hoi anh tiep nhe

moihocpic1985 09-01-2007 09:56 AM

ADC 8bit
 
Trích:

Nguyên văn bởi namqn (Post 6705)
Lệnh gọi hàm read_adc_value() trả về giá trị 16-bit, nhưng trong main lại không ghi giá trị trả về đó vào biến value. Trong C, hai biến 'Value' và 'value' có phải là 1 biến hay không?

Chương trình con read_adc_value() dùng biến cục bộ value để lưu giá trị trả về, sau đó trả về bằng lệnh return. Bạn lại chú thích lệnh return đó, do đó chương trình không thực hiện đúng ý đồ là lẽ đương nhiên.

Thân,

Em dung assemly tren 16f877a thi co the chuyen doi adc va hien thi ra led tot nhung khi dung CCSC thi khong chay gi ca. Anh xem doan code sau co sai cho nao khong gium em nha:
Code:

#include <16f877a.h>
#device *=16 ADC=8
#use delay(clock=4000000)
#byte portb=0x06

#fuses nolvp,nowdt,hs,noprotect

int8 ADC_delay;
 
void hienthi()
{
  set_adc_channel(0);
  delay_ms(5);
  ADC_delay=read_adc();
  portb=0x00;
  delay_ms(ADC_delay);

  portb=0xff;
  delay_ms(ADC_delay);
}

void main()
{
  setup_adc_ports(AN0_AN1_AN3);
  setup_adc(adc_clock_internal);
  set_adc_channel(0);
  while(1);
  {
      hienthi();
     
  }
}


Sangcao 09-01-2007 01:23 PM

Ban thu ctrinh nay, da co trong Pic viet Nam: Tu do phat trien len nhe!
Code:

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP  //Ðây là 1 ví du nho ve ADC,chân RA0 lay tín hieu Analog tu bien tro
#device 16F877*=16 ADC=8        //và xuat giá tri se bien doi tuong ung qua tám led noi o portB
#use delay(clock=10000000)
Int8 adc;
main()
{
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(true)
{
adc=read_adc();
output_B(adc);
}
}



Múi giờ GMT. Hiện tại là 11:05 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam