/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.7e Professional
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project : usb
Version :
Date : 2006-9-17
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega128L
Program type : Application
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024*/
/************************************************************/
/************************************************************/
#include "isr.h"
#include "chap_9.h"
#include "protozlg.h"
#include <iom128.h>
#include <inavr.h>
#define uchar unsigned char
#define uint unsigned int
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define LED PORTF_D0
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
char rx_buffer1[RX_BUFFER_SIZE1];
#if RX_BUFFER_SIZE1<256
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
#else
unsigned int rx_wr_index1,rx_rd_index1,rx_counter1;
#endif
__flash uchar tab1[]={"你好!这里是上海南科电力遥测技术有限公司,欢迎!"};
const uchar tab2[]={"here is shanghai nanke electric remote sensing technology limited company!"};
// This flag is set on USART1 Receiver buffer overflow
uchar rx_buffer_overflow1;
extern EPPFLAGS bEPPflags;
extern uchar GenEpBuf[];
extern uchar EpBuf[];
extern uchar recieve_data_len;
uchar UartBuf[20];
unsigned int uart_len;
uchar flag;
/************************************************************/
/************************************************************/
char getchar1(void);
void putchar1(uchar);
void usbserve(void);
void Initmcu(void);
void uartserve(void);
/************************************************************/
/************************************************************/
void main(void)
{
Initmcu();
ENABLE;
reconnect_USB();
bEPPflags.value = 0;
while( TRUE )
{
usbserve();
uartserve();
}
}
/************************************************************/
/************************************************************/
// USART1 Receiver interrupt service routine
#pragma vector=USART1_RXC_vect
__interrupt void usart1_rx_isr(void)
{
char status,data,i;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer1[rx_wr_index1]=data;
if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
if (++rx_counter1 == RX_BUFFER_SIZE1)
{
rx_counter1=0;
rx_buffer_overflow1=1;
for (i=0;i<sizeof(tab1);i++)
{
putchar1(tab1[i]);
}
for (i=0;i<sizeof(tab2);i++)
{
putchar1(tab2[i]);
}
};
};
if(data==0xbb)
bEPPflags.bits.uart=1; //一祯数据结束标志0xbb
//uart_len=2000;//假设要发送2000个数据
flag=1;
uart_len=50000;
}
/************************************************************/
/************************************************************/
// External Interrupt 7 service routine
#pragma vector=INT7_vect
__interrupt void usb_isr(void)
{
DISABLE;
fn_usb_isr();
ENABLE;
}
/************************************************************/
/************************************************************/
void usbserve(void)
{
if (bEPPflags.bits.bus_reset)
{
DISABLE;
bEPPflags.bits.bus_reset = 0;
ENABLE;
}
if (bEPPflags.bits.suspend)
{
DISABLE;
bEPPflags.bits.suspend= 0;
ENABLE;
}
if (bEPPflags.bits.setup_packet)
{
DISABLE;
bEPPflags.bits.setup_packet = 0;
control_handler();
ENABLE;
}
if (bEPPflags.bits.ep1_rxdone)
{
uchar i;
DISABLE;
bEPPflags.bits.ep1_rxdone=0;
for (i=0;i<recieve_data_len;i++)
{
putchar1(GenEpBuf[i]);
}
//D12_WriteEndpoint(3, recieve_data_len, &GenEpBuf[0]);
ENABLE;
}
if (bEPPflags.bits.ep2_rxdone)
{
uchar i;
DISABLE;
bEPPflags.bits.ep2_rxdone=0;
for (i=0;i<recieve_data_len;i++)
{
putchar1(EpBuf[i]);
}
//D12_WriteEndpoint(5, recieve_data_len, &EpBuf[0]);
ENABLE;
}
}
/************************************************************/
/************************************************************/
void Initmcu(void)
{
// Crystal Oscillator division factor: 8
XDIV=0xF9;
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0xff;
DDRE=0x00;
// Port F initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTF=0xff;
DDRF=0xFF;
// Port G initialization
// Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State4=0 State3=0 State2=0 State1=0 State0=0
PORTG=0xff;
DDRG=0x1F;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: On
// INT7 Mode: Low level
EICRA=0x