Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3674|回復: 1
打印 上一主題 下一主題

為什麼這樣沒有輸出波形

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-2-16 11:08:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <c8051f120.h>                 // SFR declarations

//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------

//#define INTCLK       24500000          // Internal oscillator frequency in Hz
#define SYSCLK       22118400*9/2//49000000          // Output of PLL derived from (INTCLK*2)
#define TIMER_TICKS_PER_MS SYSCLK/TIMER_PRESCALER/1000
#define TIMER_PRESCALER
           100
#define LED_TOGGLE_RATE            100
#define AUX1     TIMER_TICKS_PER_MS*LED_TOGGLE_RATE
#define AUX2
-AUX1
#define AUX3
AUX2&0x00FF
#define AUX4
((AUX2&0xFF00)>>8)

#define TIMER0_RELOAD_HIGH         AUX4 //RELOAD VALUE FOR TIMER0 HIGH BYTE
#define TIMER0_RELOAD_LOW
   AUX3 //RELOAD VALUE FOR TIMER0 LOW BYTE

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

void OSCILLATOR_Init (void);
void PORT_Init (void);
void PCA0_Init (void);
void Delay (int dly);
void motorContrl (int motor1,int motor2);
void Timer0_Init (void);

//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------

unsigned int CEX0_Compare_Value;
unsigned int CEX1_Compare_Value;       // Holds current PCA compare value
unsigned int motor1=2200;
unsigned int motor2=6200;
sbit LED = P1^6;


void OSCILLATOR_Init (void)
{
   int i=0;            

   SFRPAGE = CONFIG_PAGE;              // Set SFR page
   OSCXCN = 0x67;
   for (i=0;i<3000;i++);
   while((OSCXCN & 0x80) == 0);
   OSCXCN = 0x83;
   PLL0CN  = 0x04;                     // Set internal osc. as PLL source
   CCH0CN  &= ~0x20;


   SFRPAGE = LEGACY_PAGE;
   FLSCL   = 0xB0;                     // Set FLASH read time for 50MHz clk

   SFRPAGE = CONFIG_PAGE;
   CCH0CN  |=0x20;
   PLL0CN  |=0x01;                     // Enable Power to PLL
   PLL0DIV = 0x02;                     // Set Pre-divide value to N (N = 1)
   PLL0FLT = 0x07;                     // Set the PLL filter register for
                                       // a reference clock from 19 - 30 MHz
                                       // and an output clock from 45 - 80 MHz
   PLL0MUL = 0x09;                     // Multiply SYSCLK by M (M = 2)

   for (i=0; i < 15; i++);   
   // Wait at least 5us
   PLL0CN  |= 0x02;                    // Enable the PLL
   while(!(PLL0CN & 0x10) == 0);       // Wait until PLL frequency is locked
   CLKSEL  = 0x02;                     // Select PLL as SYSCLK source
   OSCICN  &=~0x80;
}


void PORT_Init (void)
{
   char SFRPAGE_save = SFRPAGE;        // Save Current SFR page

   SFRPAGE = CONFIG_PAGE;              // Set SFR Page

   XBR0    = 0x98;                     // Route CEX0 to P0.0
   XBR1    = 0x00;
   XBR2    = 0x40;                     // Enable crossbar and weak pull-ups

   P0MDOUT |= 0x03;
   P1MDOUT |= 0xFF;                    // Set CEX0 (P0.0) to push-pull
   SFRPAGE = SFRPAGE_save;             // Restore SFR Page
}
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------

void main (void)
{
   SFRPAGE = CONFIG_PAGE;

   // Disable watchdog timer
   WDTCN = 0xde;
   WDTCN = 0xad;

   PORT_Init ();                       // Initialize crossbar and GPIO
   OSCILLATOR_Init ();                 // Initialize oscillator
   PCA0_Init ();
   Timer0_Init();                      // Initialize PCA0
   EA = 1;  
   IE =0x92;                          

   //SFRPAGE = PCA0_PAGE;
   while (1)
   {
      
motorContrl(0,0);

Delay(1000);


    motorContrl(90,90);

Delay(1000);


     
motorContrl(180,180);

Delay(1000);
}
}

void motorContrl (int Angle1 ,int Angle2)
{

Angle1 = 4200 + Angle1 *22;

Angle2 = 4200 + Angle2 *25;


CEX0_Compare_Value = 65535 - Angle1;

CEX1_Compare_Value = 65535 - Angle2;


PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);
    PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;


PCA0CPL1 = (CEX1_Compare_Value & 0x00FF);
    PCA0CPH1 = (CEX1_Compare_Value & 0xFF00)>>8;


CR=1;
}
void PCA0_Init (void)
{
   char SFRPAGE_save = SFRPAGE;        // Save current SFR Page

   SFRPAGE = PCA0_PAGE;

   // Configure PCA time base; overflow interrupt disabled
   PCA0CN = 0x00;                      // Stop counter; clear all flags
   PCA0MD = 0x0A;                      // Use SYSCLK as time base

   PCA0CPM0 = 0xCB;                    // Module 0 = 16-bit PWM mode and
                                       // enable Module 0 Match and Interrupt
                                       // Flags
   PCA0CPM1 = 0xCB;                    // Module 0 = 16-bit PWM mode and
                                       // enable Module 0 Match and Interrupt
                                       // Flags
   // Configure initial PWM duty cycle = 50%
   CEX0_Compare_Value = 65536 - motor1;
   CEX1_Compare_Value = 65536 - motor2;

   PCA0CPL0=(CEX0_Compare_Value & 0x00FF);
   PCA0CPH0=(CEX0_Compare_Value & 0xFF00)>>8;

   PCA0CPL1=(CEX1_Compare_Value & 0x00FF);
   PCA0CPH1=(CEX1_Compare_Value & 0xFF00)>>8;
   // Start PCA counter
   CR = 1;

   SFRPAGE = CONFIG_PAGE;
   EIE1 |= 0x0C;                       // Enable PCA interrupts

   SFRPAGE = SFRPAGE_save;
}
void Delay (int dly)
{

unsigned int i;

unsigned int j;

for(i=0;i<dly;i++)

{


for(j=0;j<dly;j++)

{

dly=dly;

}

}
}

void PCA0_ISR (void) interrupt 9
{
   CCF0 = 0;                           // Clear module 0 interrupt flag.

   PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);
   PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;

   PCA0CPL1 = (CEX1_Compare_Value & 0x00FF);
   PCA0CPH1 = (CEX1_Compare_Value & 0xFF00)>>8;
}

void Timer0_Init(void)
{

char SFRPAGE_SAVE = SFRPAGE;


SFRPAGE = TIMER01_PAGE;


TH0=TIMER0_RELOAD_HIGH;
    TL0=TIMER0_RELOAD_LOW;

TMOD = 0x01;

CKCON = 0x02;

ET0=1;

TCON = 0x10;


SFRPAGE = SFRPAGE_SAVE;
}

void Timer0_ISR (void) interrupt 1
{

LED = ~LED;

TH0 = TIMER0_RELOAD_HIGH;

TL0 = TIMER0_RELOAD_LOW;
}

//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------



0 error 0 warning
可以幫我看一下嗎
nichal 該用戶已被刪除
2#
發表於 2012-3-1 15:51:46 | 只看該作者
SFR切換page的參數沒有看到定義
有可能參數沒正確設定
建議用Configuration Wizard先把設定值設好再寫程式

可以問一下為啥要用F120?
如果是小系統
用這個有點太over了
光是設定就累死........
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-4-29 05:20 , Processed in 0.303044 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表