?? slave.c
字號:
#include <pic.H>
#include "delay.h"
//#define SIMPLE_TEST
//------------------------------------------------------
//
// [---__----]
// RA2 [ ] RA1
// RA3 [ ] RA0
// RA4 [ ] RA7
// RA5 [ ] RA6
// VSS [ ] VDD
// RB0 [int ] RB7
// RB1 [ ] RB6
// RB2 [TU ] RB5 SDA
// RB3 [PWM ] RB4 SCL
// [---------]
#define IDLE 0
#define WAIT_START 1
#define START_RECIEV 2
#define RECIVE 3
#define NEXT_BYTE 4
#define ACK 5
#define WAIT_STOP 6
#define TURBO_PIN RB2
#define TURBO_DIR TRISB2
#define SCL RB4
#define SDA RB5
#define SCL_DIR TRISB4
#define SDA_DIR TRISB5
// change pins on the 24/2/07 from RA0,RA1
#define INPUT 1
#define OUTPUT 0
unsigned char I2C_STAT,Bptr,BitCount,adress,t0cnt,ft,ft1;
unsigned char B[4];
bit t0flag,turboflag;
unsigned char cont_mode,flash_mode,flash_time,pwr_mode;
//eeprom adress
#define CONT_ADR 0
#define FLASH_ADR 1
#define TIME_ADR 2
//controls
#define SET_CONT 0x10
#define SET_FLASH 0x20
#define SET_TIME 0x30
#define OFF 0x40
#define ON 0x50
#define TURBO 0x60
//*********************************
#define READ_CONT 0x10
#define READ_FLASH 0x20
#define READ_TIME 0x30
bit I2C_CMD,NEW_TASK;
void I2CLOOP(void);
#define READ 1
#define WRITE 0
__CONFIG ( MCLREN & UNPROTECT & WDTDIS & PWRTEN & INTIO & LVPDIS & BORDIS);
//__CONFIG ( UNPROTECT & WDTDIS & PWRTEN & LVPDIS & BOREN & XT);
#define FCPU 4000000
#define FPWM 20000
#define PERIOD 1/FPWM
#define PR2VAL 50//PERIOD*FCPU/4
#define DUTY 10
void interrupt isr(void)
{
unsigned char CCP1CON_T,CCPR1L_T;
if(INTE && INTF)
{
INTF=0;
CCPR1L_T = CCPR1L; //save pwm value
CCP1CON_T = CCP1CON; //save pwm value
CCPR1L = flash_mode >> 2;
if (flash_mode & 0x02) CCP1X = 1;
else
CCP1X = 0;
if (flash_mode & 0x01) CCP1Y = 1;
else
CCP1Y = 0;
if (!turboflag)
{
while (!RB0)
{}
}
else
{
TURBO_PIN = 1;
for (ft = 0;ft < flash_time;ft ++)//time = flash_time *2msec
{
for (ft1 = 0;ft1 < 0xf0;ft1++)
{
#asm
nop
#endasm
}
}
TURBO_PIN = 0;
while (!RB0)
{}
}
CCPR1L = CCPR1L_T;
CCP1CON = CCP1CON_T;
}
if (T0IE && T0IF)
{
T0IF = 0;
TMR0 = 100;//200us interrupt
// TMR0 = 247;//42us interrupt
t0flag = 1;
t0cnt++;
if (t0cnt > 100)
{
t0cnt = 0;
}
}
}
void EESAVE(unsigned char adrr,unsigned char data)
{
EEADR = adrr;
EEDATA = data;
// EEPGD = 0;
WREN = 1;
GIE = 0;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
GIE = 1;
WREN = 0;
while (WR)
{
}
}
unsigned char EEREAD(unsigned char adrr)
{
EEADR = adrr;
// EEPGD = 0;
RD = 1;
return EEDATA;
}
void I2CLOOP(void)
{
switch (I2C_STAT)
{
case IDLE:
if ((SCL) && (SDA))
{
I2C_STAT = WAIT_START;
Bptr = 0;
BitCount = 0;
}
break;
case WAIT_START:
if ((SCL) && (!SDA))
{
I2C_STAT = START_RECIEV;
}
break;
case START_RECIEV:
if (!SCL)
{
I2C_STAT = RECIVE;
}
if ((SDA) && (SCL))
{
I2C_STAT = IDLE;
}
break;
case RECIVE:
if (SCL)
{
if (BitCount++ == 8)
{
I2C_STAT = ACK;
}
else
{
I2C_STAT = NEXT_BYTE;
B[Bptr] <<= 1;
if (SDA) B[Bptr]+=0x01;
if (BitCount == 8)
{
if ((B[0] & 0x0e) == adress)
{
if (B[0] & 0x80) I2C_CMD = READ;
else
{
I2C_CMD = WRITE;
}
SDA = 0;
// SDA_DIR = OUTPUT; temporary down
RA3 = 0;
}
else
{
I2C_STAT = IDLE;
}
}
}
}
break;
case NEXT_BYTE:
if (!SCL)
{
I2C_STAT = RECIVE;
}
break;
case ACK:
if (!SCL)
{
I2C_STAT = RECIVE;
BitCount = 0;
Bptr ++;
SDA_DIR = INPUT;
if (Bptr == 3)
I2C_STAT = WAIT_STOP;
}
break;
case WAIT_STOP:
if (SCL)
{
I2C_STAT = IDLE;
NEW_TASK = 1;
}
break;
}
}
void main(void)
{
unsigned char t,t1,q;
CMCON = 0xff;
T0CS = 0;
PSA = 0;//prescale for timer0
PS0 = 0;
PS1 = 0;
PS2 = 0;
//ADCON1 = 0x07;
adress = 0x00;
Bptr = 0;
TRISA=0xff;
TRISB3 = 0;
TURBO_DIR = 0;
RA3 = 1;
NEW_TASK = 0;
T2CON = 0;
TMR2ON = 1;
CCP1M3 = 1;
CCP1M2 = 1;
PR2 = PR2VAL;
RBPU = 0; //set pull ups
SCL_DIR = 1;
SDA_DIR = 1;
INTEDG = 0; //interrup on falling EDGE
INTE = 1; //enable interrupt on RB0
T0IF = 0;
T0IE = 1; //enable tmr0 int
GIE = 1;
cont_mode = EEREAD(CONT_ADR);
flash_mode = EEREAD(FLASH_ADR);
flash_time = EEREAD(TIME_ADR);
/*
CCPR1L = cont_mode >> 2;
if (cont_mode & 0x02) CCP1X = 1;
else
CCP1X = 0;
if (cont_mode & 0x01) CCP1Y = 1;
else
CCP1Y = 0;
*/
CCPR1L = 0;
CCP1X = 0;
CCP1Y = 0;
#ifdef SIMPLE_TEST
CCPR1L = 0xb;
CCP1X = 0;
CCP1Y = 0;
#endif
//RC3 = 0;
//TRISC3 = 0;
turboflag = 0;
//flash_time = 100;
while(1)
{
if (t0flag)
{
I2CLOOP();
t0flag = 0;
}
I2CLOOP();
if (NEW_TASK)
{
NEW_TASK = 0;
switch (B[0] & 0xf0)
{
case SET_CONT:
EESAVE(CONT_ADR,B[2]); //saves the value recived
cont_mode = B[2];
CCPR1L = B[2] >> 2;
if (B[2] & 0x02) CCP1X = 1;
else
CCP1X = 0;
if (B[2] & 0x01) CCP1Y = 1;
else
CCP1Y = 0;
break;
case SET_FLASH:
if (B[2] != 0)
{
EESAVE(FLASH_ADR,B[2]);
flash_mode = B[2];
}
else
{
EESAVE(FLASH_ADR,cont_mode);//store the value of the light if 0 else store value
flash_mode = cont_mode;
}
break;
case SET_TIME:
EESAVE(TIME_ADR,B[2]); // save time
flash_time = B[2];
break;
case OFF:
CCPR1L = 0;
CCP1X = 0;
CCP1Y = 0;
break;
case ON:
CCPR1L = cont_mode >> 2;
if (cont_mode & 0x02) CCP1X = 1;
else
CCP1X = 0;
if (cont_mode & 0x01) CCP1Y = 1;
else
CCP1Y = 0;
break;
case TURBO:
if (B[2] == 0)
turboflag = 0;
else
turboflag = 1;
default:
break;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -