📄 1.c
字号:
/***************************************************************************************************
Description: Test jig for Joyong PCB
MCU: ATmega128-16AU
REV: 0.0
DAY: 2008.08.11
****************************************************************************************************/
#define F_CPU 11059200L //晶振11.0592MHZ
#define BAUD 19200 //波特率
#define KEY_FILTER 20 //按键消抖深度
#define TEMP25C 16 //25c 电压
#define TEMP91C 200 //91c 电压
#define R_WATER 50 //模拟电极间水电阻
#define M_16_01 2 //16#板测试程序第一版
#define M_19_01 1 //19#板测试程序第一版
#define M_29_01 0 //29#板测试程序第一版
/***************************************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <util/setbaud.h>
/***************************************************************************************************
ATmega128
PORTA:0X3b; PORTB:0X38; PORTC:0X35; PORTD:0X32;PORTE:0X23;PORTF:0X62;PORTG:0X65;
DDRA :0x3a; DDRB :0x37; DDRC :0x34; DDRD :0x31;DDRE :0x22;DDRF :0X61;DDRG :0x64;
PINA :0X39; PINB :0X36; PINC :0X33; PIND :0X30;PINE :0X21;PINF :0X20;PING :0x63;
can128
PORTA:0X22; PORTB:0X25; PORTC:0X28; PORTD:0X2B;PORTE:0X2E;PORTF:0X31;PORTG:0X34;
DDRA :0x21; DDRB :0x24; DDRC :0x27; DDRD :0x2A;DDRE :0x2D;DDRF :0X30;DDRG :0x33;
PINA :0X20; PINB :0X23; PINC :0X26; PIND :0X29;PINE :0X2C;PINF :0X2F;PING :0X32;
****************************************************************************************************/
typedef struct xxx
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}bit_field;
#define CTRL1 (*((volatile bit_field*)(0x3b))).bit0 //PORTA
#define CTRL2 (*((volatile bit_field*)(0x3b))).bit1 //PORTA
#define CTRL3 (*((volatile bit_field*)(0x3b))).bit2 //PORTA
#define CTRL4 (*((volatile bit_field*)(0x3b))).bit3 //PORTA
#define AD5 (*((volatile bit_field*)(0x3b))).bit4 //PORTA
#define AD5_R (*((volatile bit_field*)(0x39))).bit4 //PINA
#define AD6 (*((volatile bit_field*)(0x3b))).bit5 //PORTA
#define AD6_R (*((volatile bit_field*)(0x39))).bit5 //PINA
#define AD7 (*((volatile bit_field*)(0x3b))).bit6 //PORTA
#define AD7_R (*((volatile bit_field*)(0x39))).bit6 //PINA
#define AD8 (*((volatile bit_field*)(0x3b))).bit7 //PORTA
#define AD8_R (*((volatile bit_field*)(0x39))).bit7 //PINA
#define K1 (*((volatile bit_field*)(0x38))).bit0 //PORTB
#define K2 (*((volatile bit_field*)(0x38))).bit1 //PORTB
#define K3 (*((volatile bit_field*)(0x38))).bit2 //PORTB
#define K4 (*((volatile bit_field*)(0x38))).bit3 //PORTB
#define K6 (*((volatile bit_field*)(0x38))).bit4 //PORTB
#define DA1 (*((volatile bit_field*)(0x38))).bit5 //PORTB
#define DA1_R (*((volatile bit_field*)(0x36))).bit5 //PINB
#define DA2 (*((volatile bit_field*)(0x38))).bit6 //PORTB
#define DA2_R (*((volatile bit_field*)(0x36))).bit6 //PINB
#define DA3 (*((volatile bit_field*)(0x38))).bit7 //PORTB
#define DA3_R (*((volatile bit_field*)(0x36))).bit7 //PINB
#define VIN1 (*((volatile bit_field*)(0x33))).bit0 //PINC
#define VIN2 (*((volatile bit_field*)(0x33))).bit1 //PINC
#define VIN3 (*((volatile bit_field*)(0x33))).bit2 //PINC
#define VIN4 (*((volatile bit_field*)(0x33))).bit3 //PINC
#define VIN5 (*((volatile bit_field*)(0x33))).bit4 //PINC
#define VIN6 (*((volatile bit_field*)(0x33))).bit5 //PINC
#define VIN7 (*((volatile bit_field*)(0x33))).bit6 //PINC
#define VIN8 (*((volatile bit_field*)(0x33))).bit7 //PINC
#define CLK1 (*((volatile bit_field*)(0x32))).bit0 //PORTD
#define DATA1 (*((volatile bit_field*)(0x32))).bit1 //PORTD
#define CLK2 (*((volatile bit_field*)(0x32))).bit2 //PORTD
#define DATA2 (*((volatile bit_field*)(0X32))).bit3 //PORTD
#define CLK3 (*((volatile bit_field*)(0x32))).bit4 //PORTD
#define DATA3 (*((volatile bit_field*)(0x32))).bit5 //PORTD
#define CLK4 (*((volatile bit_field*)(0x32))).bit6 //PORTD
#define DATA4 (*((volatile bit_field*)(0x32))).bit7 //PORTD
#define RXD0 (*((volatile bit_field*)(0x21))).bit0 //PINE
#define TXD0 (*((volatile bit_field*)(0x23))).bit1 //PORTE
#define K5 (*((volatile bit_field*)(0x23))).bit2 //PORTE
#define DA4 (*((volatile bit_field*)(0x23))).bit3 //PORTE
#define DA4_R (*((volatile bit_field*)(0x21))).bit3 //PINE
#define DA5 (*((volatile bit_field*)(0x23))).bit4 //PORTE
#define DA5_R (*((volatile bit_field*)(0x21))).bit4 //PINE
#define DA6 (*((volatile bit_field*)(0x23))).bit5 //PORTE
#define DA6_R (*((volatile bit_field*)(0x21))).bit5 //PINE
#define K7 (*((volatile bit_field*)(0x23))).bit6 //PORTE
#define K8 (*((volatile bit_field*)(0x23))).bit7 //PORTE
#define AD1 (*((volatile bit_field*)(0x62))).bit0 //PORTF
#define AD1_R (*((volatile bit_field*)(0x20))).bit0 //PINF
#define AD2 (*((volatile bit_field*)(0x62))).bit1 //PORTF
#define AD2_R (*((volatile bit_field*)(0x20))).bit1 //PINF
#define AD3 (*((volatile bit_field*)(0x62))).bit2 //PORTF
#define AD3_R (*((volatile bit_field*)(0x20))).bit2 //PINF
#define AD4 (*((volatile bit_field*)(0x62))).bit3 //PORTF
#define AD4_R (*((volatile bit_field*)(0x20))).bit3 //PINF
#define S1 (*((volatile bit_field*)(0x65))).bit0 //PORTG
#define S2 (*((volatile bit_field*)(0x65))).bit1 //PORTG
#define BEEP (*((volatile bit_field*)(0x65))).bit2 //PORTG
#define S3 (*((volatile bit_field*)(0x65))).bit3 //PORTG
#define S4 (*((volatile bit_field*)(0x65))).bit4 //PORTG
/*************************************************************************************************************
Variable define
**************************************************************************************************************/
volatile unsigned char key_current, key_old, key_time, key_do, key_do_flag; /* key scan & filter */
volatile unsigned char timer_counter, second; /* timer */
volatile unsigned char red1, red2, green1, green2; /* LED显示码,低有效 */
volatile unsigned int time_1, time_2; /*测输入电压全桥整流后的周期,用于全功率半功率判断*/
volatile unsigned char error; /* 错误代码,0=无错 */
volatile unsigned char model; /* 目标板型号,0=29# */
volatile unsigned char beep_test; /* 测试目标板BEEP信号标志寄存器 */
volatile unsigned char flash_t; /* 上排灯闪烁提示标志寄存器 */
volatile unsigned char red1_back; /* red1 的备份 */
/*************************************************************************************************************
Function explain
**************************************************************************************************************/
void io_init(void);
void spi_init(void);
void twi_init(void);
void timer_init(void);
void uart_init(void);
void adc_init(void);
void led_init(void);
void ram_init(void);
unsigned char scan_key(void);
void led_display(void);
void clear_timer(void);
void set_model(void);
void i2c_delay(void);
/*************************************************************************************************************
Interrupt
**************************************************************************************************************/
SIGNAL(SIG_OVERFLOW0) //timer0溢出中断 23.7mS
{
unsigned char i;
timer_counter++;
if (1 == flash_t)
{
if (timer_counter > 12)
{
red1 = ~red1;
for(i=0;i<8;i++)
{
CLK1 = 0;
if ( (red1 & (1<<(7-i))) )
{
DATA1 = 1;
}
else
{
DATA1 = 0;
}
asm("NOP");
CLK1 = 1;
asm("NOP");
asm("NOP");
asm("NOP");
}
CLK1 = 0;
}
}
if (timer_counter > 42)
{
second++;
timer_counter = 0;
}
}
/*************************************************************************************************************/
SIGNAL(SIG_INTERRUPT5) //INT5中断,上升沿
{
beep_test =1;
EIFR = 255;
}
/*************************************************************************************************************
Main program
**************************************************************************************************************/
int main(void)
{
unsigned char temp, key_temp;
io_init();
led_init();
set_model();
if (M_29_01 == model)
{
TEST_RST_29:
EIMSK = 0;
EIFR = 255;
K8 = 0;
K7 = 0;
K3 = 0;
while (1)
{
/*数字信号: AD1_R = RG发热管,AD2_R = DJ电机,AD3_R = 半功率,DA1 = 低水位电极输入,DA2 = 防溢电极输入
继电器开关: K3 = 目标板过零信号开关,K7 = 目标板电源开关,K8 = 目标板地线开关
上升沿中断: INT5 = 蜂鸣器
DA输出: OCR1C = NTC温度输入 */
key_temp = 0;
while (0 == key_temp)
{
key_temp = scan_key();
}
if (0x01 == key_temp) //start test
{
EIMSK = 0;
EICRA = 0;
EICRB = 0x0C;
EIMSK = 0x20;
BEEP = 0;
OCR1C = TEMP25C; //温度25C
DA2 = 0; //防溢电极
DA1 = 0; //低水位电极
error = 0;
_delay_ms(200);
if (0 == AD6_R) //检测目标板VCC和GND有无短路
{
red2 &= ~(1<<7);
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 向目标板供电 */
led_init();
K8 = 1;
K7 = 1;
K3 = 1;
_delay_ms(30);
/* 嘟1下,目标板复位完成 */
clear_timer();
temp = 0;
while ((1 == AD1_R) && (0 == temp))
{
if (second > 2) //超时报错1:目标板MCU不工作/蜂鸣器不响
{
error = (1<<0);
temp = 1;
}
}
if (0 == error) //正常亮绿灯1
{
green1 &= ~(1<<0);
led_display();
}
else //亮红灯1,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 防溢电极碰地三次 */
beep_test = 0;
clear_timer();
temp = 0;
while ((beep_test == 0) && (0 == temp))
{
DA2 = 1;
_delay_ms(100);
DA2 = 0;
_delay_ms(100);
if (second > 5) //超时报错2:进不了快检状态
{
error = (1<<1);
temp = 1;
}
}
if (0 == error) //正常亮绿灯2
{
green1 &= ~(1<<1);
led_display();
}
else //亮红灯2,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 手动按下选择键,选择五谷豆浆,再按确定键,嘟1下,五谷指标灯亮 */
DA2 = 1;
clear_timer();
red1_back = red1;
flash_t = 1;
while (0 == second); //等待手动操作
clear_timer();
temp = 0;
beep_test = 0;
while ((0 == beep_test) && (0 == temp))
{
if (second > 20) //超时报错3:员工没选择功能
{
error = (1<<2);
temp = 1;
}
}
flash_t = 0;
red1 = red1_back;
if (0 == error) //正常亮绿灯3
{
green1 &= ~(1<<2);
led_display();
}
else //亮红灯3,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 全功率加热 */
clear_timer();
temp = 0;
while ( ((0 == AD1_R) || (0 == AD3_R)) && (0 == temp) )
{
if (second > 10) //超时报错4:不加热
{
error = (1<<3);
temp = 1;
}
}
if (0 == error) //正常亮绿灯4
{
green1 &= ~(1<<3);
led_display();
}
else //亮红灯4,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 温度到90c,停止加热,嘟两下 */
OCR1C = TEMP91C; //温度
clear_timer();
temp = 0;
beep_test = 0;
while ((0 == beep_test) && (0 == temp))
{
if (second > 5) //超时报错5:温度检测错误
{
error = (1<<4);
temp = 1;
}
}
while ((1 == AD1_R) && (0 == temp))
{
if (second > 5) //超时报错5:温度检测错误
{
error = (1<<4);
temp = 1;
}
}
if (0 == error) //正常亮绿灯5
{
green1 &= ~(1<<4);
led_display();
}
else //亮红灯5,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 1秒后预备打浆1次0.5秒 */
clear_timer();
temp = 0;
while ((0 == AD2_R) && (0 == temp))
{
if (second > 5) //超时报错6:不打浆
{
error = (1<<5);
temp = 1;
}
}
if (0 == error) //正常亮绿灯6
{
green1 &= ~(1<<5);
led_display();
}
else //亮红灯6,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 温度到90c后再加热3秒 */
/* 打浆2次4秒,中间间隔1.5秒全功率加热 */
clear_timer();
while (second < 12);
/* 全功率加热碰防溢电极 */
DA2 = 0;
/* 停止加热4秒 */
clear_timer();
temp = 0;
while ( ( (1 == AD1_R) || (1 == AD2_R) ) && (0 == temp) )
{
if (second > 10) //超时报错7:无法停止加热
{
error = (1<<6);
temp = 1;
}
}
if (0 == error) //正常亮绿灯7
{
green1 &= ~(1<<6);
led_display();
}
else //亮红灯7,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 半功率搅浆启动0.5秒 */
clear_timer();
temp = 0;
while (( (0 == AD2_R) || (1 == AD3_R) ) && (0 == temp))
{
if (second > 10) //超时报错8:不搅浆
{
error = (1<<7);
temp = 1;
}
}
if (0 == error) //正常亮绿灯8
{
green1 &= ~(1<<7);
led_display();
}
else //亮红灯8,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
goto TEST_RST_29;
}
/* 打浆3次5秒,中间间隔1.5秒半功率加热 */
/* 半功率加热再次碰防溢电极 */
/* 半功率熬煮20秒 */
/* 声光报警 */
/* 自动测试通过 */
red1 = 0xFF;
red2 = 0xFF;
green1 = 0x00;
green2 = 0x00;
led_display();
K8 = 0; //目标板断电
K7 = 0;
K3 = 0;
OCR1C = TEMP25C; //温度25C
DA2 = 0; //防溢电极
DA1 = 0; //低水位电极
EIMSK = 0;
EIFR = 255;
}
else if (0x02 == key_temp) //beep off
{
BEEP = 0;
}
else
{
led_display();
}
}
}
else if (M_19_01 == model)
{
TEST_RST_19:
EIMSK = 0;
EIFR = 255;
K4 = 0;
K5 = 0;
K8 = 0;
PORTF &= 0xF0;
DDRF = 0x0F; //AD1-AD4改为输出
while (1)
{
/*高压部份: VIN1 = DJ电机,VIN2 = RG发热管
K4 & K5 = 目标板高压开关,K8 = 目标板低压开关
数字信号: AD1 = RG发热管,AD2 = DJ电机,AD3 = 半功率,AD4 = 蜂鸣器,AD5_R = +5VIN */
key_temp = 0;
while (0 == key_temp)
{
key_temp = scan_key();
}
if (0x01 == key_temp) //start test
{
unsigned char i;
BEEP = 0;
error = 0;
led_init();
_delay_ms(100);
/* 向目标板供电 */
K4 = 1;
K5 = 1;
K8 = 1; //向目标板供电
for(i=0;i<5;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -