⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是AVR单片机上能跑的嵌入式操作系统salvo
💻 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 + -