/************************************************* * Copyright (C) 1999-2004 by ZiLOG, Inc. * All Rights Reserved *************************************************/ #include #include #include // non-standard I/O #include "main.h" #include "uart.h" char rx[7]=0; char *rxptr; char rxmax=0; char rxready=0; ////////////////////////////////////////////////////////// //Interrupt routine // // Transmission format: stx + motor + command + parameter+ chksum // stx = 0x02 // cksum = 7 bit checksum, bit 7 always high // motor= 2 bytes // command = 1 byte // parameter = 2 bytes // total : 7 bytes #pragma interrupt void isr_uart0_rx(void) { char header; char rxcom; char unsigned chksum; // service Rx when system is ready if(rxready==0) { rxcom=getchar(); // read sio if(rxcom==2) // Stx? (02) { rxptr=rx; //Start of transmission rxmax=0; //reset Rx buffer pointer } else { rxmax++; *rxptr=rxcom; // store rx character rxptr++; if(rxmax==6) // 7 charcters read? { chksum=2+rx[0]+rx[1]+rx[2]+rx[3]+rx[4]; chksum=chksum | 0x80; if(chksum==rx[5]) rxready=1; // indicate buffer is ready else rxready=2; //checksum error rxptr=rx; // reset pointers rxmax=0; } } } } ////////////////////////////////////////////////////////// //Intialize UART 0 void init_uart0(void) { init_uart(_UART0,_DEFFREQ,BAUD_115200); // Setup Uart0 select_port(_UART0); // Select port SET_VECTOR(UART0_RX, isr_uart0_rx); // Define interrupt routine IRQ0ENH |= 0x10; // Set Interrupt Priority High IRQ0ENL |= 0x10; // Set Interrupt Priority High }