📄 vidu6-1.c
字号:
/*******************************************************************************
; Vidu6-1.c la chuong trinh viet bang C30 de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: Xuat du lieu ra MCP41010 de tao ra song *
; tan so 50 Hz tai ngo ra cua MCP41010. *
;*******************************************************************************
; Tac gia : Nguyen Quang Nam *
; Don vi : PIC Viet Nam *
; Ten tap tin : Vidu6-1.c *
; Ngay : 16/03/2007 *
; Phien ban : 0.01 *
; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *
; Cong cu duoc dung: MPLAB 7.60 *
; C30 3.01 SE *
; ASM30 3.00 *
; LNK30 3.00 *
------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);
//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
#define Fcy 8000000 //Tan so thuc thi lenh
#define _ISR_PSV __attribute__((interrupt, auto_psv))
#define CS LATDbits.LATD0
//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_TMR1(void);
void Init_SPI(void);
//Bang tao ham sin, 0-90 do
const unsigned char __attribute__ ((space(psv), address (0x0400)))
SinTable[91]={0,2,4,7,9,11,13,15,18,20,22,24,26,29,31,33,35,37,39,
41,43,46,48,50,52,54,56,58,60,62,64,65,67,69,71,73,75,76,78,80,82,83,85,87,
88,90,91,93,94,96,97,99,100,101,103,104,105,107,108,109,110,111,112,113,114,
115,116,117,118,119,119,120,121,121,122,123,123,124,124,125,125,125,126,126,
126,127,127,127,127,127,127};
//Cac bien toan cuc
volatile unsigned int time_out;
unsigned int idx, tmp;
unsigned char value;
//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
Init_PORTS(); //Khoi tao cac chan I/O
Init_SPI(); //Khoi tao module SPI, che do master
Init_TMR1(); //Khoi tao Timer 1, timer van chua chay
_PSV=1;
PSVPAG = __builtin_psvpage(SinTable);
T1CONbits.TON = 1; //Bat Timer 1
idx = 0;
CS = 1;
IFS0bits.SPI1IF = 0;
while (1) {
if (time_out == 0xFFFF) {
time_out = 0;
//Su dung tinh doi xung tam cua dang song sin de tinh ra gia tri
//tuc thoi tai 1 goc nao do, dua vao bang du lieu cho 1/4 chu ky
if (idx < 90) value = SinTable[idx] + 128;
else if (idx < 180) value = SinTable[(180 - idx)] + 128;
else if (idx < 270) value = 128 - SinTable[(idx - 180)];
else value = 128 - SinTable[(360 - idx)];
idx++;
if (idx >= 360) idx = 0;
CS = 0;
tmp = SPI1BUF; //Doc du lieu rac de xoa co SPIRBF
//Ghi gia tri moi vao MCP41010, yeu cau cap nhat POT0
SPI1BUF = (0x11 << 8) + value;
while (TMR1 < 180) ; //Cho 1 khoang thoi gian de dsPIC
//gui het 16 bit du lieu
CS = 1;
}
}
}
//Chuong trinh con khoi tao cac PORT
//------------------------------------------------------------------------------
void Init_PORTS(void) {
TRISD = 0;
TRISE = 0;
TRISF = 0x0004;
}
//Chuong trinh con khoi tao Timer 1, tran 360*50 lan moi giay
//------------------------------------------------------------------------------
void Init_TMR1(void) {
TMR1 = 0; //Xoa so dem trong TMR1
// PR1 = 4443; //Timer 1 tran moi 1/1800 giay (555 us)
PR1 = 443; //Timer 1 tran moi 1/18000 giay (55.5 us)
// PR1 = 221; //Timer 1 tran moi 1/36000 giay (27.75 us)
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x0000; //Dung Fcy lam clock, prescale = 1:1, tat Timer 1
_T1IE = 1; //Cho phep ngat Timer 1
}
//Chuong trinh con khoi tao module SPI, che do master
//------------------------------------------------------------------------------
void Init_SPI(void) {
// SPI1CON = 0x072D; //PPRE*SPRE = 1:80, 100 kHz SPI clock, SMP = 1
SPI1CON = 0x073A; //PPRE*SPRE = 1:8, 1 MHz SPI clock, SMP = 1, Master
// SPI1CON = 0x053A; //PPRE*SPRE = 1:8, 1 MHz SPI clock, SMP = 0, Master
// SPI1CON = 0x0532; //PPRE*SPRE = 1:16, 0.5 MHz clock, SMP = 0, Master
// SPI1CON = 0x453A; //PPRE*SPRE = 1:8, 1 MHz clock, SMP = 0, Master, Framed
SPI1STATbits.SPIROV = 0;
SPI1STATbits.SPIEN = 1;
}
//Chuong trinh xu ly ngat Timer 1
//------------------------------------------------------------------------------
void _ISR_PSV _T1Interrupt(void) {
_T1IF = 0; //Xoa co ngat
time_out = 0xFFFF;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -