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

📄 boardini.c

📁 在AVR 平台下的控制代码,通过CAN控制
💻 C
字号:
#include "std.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>


#define CLOCK 4         // 4M CRY

//uart 发送一字节
int usart_putchar(char c)
{
    if(c=='\n')
        usart_putchar('\r');
    loop_until_bit_is_set(UCSRA,UDRE);
    UDR=c;
    return 0;
}
//uart 接收一字节
int usart_getchar(void)
{
    loop_until_bit_is_set(UCSRA,RXC);
    return UDR;
}


void timer0_init(void) //CTC模式输出1KHz方波
{
 TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
 //64分频,CTC模式,OC0不输出
 //TOP=4000000/(2*64*1000)-1=30.25  选30  1.008KHz(0.992mS)
 OCR0  = (Byte)((((Dword)CLOCK*1000000)) /(2*64*2000)-1);  //设定TOP值
}


void timer2_init(void) //CTC模式输出1KHz方波
{
 //TCCR2 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
 TCCR2 = 0x0c;//00001100//(1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
 //64分频,CTC模式,OC0不输出
 //TOP=4000000/(2*64*1000)-1=30.25  选30  1.008KHz(0.992mS)
 OCR2  = (Byte)((((Dword)CLOCK*1000000)) /(2*64*2000)-1);  //设定TOP值
}


void IoInit(void)
{
    Byte    ucSreg;
    Word    wI;
    ucSreg = SREG;
    cli();
    /* IO 端口配置 */
    /* I2C */
    HI2C_SCL_OUTMODE;
    HI2C_SDA_OUTMODE;
                                  
/* LCD port define */
    LCD_CS1_OUTMODE;
    
    LCD_CS2_OUTMODE;
    
    LCD_RS_OUTMODE;

    LCD_RST_OUTMODE;

    LCD_E_OUTMODE;

    LCD_RW_OUTMODE;

    LCD_DB7_OUTMODE;
    
    LCD_DB6_OUTMODE;

    LCD_DB5_OUTMODE;

    LCD_DB4_OUTMODE;

    LCD_DB3_OUTMODE;

    LCD_DB2_OUTMODE;

    LCD_DB1_OUTMODE;

    LCD_DB0_OUTMODE;
 
/* ROOM_T 温度传感器 */
    ROOM_T_INMODE;
 /* key board define */
    KEYBOARD_INMODE;

 /* TC35 define */
    TC_IGT_INMODE;
//    #define TC_IGT_OUTMODE                CLRBIT(TC_IGT_Dir_REG,TC_IGT_Bit)
 
    TC_CTS_INMODE;
//    #define TC_CTS_OUTMODE                CLRBIT(TC_CTS_Dir_REG,TC_CTS_Bit)
 
    TC_RTS_INMODE;
//    #define TC_RTS_OUTMODE                CLRBIT(TC_RTS_Dir_REG,TC_RTS_Bit)
 
    TC_RING_INMODE;
 
    TC_TXD_OUTMODE;
 
    TC_RXD_INMODE;
 
/* MUL-IN MUL-OUT define */
    MULTY_OUT_OUTMODE;
 
    MULTY_IN_INMODE;
 
/* UART define */
    PIN_TXD_OUTMODE;
 
    PIN_RXD_INMODE;
    
/* SFIOR
		00000000
		||||||||----------0 	PSR10  NO EFFECT
		|||||||-----------0 	PSR2   NO EFFECT
		||||||------------0 	DISABLE PULL UP
		|||||-------------0 	ACME
		||||--------------0  	RESERVED
		|-----------------000	ADTS
*/
		SFIOR = 0x00;		
    
    
    /* ADC setting */

/*  ADCSRA
    100X0111
    |||||-----------111 128 分频,确保 8M/16M晶体都可以产生 50k-200K时钟
    ||||------------0   ADC中断使能,关闭中断
    |||-------------X   中断标志
    ||--------------0   关闭自动触发功能
    |---------------0   开始转换
    ----------------1   ADC 使能
*/    
		ADCSRA = 0x87;




/*  ADMUX
		110xxxxx
		||||||||----------- 通道选择
		|||---------------- 0 右对齐 8bit in ADCL
		||----------------- 11 3.3V Avcc电压基准
*/ 
    ADMUX = 0x40;
    
		


    TIMSK = 0x00;      // disable all timer int
    /* 定时器0配置 */
    timer2_init();
#if 0    
    /* 定时器1配置 */
/*    
    00000000
    ||||||||
    |||||||------- 00
    |||||
    |||||--------- 00 
    |||
    | |------------00 COM B MORMAL IO
    |--------------00 COM A NORMAL IO
*/    
    TCCR1A = 0x00;


/*    
    00000000
    ||||||---------001 CLK no div
    ||||
    ||||
    ||||---------- 00 WGM 13 12 NORMAL IO 
    |||------------0  x
    ||-------------0 ICES1
    |--------------0 ICNC1
*/    
    TCCR1B = 0x01;
 

    TCNT1 = 0x3323;


/*  xx0000xx
      ||||------- 0
      |||-------- 0
      ||--------- 0
      |---------- 0 capture
*/      
    TIFR |= 0x00;


/*  xx0001xx 
      ||||-----1 enable timer int
      |--------000 disable capture mode int
*/      
    TIMSK &= 0xc3;
    TIMSK |= 0x04;

#endif
    /* 定时器2配置 */
/*    uart 初始化 00011000B
                  ||||||||----- 0 TX data 8 bit   
                  |||||||-------0 RX data 8 bit
                  ||||||--------0 DATA LEN
                  |||||---------1 TX EN
                  ||||----------1 RX EN
                  |||-----------0 No buffer empty interrupt
                  ||------------0 No TX interrupt
                  |-------------0 No Rx interrupt
*/                  
    UCSRB=_BV(RXEN)|_BV(TXEN);/*(1<<RXCIE)|(1<<TXCIE)|*/
    UBRRL=25; //9600 baud 6MHz:38 4MHz:25
    //流与设备连接
    fdevopen(usart_putchar,usart_getchar,0);
    TIFR = 0;
    TIMSK |= 0x80;//0x02; // TIMER0 MATCH INT ENABLED
    sei();
}






void BoardIni(void)
{
	/* Initial MCU and other chips */
	/* INITIALIZE SERIAL INTERFACE TO 2400 BAUD @12MHz */

    /* 初始化标准IO流操作 */
    IoInit();
#if 0    
    while(1)
    {
        vfprintf(stdout,"测试1[输入数字]:\n",0);
        printf("测试1[输入数字]:\n");
    }
#endif    
}



SIGNAL(SIG_INTERRUPT0) //输入捕捉中断
{
    g_Data.ucIntIndex = 0;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_INTERRUPT1) //输入捕捉中断 不知道为什么总是进入该中断,这是奇怪得事情
{
    g_Data.ucIntIndex = 1;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_OUTPUT_COMPARE2) //输入捕捉中断
{
    g_Data.ucIntIndex = 2;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_OVERFLOW2) //输入捕捉中断
{
    g_Data.ucIntIndex = 4;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_OVERFLOW0) //输入捕捉中断
{
    g_Data.ucIntIndex = 5;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_OUTPUT_COMPARE1B) //输入捕捉中断
{
    g_Data.ucIntIndex = 6;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_OVERFLOW1) //输入捕捉中断
{
    g_Data.ucIntIndex = 7;
   bTickGet = _TRUE_;
}
SIGNAL(SIG_SPI) //输入捕捉中断
{
    g_Data.ucIntIndex = 8;
   bTickGet = _TRUE_;
}

SIGNAL(SIG_OUTPUT_COMPARE0) //输入捕捉中断
{
    g_Data.ucIntIndex = 9;
   bTickGet = _TRUE_;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -