static unsigned char cnt=4; // cnt,cnt1はLED更新周期用カウンタ
static unsigned char cnt1=10;
static byte a,menu,x,y,RCVFLG,oldRA1,oldRA2,oldRA3,dsp_on,menu_selected;
static byte I2C_state,I2C_DA,I2C_MDATA,I2C_SDATA,I2C_RA,TMR0L1,TMR0H1;
static unsigned long freq,ADout;
static word cnt0,cnt01;
static byte Resp,rcv_count;
void UserInit(void)
{
TRISC = 0x81; // ProtC RC0:SW3 BLUE,RC1:BLUE LED/TXRX, RC2:YELLOW LED,RC3:VSUB
// RC$:D-,RC5:D+,RC6:TX,RC7:RX/SDO
PORTC|= 0x0D; // PortC
TRISA = 0x3E; // PORTA RA0:ANALOG CURRENT,RA1:ANALOG VOLT,
// RA2:SW1 YELLOW,RA3:SW2 GREEN, RA4:CLOCK IN,RA5:#SS
PORTA = 0x01; // PortA
TRISB = 0x00; // PORTB RB4-RB7:LCD DB4-DB7, RB2:LCD E,
// RB3:LCD RS 、RB0:SDA/SDI,RB1:SCL/SCK
PORTB|= 0xF3; // PortB
T0CON = 0xB7; // タイマ0の設定, 16ビットモード, 割込み使用
//外部クロック、1:256プリスケーラ
T1CON = 0xB1; //タイマ1の設定,16ビットモード、割込み使用
//内部クロック、1:8プリスケーラ
CCP1CON = 0;
//***** 優先順位割込み使用宣言
RCONbits.IPEN=1;
IPR1bits.TMR1IP=1;
//***** 低レベル使用周辺の定義
INTCON2bits.TMR0IP = 0;
//***** 割込み許可
INTCONbits.GIEH=1; // 高レベル許可
INTCONbits.GIEL=1; // 低レベル許可
INTCONbits.T0IE = 1; // タイマ0割込み許可
PIE1bits.TMR1IE = 1; // タイマ1割込み許可
UIE = 0x7F; // USB割込み許可
ADCON0= 0x01;
ADCON1 = 0x0D; // ADC設定 Vref+=VDD,Vref-=Vss,AN0,AN1
ADCON2 = 0x14; // ADRESH[7:0]:ADRESL[7:6],Fosc/32,8Tad
InitializeUSART(); // UART設定
COM_stage=1;
// InitializeI2C();
LEN=7;
PIE1bits.RCIE = 1;
oldRA3 = 1; oldRA2=1; oldRA1=1;
waitmsec(60);
PORTBbits.RB3 = 0; // RS=0
PORTB = 0x20; // set high niblle
PORTBbits.RB2 = 1; // E=1
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0; // E=0
LCDcontrol(0x28); // Set Font(5x7), Lines(2)
waitusec(39);
LCDcontrol(0x0F); // Set Display(ON), Cursor(ON),Blink(OFF)
waitusec(39);
LCDcontrol(1); // Display CLEAR
waitmsec(1);
waitusec(53);
LCDcontrol(0x06); // Set Moving(Increment),SHIFT(OFF)
waitusec(39);
RCVFLG = 0;
LCDlocate(0);
LCDstring(tt,8);
LCDlocate(0x40);
LCDstring(tt2,8);
waitmsec(255);
waitmsec(255);
LCDlocate(0x47);
menu=7; menu_selected=0; PORTAbits.RA0 = 0;
PORTCbits.RC1 = 0;
uart_rd_ptr=0;
uart_wr_ptr=0;
}//end UserInit
void Exercise_Example(void)
{
static byte start_up_state = 0;
if(start_up_state == 0)
{
start_up_state++;
}
else if(start_up_state == 1)
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART(ansi_clrscr);
start_up_state++;
}
}
else if(start_up_state == 2)
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART("\rMicrochip Technology Inc., 2007\r\n");
start_up_state++;
}
}
else if(start_up_state == 3)
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART(welcome);
message_state++;
if(message_state > 5) {
start_up_state ++;
// putrsUSBUSART(lastmessage);
}
else start_up_state = 0;
}
}
}//end Exercise_Example
void COMM_USB(void)
{
static byte devaddr, regaddr, i2cdata, i2cdata2 ;
byte N,i,j,k,ch,I2Cdata2,ASD_type,ASD_num, *mm0, *mm1,menu_change;
byte RSP,Resp,data;
// Push button Switch interpreter
menu_change=0;
if(PORTAbits.RA3==1){
if(oldRA3==0){
oldRA3=1;
if(menu_selected) {
menu_selected=0;
PORTAbits.RA0=0;
LCDlocate(0x40);
LCDmenu2();
} else {
menu_selected=menu+1;
PORTAbits.RA0=1;
}
} else {
oldRA3=1;
}
} else oldRA3=0;
if(PORTAbits.RA2==1){
if(oldRA2==0){
oldRA2=1;
menu_change=1;
menu--;
if(menu==0) menu=7;
} else {
oldRA2=1;
}
} else oldRA2=0;
if(PORTCbits.RC0==1){
if(oldRA1==0){
oldRA1=1;
menu_change=1;
menu++;
if(menu>7) menu=0;
} else {
oldRA1=1;
}
} else oldRA1=0;
LCDlocate(0);
if(menu_change){
switch(menu){
case 0 : LCDstring(mn1,8); break;
case 1 : LCDstring(mn2,8); break;
case 2 : LCDstring(mn3,8); break;
case 3 : LCDstring(mn4,8); break;
case 4 : LCDstring(mn5,8); break;
case 5 : LCDstring(mn6,8); break;
case 6 : LCDstring(mn7,8); break;
}
LCDlocate(0x40);
}
if(menu_change){
PORTAbits.RA0= 0;
LCDmenu2();
LCDlocate(0);
}
// menu=2;
// dsp_on=1;
// menu proccessor
if((menu_selected)&&(dsp_on)){
switch(menu){
case 0 : // Counter
dsp_on=0;
LCDlocate (0x40);
LCDstring(" ",8);
freq=(cnt01*0x10000+TMR0H1*0x100+TMR0L1)*256/100;
sprintf(va1,"%8ld",freq);
LCDlocate(0x46-strlen(va1));
LCDstring(va1,strlen(va1));
// LCDwrite(0x30);
// LCDwrite(0x4B);
break;
case 1 : // I2C
case 2 : // RS485
if(uart_rcv_complete==1){
if(rcv_count%2!=0) {
LCDlocate(0);
LCDstring(mn14,8);
LCDlocate(0);
} else {
LCDlocate(0x40);
LCDstring(mn14,8);
LCDlocate(0x40);
}
for(i=0; i<uart_buf_bytes; i++){
LCDwrite(UART_rd_buffer[i]+0x30);
}
rcv_count++;
LCDlocate(0x46);
LCDwrite(rcv_count+0x30);
LCDwrite(uart_buf_bytes+0x30);
uart_rcv_complete=0;
uart_buf_bytes=0;
uart_rd_ptr=0;
}
break;
case 3 : // SPI
case 4 : // UART
LCDlocate(0x40);
LCDstring(mn0,8);
break;
case 5 : // VDC
dsp_on=0;
ADCON0 = 0x07;
while((ADCON0&0x02) == 1); // ADC Complete?
ADout=(unsigned long) (ADRESH);
ADout=(ADout*5000/1024)*4+ADRESL/64;
sprintf(va1,"%6ld",ADout);
LCDlocate(0x40);
LCDstring(va1,strlen(va1));
LCDlocate(0x46);
LCDwrite(0x6D);
LCDwrite(0x56);
break;
case 6 : // ADC
dsp_on=0;
ADCON0 = 0x03;
while((ADCON0&0x02) == 1); // ADC Complete?
ADout=((ADRESH*4+ADRESL/64)*3300)/1024;
sprintf(va1,"%6ld",ADout);
LCDlocate(0x44-strlen(va1));
LCDstring(va1,strlen(va1));
LCDlocate(0x46);
LCDwrite(0x6D);
LCDwrite(0x41);
break;
}
}
// goto end_of_USB_process;
// USB command interpreter
if(getsUSBUSART(input_buffer,7))
{
CMND = input_buffer[0];
ID = input_buffer[1];
LEN = input_buffer[2];
for(i=0; i<LEN; i++){
msg[i] = input_buffer[i+3];
}
for (i=0; i<LEN+3; i++){
aa[i]=input_buffer[i];
}
// USB command processor
// Packet format
// aa[0] aa[1] aa[2] aa[3] aa[4] aa[2+LEN]
// | CMND | ID | LEN | PRM0 | PRM1 | ------- | PRMx |
// 0xC0 : RESET
// 0xC1 : PING
// 0xC2 : READ
// 0xC3 : WRITE
// RS485 Command state machine
// Send Command PC>MASTER>SLAVE : COM_stage=0
// Receive Reply SLAVE>MASTER>PC : COM_stage=1
//
//
switch(CMND){
case Reset_RS485 : // Reset command
// LCDcontrol(1); // LCD clear
// waitusec(53);
LCDlocate(0x0);
// LCDstring(mn9,8); // Print "RS485NET"
LCDlocate(0x40);
LCDstring(mn10,8); // Print "RST # "
data=0x30+ID;
LCDlocate(0x45);
LCDwrite(data); // Print ID
COM_stage=1;
uart_rcv_complete=0;
Send_RS485(Reset_RS485,0xFE,LEN);
Resp=0;
for (i=0; i<LEN; i++) {
SA[i]=aa[i+2];
// Send_RS485(Ping,SA[i],N,msg);
// if(!Rcv_RS485(Reset_RS485,ID,N,msg)) {
// aa[LEN+3]=0;
// Resp++;
// }
}
MA=myID;
nSA=LEN-1;
if(Resp==0) {
aa[0]=0x41; // ACK
} else {
aa[0]=0x4E; // NAK
}
// while(mUSBUSARTIsTxTrfReady()==0);
mUSBUSARTTxRam(aa,LEN+3);
break;
case Ping : // Ping command
LCDlocate(0x0);
LCDstring(mn10,8);
LCDlocate(0x40);
LCDstring(mn11,8);
data=0x30+ID;
LCDlocate(0x45);
LCDwrite(data);
COM_stage=1;
uart_rcv_complete=0;
Send_RS485(Ping,ID,LEN);
if(!Rcv_RS485()){
aa[0]=0x41; // ACK
} else {
aa[0]=0x4E; // NAK
}
// while(mUSBUSARTIsTxTrfReady()==0);
mUSBUSARTTxRam(aa,LEN+3);
break;
case Read : // Read command
LCDlocate(0x0);
// LCDstring(mn9,8);
LCDlocate(0x40);
LCDstring(mn12,8);
data=0x30+ID;
LCDlocate(0x46);
LCDwrite(data);
COM_stage=1;
uart_rcv_complete=0;
Send_RS485(Read,ID,N);
if(!Rcv_RS485()){
aa[0]=0x41; // ACK
} else {
aa[0]=0x4E; // NAK
}
// while(mUSBUSARTIsTxTrfReady()==0);
mUSBUSARTTxRam(aa,LEN+3);
break;
case Write : // Write command
LCDlocate(0x0);
// LCDstring(mn9,8);
LCDlocate(0x40);
LCDstring(mn13,8);
data=0x30+ID;
LCDlocate(0x45);
LCDwrite(data);
COM_stage=1;
uart_rcv_complete=0;
Send_RS485(Write,ID,LEN);
if(!Rcv_RS485()){
aa[0]=0x41; // ACK
for (i=0; i<msg[2]; i++) {
aa[3+i]=msg[i];
}
} else {
aa[0]=0x4E; // NAK
}
// while(mUSBUSARTIsTxTrfReady()==0);
mUSBUSARTTxRam(aa,LEN+3);
break;
}
} // End of USB command interpreter
//
// Packet format ( RS485 network MASTER <-> SLAVE )
// aa[0] aa[1] aa[2] aa[3] aa[4] aa[2+LEN]
// | ID | LEN | CMND | PRM0 | PRM1 | ------- | PRMx |
// 0x00 : RESET
// 0x01 : PING
// 0x02 : READ
// 0x03 : WRITE
// RS485 Command state machine
// Send Command PC>MASTER>SLAVE : COM_stage=0
// Receive Reply SLAVE>MASTER>PC : COM_stage=1
//
// RS485 Ack packet proccessor
if(uart_buf_bytes>0){
// LCDlocate(0);
// LCDwrite(LEN+0x30);
// LCDlocate(0x40+uart_rd_ptr-1);
// LCDwrite(uart_buf_bytes+0x30);
}
if(uart_rcv_complete){
Resp=Rcv_RS485();
LCDlocate(0x0);
// LCDstring(mn9,5); // Put "RS485" in 1st Line of LCD
// LCDlocate(0x7);
// LCDwrite(ID+0x30);
// for (i=0; i<LEN+1; i++){
// LCDwrite(UART_rd_buffer[i+4]+0x30);
// }
if((ID==0xFE)||(ID==myID)){
LCDlocate(0x5);
LCDwrite(CMND+0x30);
LCDwrite(ID+0x30);
switch(CMND){
case Reset_RS485:
LCDlocate(0x40);
LCDstring(mn10,8); // Print "RST # "
LCDlocate(0x45);
LCDwrite(myID+0x30);
if(ID==myID){
if(Resp==0) {
RSP=0x41; // ACK
} else {
RSP=0x4E; // NAK
}
Send_RS485(RSP,ID,LEN);
}
// while(mUSBUSARTIsTxTrfReady()==0);
// mUSBUSARTTxRam(aa,LEN+3);
break;
case Ping:
LCDlocate(0x40);
LCDstring(mn11,8); // Print "PNG # "
LCDlocate(0x45);
LCDwrite(myID+0x30);
if(ID==myID){
if(Resp==0) {
RSP=0x41; // ACK
} else {
RSP=0x4E; // NAK
}
Send_RS485(RSP,ID,LEN);
}
// while(mUSBUSARTIsTxTrfReady()==0);
// mUSBUSARTTxRam(aa,LEN+3);
break;
case Read:
LCDlocate(0x40);
LCDstring(mn12,8); // Print "Read #"
LCDlocate(0x46);
LCDwrite(myID+0x30);
if(ID==myID){
if(Resp==0) {
RSP=0x41; // ACK
} else {
RSP=0x4E; // NAK
}
Send_RS485(RSP,ID,LEN);
}
// while(mUSBUSARTIsTxTrfReady()==0);
// mUSBUSARTTxRam(aa,LEN+3);
break;
case Write:
LCDlocate(0x40);
LCDstring(mn13,8);
LCDlocate(0x45);
LCDwrite(myID+0x30);
if(ID==myID){
if(Resp==0) {
RSP=0x41; // ACK
} else {
RSP=0x4E; // NAK
}
Send_RS485(RSP,ID,LEN);
}
// while(mUSBUSARTIsTxTrfReady()==0);
// mUSBUSARTTxRam(aa,LEN+3);
break;
}
}
} // End of COM_stage switch
// UART TX serialization
if(TXSTAbits.TRMT==1){
if(n_uart_wrbuf==0) PORTCbits.RC1=0;
if(n_uart_wrbuf!=0){
LCDlocate(uart_wr_ptr);
// LCDwrite(n_uart_wrbuf+0x30);
TXREG=UART_wr_buffer[uart_wr_ptr];
LCDwrite(UART_wr_buffer[uart_wr_ptr]+0x30);
uart_wr_ptr++;
if(uart_wr_ptr>uart_ptr_max) uart_wr_ptr=0;
n_uart_wrbuf--;
if(n_uart_wrbuf==0) {
uart_wr_ptr=0;
}
}
}
end_of_USB_process:
i=0;
}//end of COMM_USB
void InitializeUSART(void)
{
char c;
// UART_TRISRx=1; // RX
// UART_TRISTx=0; // TX
TXSTA = 0x24; // TX enable BRGH=1
RCSTA = 0x90; // Single Character RX
SPBRG = 0x71;
SPBRGH = 0x02; // 0x0271 for 48MHz -> 19200 baud
SPBRG = 0xE1;
SPBRGH = 0x04; // 0x0271 for 48MHz -> 9600 baud
BAUDCON = 0x08; // BRG16 = 1
// c = RCREG; // read
}
void put_UART(byte data)
{
UART_wr_buffer[uart_wr_ptr]=data;
uart_wr_ptr++;
n_uart_wrbuf++;
}
void Send_RS485(byte CMND,byte ID,byte n)
{
byte i,data,chksum;
chksum=0;
PORTCbits.RC1=1; // Change LTC485 to TX mode
put_UART(0xFF);
put_UART(0xFF);
put_UART(CMND);
chksum+=CMND;
put_UART(ID);
chksum+=ID;
put_UART(n);
chksum+=n;
for (i=0; i<n; i++){
data=UART_rd_buffer[5+i];
put_UART(data);
chksum+=data;
}
put_UART(chksum&0xFF);
uart_wr_ptr=0;
}
int get_UART(void)
{
byte data;
if(uart_buf_bytes>0) {
data=UART_rd_buffer[uart_rd_ptr];
uart_rd_ptr++;
uart_buf_bytes--;
return data;
} else {
return -1;
}
}
int Rcv_RS485(void)
{
byte i,ret,data;
ret=0;
LCDlocate(0x40);
LCDstring(mn14,8); // Erase 2nd line in LCD
LCDlocate(0x40);
LCDwrite(uart_buf_bytes+0x30); // Put UART recieve count in LCD(0,1)
for(i=0; i<uart_buf_bytes; i++){
LCDwrite(UART_rd_buffer[i]+0x30);
}
uart_rd_ptr=0;
data=get_UART();
if(data!=0xFF) {
while(data!=0xFF){ data=get_UART(); }
}
data=get_UART();
if(data!=0xFF){
uart_rd_ptr=0;
uart_buf_bytes=0;
uart_rcv_complete=0;
return 1;
}
data=get_UART();
if((data>=0)&&(data<5 )) {
CMND=data;
} else {
uart_rd_ptr=0;
uart_buf_bytes=0;
uart_rcv_complete=0;
return 3;
}
ID=get_UART();
LEN=get_UART();
LCDlocate(0x6);
LCDwrite(LEN+0x30);
LCDwrite(ID+0x30);
for( i=0; i<LEN+4; i++){
// data=get_UART();
UART_wr_buffer[i]=UART_rd_buffer[i];
msg[i]=data;
}
uart_rd_ptr=0;
uart_buf_bytes=0;
uart_rcv_complete=0;
return 0;
}
void WR_EEPROM(byte addr, byte data)
{
EEADR = addr;
EEDATA = data;
EECON1bits.WREN = 1;
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1bits.WR = 1;
while (EECON1bits.WR);
}//end of WR_EEPROM
byte RD_EEPROM(byte address)
{
EEADR = address;
EECON2 = 0x55;
EECON2 = 0xAA;
return EEDATA;
}
void LCDmenu2(void){
switch(menu){
case 0 : LCDstring(mn2,8); break;
case 1 : LCDstring(mn3,8); break;
case 2 : LCDstring(mn4,8); break;
case 3 : LCDstring(mn5,8); break;
case 4 : LCDstring(mn6,8); break;
case 5 : LCDstring(mn7,8); break;
case 6 : LCDstring(mn1,8); break;
}
}
void LCDstring(char *ptr, byte n)
{
byte i,a;
PORTBbits.RB3 = 1;
for(i=0; i<n; i++){
if(*ptr==0){
LCDwrite(0x20);
} else {
LCDwrite(*ptr);
}
ptr++;
}
}
void LCDcontrol(byte data)
{
byte db;
PORTBbits.RB3 = 0;
db = data&0xF0;
PORTB = db; // set high niblle
PORTBbits.RB2 = 1;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
db = (data&0x0F)<<4;
PORTB = db; // Set low nibble
PORTBbits.RB2 = 1;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
}
void LCDwrite(byte data)
{
byte db;
PORTBbits.RB3 = 1;
db = data&0xF0;
PORTBbits.RB2 = 1;
PORTB = 0x0C|db; // set high niblle
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
db = (data&0x0F)<<4;
PORTBbits.RB2 = 1;
PORTB = 0x0C|db; // Set low nibble
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
waitusec(39);
}
void LCDlocate(byte data)
{
byte db;
PORTBbits.RB3 = 0;
db = data&0xF0;
PORTB = 0x80|db;
PORTBbits.RB2 = 1;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0;
db = (data&0x0F)<<4;
PORTB = db; // Set Moving(Increment),SHIFT(ON)
PORTBbits.RB2 = 1;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
_asm NOP _endasm;
PORTBbits.RB2 = 0;
waitusec(39);
}
void waitusec(byte wait)
{
int i,j;
/*
T1CON = 0x34 ; //1:8 prescale, Fosc/4(16MHz)
if(wait>16) wait= 16;
TMR1H = 16*wait;
TMR1L = 0;
T1CONbits.TMR1ON = 1; //Timer start
while(PIR1.TMR1IF);
*/
for (i=0; i<wait; i++)
for (j=0; j<6; j++);
}
void waitmsec(byte wait)
{
int i,j,k;
/*
T1CON = 0x34 ; //1:8 prescale, Fosc/4(16MHz)
if(wait>16) wait= 16;
TMR1H = 16*wait;
TMR1L = 0;
T1CONbits.TMR1ON = 1; //Timer start
while(PIR1.TMR1IF);
*/
for (i=0; i<wait; i++)
for (j=0; j<6; j++)
for (k=0; k<100; k++){};
}
byte hexH(byte data)
{
int a;
a=(data&0xF0)>>4;
if(a<10){
return 0x30+a;
} else {
return 0x37+a;
}
}
byte hexL(byte data)
{
int a;
a=data&0x0F;
if(a<10){
return 0x30+a;
} else {
return 0x37+a;
}
}
/*********************************************************
優先順位を使った複数割込み
高レベル:タイマ1 低レベル:タイマ0
機能
タイマ0 :外部クロックのカウント
タイマ1 :25msごとの割込み、100msごとのタイマ0値読み出し
********************************************************/
//****** 割込みの宣言 優先順位使用
#pragma interrupt isr save = PROD
#pragma interruptlow tmr0 save = WREG,BSR,STATUS,PROD
//***** 割込みベクタジャンプ命令セット
#pragma code isrcode = 0x8
void isr_direct(void)
{
_asm
goto isr
_endasm
}
#pragma code lowcode = 0x18
void low_direct(void)
{ _asm
goto tmr0
_endasm
}
//**** 高レベル 割込み処理関数
#pragma code
void isr(void) // 割り込み関数
{
INTCONbits.GIEH=0; // 高レベル禁止
INTCONbits.GIEL=0; // 低レベル禁止
INTCONbits.T0IE = 0; // Timer0割り込み禁止
PIE1bits.TMR1IE = 0; // Timer1割り込み禁止
if(PIR1bits.TMR1IF){ // タイマ1割り込み25ms=8x37500 @48MHz
PIR1bits.TMR1IF=0; // タイマ1割り込みフラグを0にする
TMR1H = 0x6D;
TMR1L = 0x84+24;
// TMR1H = 0x0B;
// TMR1L = 0xDC;
if(--cnt1==0){ // cnt1を-1して結果が0?
cnt1=4; // cnt1にLEDの更新周期を書き戻す
if(PORTCbits.RC2) // 100m秒@20MHz
PORTCbits.RC2=0; //LED YELLOWを1秒間隔で点滅
else
PORTCbits.RC2=1;
TMR0L1=TMR0L;
TMR0H1=TMR0H;
cnt01=cnt0;
TMR0H=0;
dsp_on =1;
cnt0=0;
TMR0L=0;
INTCONbits.GIEL=1; // 低レベル許可
}
} else if(PIR1bits.SSPIF){ //I2C割り込み?
// PORTAbits.RA0 = 1;
PIR1bits.SSPIF=0;
switch(I2C_state){
case 0:
if(SSPSTATbits.BF){
I2C_DA=SSPBUF;
I2C_state=1;
}
break;
case 1:
if(SSPSTATbits.BF){
I2C_RA=SSPBUF;
I2C_state=2;
}
break;
case 2:
if(SSPSTATbits.BF){
if(SSPSTATbits.R_W==1){
I2C_state=3;
} else {
I2C_MDATA=SSPBUF;
I2C_state=0;
}
}
break;
case 3:
if(!SSPSTATbits.BF){
SSPBUF=I2C_SDATA;
I2C_state=0;
}
break;
}
PIE1bits.SSPIE=1;
} else if(PIR1bits.RCIF){ //USART割り込み?
PIR1bits.RCIF=0;
RCVFLG=1;
a=RCREG;
// if(PORTCbits.RC1) { PORTCbits.RC1=0; } else { PORTCbits.RC1=1; }
if(uart_rcv_complete==0){
UART_rd_buffer[uart_rd_ptr]=a;
uart_rd_ptr++;
uart_buf_bytes++;
if(uart_buf_bytes==6) {
LEN=UART_rd_buffer[4];
}
if(uart_buf_bytes>=LEN+5 ) {
uart_rcv_complete=1;
uart_rd_ptr=0;
}
}
}
INTCONbits.GIEH=1; // 高レベル許可
INTCONbits.GIEL=1; // 低レベル許可
INTCONbits.T0IE = 1;
PIE1bits.TMR1IE = 1;
}
//***** 低レベル割込み処理関数
void tmr0(void) // 割り込み関数
{
if(INTCONbits.T0IF){ // タイマ0割り込み?
INTCONbits.T0IF=0; // タイマ0割り込みフラグを0にする
cnt0++;
if(--cnt==0){ // cntを-1して結果が0?
cnt=10; // cntにLEDの更新周期を書き戻す
}
}
}
/** EOF user.c ***************************************************************/