📄 main.c
字号:
/************************************************************
Copyright (C) 1995-2002 Pumpkin, Inc. and its
Licensor(s). Freely distributable.
$Source: C:\\RCS\\d\\salvo\\tut\\tu5\\main.c,v $
$Author: aek $
$Revision: 3.7 $
$Date: 2003-06-13 17:05:12-07 $
Source for tutorial programs.
************************************************************/
#include "main.h"
#include "salvo.h"
#include "app.h"
#pragma interrupt_handler UART_RX_interrupt:iv_USART_RX
#pragma interrupt_handler SPI_isr: 13
#define TASK_A_P OSTCBP(1) /* task #1 */
#define TASK_B_P OSTCBP(2) /* "" #2 */
#define TASK_C_P OSTCBP(3) /* "" #3 */
#define PRIO_A 10 /* task priorities*/
#define PRIO_B 10 /* "" */
#define PRIO_C 2 /* "" */
#define BINSEM_UPDATE_PORT_P OSECBP(1) /* binSem #1 */
_OSLabel(TaskA1)
_OSLabel(TaskB1)
_OSLabel(TaskC1)
void TaskA( void )
{
Uchar i;
Uart_init();
while(1)
{
if(SPI_validFrame)
{
SPI_validFrame=FALSE;
for(i=0;i<SPI_DatLen+3;i++)
SPI_TranFifo[i]=SPI_RecvFifo[i];
SPI_SendPacket(SPI_DatLen+3,SPI_TranFifo);
//Uart_SendPacket(SPI_DatLen+3,SPI_RecvFifo);
}
OS_Yield(TaskA1);
//OS_Delay(30, TaskA1);
}
}
void TaskB( void )
{
while(1)
{
//OS_WaitBinSem(BINSEM_UPDATE_PORT_P, OSNO_TIMEOUT, TaskShow1);
OS_Yield(TaskB1);
//OS_Delay(10, TaskB1);
}
}
void TaskC( void )
{
ADC_init();
for (;;) {
PORTD ^= 0x40;
OS_Delay(90, TaskC1);
}
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x00;
DDRB = 0x01;
PORTC = 0x00; //m103 output only
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0xff;
}
void Uart_init(void)
{
UCSRC = BIT(URSEL) | 0x06;
UBRRH = 0x00;
UBRRL = 0x33;
UCSRB = ( (1<<RXCIE) |(1<<RXEN) | (1<<TXEN) );
}
void main( void )
{
CLI();
port_init();
SPI_SlaveInit();
SEI();
Init();
OSInit();
OSCreateTask(TaskA, TASK_A_P, PRIO_A);
OSCreateTask(TaskB, TASK_B_P, PRIO_B);
OSCreateTask(TaskC, TASK_C_P, PRIO_C);
OSCreateBinSem(BINSEM_UPDATE_PORT_P, 0);
OSEi();
for (;;)
OSSched();
}
void SPI_MasterInit(void)
{
DDRB=0xB0;
PORTB|=(1<<4);
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_SlaveInit(void)
{
DDRB=0x20;
SPCR=(1<<SPIE)|(1<<SPE)|(1<<SPR0);
}
void SPI_MasterTransmit(void)
{
PORTB&=~(1<<4);
SPDR=(*Pout_SPI_TranFIfo);
while(!(SPSR&(1<<SPIF)));
PORTB|=(1<<4);
}
/*Uchar SPI_SlaveReveive(void)
{
while(!(SPSR&(1<<SPIF)));
return SPDR;
}*/
void SPI_SendPacket(Uchar len, Uchar * Pbuffer)
{
SPI_MasterInit();
Pout_SPI_TranFIfo=Pbuffer;
while(len>0)
{
SPI_MasterTransmit();
len--;
Pout_SPI_TranFIfo++;
}
SPI_SlaveInit();
}
void SPI_isr(void)
{
PORTD=0x80;
if(SPI_validFrame)
{return;}
if(SPI_Status==0x00)
{
SPI_data=SPDR;
if(SPI_data!=0x68)
{
SPI_Status=0x00;
}
else
{
SPI_RecvFifo[0]=0x68;
SPI_Status=0x01;
}
}
else if(SPI_Status==0x01)
{
SPI_DatLen=SPDR;
SPI_RecvFifo[1]=SPI_DatLen;
SPI_Status=0x02;
}
else if(SPI_Status==0x02)
{
SPI_RecvFifo[SPI_DatConter+2]=SPDR;
SPI_DatConter++;
if(SPI_DatConter==SPI_DatLen)
{
SPI_Status=0x03;
SPI_DatConter=0;
}
}
else if(SPI_Status==0x03)
{
SPI_DatEnd=SPDR;
if(SPI_DatEnd!=0x16)
{
SPI_validFrame=FALSE;
}
else
{
SPI_RecvFifo[SPI_DatLen+2]=SPI_DatEnd;
SPI_validFrame=TRUE;
SPI_Status=0x00;
}
}
}
void UART_RX_interrupt(void)
{
if(RS485_validFrame)
{return;}
if(RS485_status==0x00)
{
RS485_data=UDR;
if(RS485_data!=0x68)
{
RS485_status=0x00;
}
else
{
RS485_status=0x01;
}
}
else if(RS485_status==0x01)
{
robotDatLen=UDR;
RS485_status=0x02;
}
else if(RS485_status==0x02)
{
robotDatBuf[robotDatCount]=UDR;
robotDatCount++;
if(robotDatCount==robotDatLen)
{
RS485_status=0x03;
robotDatCount=0;
}
}
else if(RS485_status==0x03)
{
robotDatEnd=UDR;
if(robotDatEnd!=0x16)
{
RS485_validFrame=FALSE;
PORTC|=0x02;
}
else
{
RS485_validFrame=TRUE;
RS485_status=0x00;
PORTC=0x01;
}
}
}
void Uart_SendByte(void)
{
while(!(UCSRA&(1<<UDRE)));
UDR=(*Uart_send_ptr);
}
void Uart_SendPacket(Uchar len, Uchar *BufferAddress)
{
Uart_send_ptr=BufferAddress;
while(len>0)
{
Uart_SendByte();
len--;
Uart_send_ptr++;
}
}
void ADC_init(void)
{
ADCSRA=0x00;
ADMUX=0x40;
ACSR|=(1<<ACD);
ADCSRA=(1<<ADEN)|0x06;//不使能中断
SFIOR=0x00;
PORTA=0x00;
}
void Read_Adc(void)
{
unsigned char i;
unsigned char Lsbtemp[10],Msbtemp[10];
Lsb_light=0;
Msb_light=0;
for(i=0;i<1;i++)
{
ADCSRA|=(1<<ADSC);
while((ADCSRA&(1<<ADIF))==0);
Lsbtemp[i]=ADCL;
Msbtemp[i]=ADCH;
}
for(i=0;i<1;i++)
{
Lsb_light+=Lsbtemp[i];
Msb_light+=Msbtemp[i];
}
Lsb_light=Lsb_light/1;
Msb_light=Msb_light/1;
voltage_light=Msb_light;
voltage_light=(unsigned int)voltage_light<<8|Lsb_light;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -