|
#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
可以幫我看一下嗎 |
|