📄 easyweb.c
字号:
if (HTTPBytesToSend > MAX_TCP_TX_DATA_SIZE) // transmit a segment of MAX_SIZE
{
if (!(HTTPStatus & HTTP_SEND_PAGE)) // 1st time, include HTTP-header
{
memcpy(TCP_TX_BUF, GetResponse, sizeof(GetResponse) - 1);
memcpy(TCP_TX_BUF + sizeof(GetResponse) - 1, PWebSide, MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1);
HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1;
PWebSide += MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1;
}
else
{
memcpy(TCP_TX_BUF, PWebSide, MAX_TCP_TX_DATA_SIZE);
HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE;
PWebSide += MAX_TCP_TX_DATA_SIZE;
}
TCPTxDataCount = MAX_TCP_TX_DATA_SIZE; // bytes to xfer
InsertDynamicValues(); // exchange some strings...
TCPTransmitTxBuffer(); // xfer buffer
}
else if (HTTPBytesToSend) // transmit leftover bytes
{
memcpy(TCP_TX_BUF, PWebSide, HTTPBytesToSend);
TCPTxDataCount = HTTPBytesToSend; // bytes to xfer
InsertDynamicValues(); // exchange some strings...
TCPTransmitTxBuffer(); // send last segment
TCPClose(); // and close connection
HTTPBytesToSend = 0; // all data sent
}
HTTPStatus |= HTTP_SEND_PAGE; // ok, 1st loop executed
}
}
else
HTTPStatus &= ~HTTP_SEND_PAGE; // reset help-flag if not connected
}
// samples and returns the AD-converter value of channel 7
// (associated with Port P6.7)
unsigned int GetAD7Val(void)
{
ADC12CTL0 = ADC12ON | SHT0_15 | REF2_5V | REFON; // ADC on, int. ref. on (2,5 V),
// single channel single conversion
ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_7 | CSTARTADD_0 | SHP;// MCLK / 8 = 1 MHz
ADC12MCTL0 = SREF_1 | INCH_7; // int. ref., channel 7
ADC12CTL0 |= ENC; // enable conversion
ADC12CTL0 |= ADC12SC; // sample & convert
while (ADC12CTL0 & ADC12SC); // wait until conversion is complete
ADC12CTL0 &= ~ENC; // disable conversion
return ADC12MEM0 / 41; // scale 12 bit value to 0..100%
}
// samples and returns AD-converter value of channel 10
// (MSP430's internal temperature reference diode)
// NOTE: to get a more exact value, 8-times oversampling is used
unsigned int GetTempVal(void)
{
unsigned long ReturnValue;
ADC12CTL0 = ADC12ON | SHT0_15 | MSH | REFON; // ADC on, int. ref. on (1,5 V),
// multiple sample & conversion
ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_7 | CSTARTADD_0 | CONSEQ_1 | SHP; // MCLK / 8 = 1 MHz
ADC12MCTL0 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL1 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL2 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL3 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL4 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL5 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL6 = SREF_1 | INCH_10; // int. ref., channel 10
ADC12MCTL7 = EOS | SREF_1 | INCH_10; // int. ref., channel 10, last seg.
ADC12CTL0 |= ENC; // enable conversion
ADC12CTL0 |= ADC12SC; // sample & convert
while (ADC12CTL0 & ADC12SC); // wait until conversion is complete
ADC12CTL0 &= ~ENC; // disable conversion
ReturnValue = ADC12MEM0; // sum up values...
ReturnValue += ADC12MEM1;
ReturnValue += ADC12MEM2;
ReturnValue += ADC12MEM3;
ReturnValue += ADC12MEM4;
ReturnValue += ADC12MEM5;
ReturnValue += ADC12MEM6;
ReturnValue += ADC12MEM7;
ReturnValue >>= 3; // ... and divide by 8
if (ReturnValue < 2886) ReturnValue = 2886; // lower bound (0% = 20癈)
ReturnValue = (ReturnValue - 2886) / 2.43; // convert AD-value to a temperature from
// 20癈...45癈 represented by a value
// of 0...100%
if (ReturnValue > 100) ReturnValue = 100; // upper bound (100% = 45癈)
return ReturnValue;
}
// searches the TX-buffer for special strings and replaces them
// with dynamic values (AD-converter results)
void InsertDynamicValues(void)
{
unsigned char *Key;
unsigned char NewKey[5];
unsigned int i;
if (TCPTxDataCount < 4) return; // there can't be any special string
Key = TCP_TX_BUF;
for (i = 0; i < (TCPTxDataCount - 3); i++)
{
if (*Key == 'A')
if (*(Key + 1) == 'D')
if (*(Key + 3) == '%')
switch (*(Key + 2))
{
case '7' : // "AD7%"?
{
sprintf(NewKey, "%3u", GetAD7Val()); // insert AD converter value
memcpy(Key, NewKey, 3); // channel 7 (P6.7)
break;
}
case 'A' : // "ADA%"?
{
sprintf(NewKey, "%3u", GetTempVal()); // insert AD converter value
memcpy(Key, NewKey, 3); // channel 10 (temp.-diode)
break;
}
}
Key++;
}
}
// enables the 8MHz crystal on XT1 and use
// it as MCLK
void InitOsc(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
BCSCTL1 |= XTS; // XT1 as high-frequency
_BIC_SR(OSCOFF); // turn on XT1 oscillator
do // wait in loop until crystal is stable
IFG1 &= ~OFIFG;
while (IFG1 & OFIFG);
BCSCTL1 |= DIVA0; // ACLK = XT1 / 2
BCSCTL1 &= ~DIVA1;
IE1 &= ~WDTIE; // disable WDT int.
IFG1 &= ~WDTIFG; // clear WDT int. flag
WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTSSEL | WDTIS1; // use WDT as timer, flag each
// 512 pulses from ACLK
while (!(IFG1 & WDTIFG)); // count 1024 pulses from XT1 (until XT1's
// amplitude is OK)
IFG1 &= ~OFIFG; // clear osc. fault int. flag
BCSCTL2 |= SELM0 | SELM1; // set XT1 as MCLK
}
void InitPorts(void)
{
P1SEL = 0; //
P1OUT = 0; //
P1DIR = BIT5 | BIT6; //enable only Relay outputs
P2SEL = 0;
P2OUT = 0;
P2DIR = ~BIT0; //only P2.0 is input
P3SEL |= BIT4 | BIT5; //enable UART0
P3DIR |= BIT4; //enable TXD0 as output
P3DIR &= ~BIT5; //enable RXD0 as input
P4SEL = 0;
P4OUT = 0;
P4DIR = BIT2 | BIT3; //only buzzer pins are outputs
P6SEL = 0x80;
P6OUT = 0;
P6DIR = 0x00; // all output
}
void Delay (unsigned int a)
{
for (k=0 ; k != a; ++k); //9+a*12 cycles
}
void Delayx100us(unsigned char b)
{
for (j=0; j!=b; ++j) Delay (_100us);
}
void UART_transmit (unsigned char Transmit_Data) //UART0 Transmit Subroutine
{
while ((IFG1 & UTXIFG0) == 0); //Wait for ready U0TXBUF
U0TXBUF = Transmit_Data; //send data
}
void InitUART0 (void) //UART0 init
{
BCSCTL1 &= ~DIVA0; // ACLK = XT1 / 4 = MCLK / 4
BCSCTL1 |= DIVA1;
UCTL0 = CHAR; //Sart bit, 8 data bits, no parity, 1 stop
UTCTL0 = SSEL0; //ACLK is UART clock
U0BR0 = 0xd0; //2000000:9600=208
U0BR1 = 0x00;
UMCTL0 = 0x00; //no modulation
ME1 |= UTXE0 | URXE0; //enable UART modul
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= BIT4; //enable TXD0 as output
P3DIR &= ~BIT5; //enable RXD0 as input
IE1 |= URXIE0; // Enable USART0 RX interrupt
_EINT(); //enable interrupt
}
void _E(void)
{
bitset(P2OUT,E); //toggle E for LCD
Delay(_10us);
bitclr(P2OUT,E);
}
void SEND_CHAR (unsigned char d)
{
Delayx100us(5); //.5ms
temp = d & 0xf0; //get upper nibble
LCD_Data &= 0x0f;
LCD_Data |= temp;
bitset(P2OUT,RS); //set LCD to data mode
_E(); //toggle E for LCD
temp = d & 0x0f;
temp = temp << 4; //get down nibble
LCD_Data &= 0x0f;
LCD_Data |= temp;
bitset(P2OUT,RS); //set LCD to data mode
_E(); //toggle E for LCD
}
void SEND_CMD (unsigned char e)
{
Delayx100us(10); //10ms
temp = e & 0xf0; //get upper nibble
LCD_Data &= 0x0f;
LCD_Data |= temp; //send CMD to LCD
bitclr(P2OUT,RS); //set LCD to CMD mode
_E(); //toggle E for LCD
temp = e & 0x0f;
temp = temp << 4; //get down nibble
LCD_Data &= 0x0f;
LCD_Data |= temp;
bitclr(P2OUT,RS); //set LCD to CMD mode
_E(); //toggle E for LCD
}
void InitLCD(void)
{
bitclr(P2OUT,RS);
Delayx100us(250); //Delay 100ms
Delayx100us(250);
Delayx100us(250);
Delayx100us(250);
LCD_Data |= BIT4 | BIT5; //D7-D4 = 0011
LCD_Data &= ~BIT6 & ~BIT7;
_E(); //toggle E for LCD
Delayx100us(100); //10ms
_E(); //toggle E for LCD
Delayx100us(100); //10ms
_E(); //toggle E for LCD
Delayx100us(100); //10ms
LCD_Data &= ~BIT4;
_E(); //toggle E for LCD
SEND_CMD(DISP_ON);
SEND_CMD(CLR_DISP);
}
void stopP6 (void)
{
P6DIR = 0;
cntr=0;
SEND_CMD(CLR_DISP);
SEND_CMD(DD_RAM_ADDR);
for (i=0 ; i!= 16; i++) SEND_CHAR(P6_error_Message[i]);
while(1);
}
void stop_ext (void)
{
P2DIR &= ~BIT0;
P4DIR = 0;
cntr=0;
SEND_CMD(CLR_DISP);
SEND_CMD(DD_RAM_ADDR);
for (i=0 ; i!= 16; i++) SEND_CHAR(EXT_error_Message[i]);
while(1);
}
///*
interrupt[UART0RX_VECTOR] void usart0_rx (void)
{
RXData = RXBUF0;
UART_transmit (RXData+1); //transmit Echo + 1
RX_flag = 1; //set RX_flag
}
//*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -