📄 ze015_1.c.bak
字号:
//ICC-AVR application builder : 2007-4-11 16:34:42
// Target : M64
// Crystal: 4.0000Mhz
#include <iom64v.h>
#include <macros.h>
#include <math.h>
#include "jf_atmel.h"
#include "jf_valve.h"
#include "jf_p1.c"
#include "jf_act.c"
#include "jf_valve.c"
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x0F;//0x0b; //sck PA0-CD4052A,PA1-CD4052B
PORTB = 0x00;
DDRB = 0xF0;
PORTC = 0x00; //m103 output only
DDRC = 0x01;
PORTD = 0x00;
DDRD = 0xFB;
PORTE = 0x00;
DDRE = 0xC6;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x1B;
}
//Watchdog initialize
// prescale: 16K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR |= 0x18; //允许修改watchdog
//WDTCR = 0x0d; //WATCHDOG ENABLED - 101--0.45s
WDTCR = 0x0e; //WATCHDOG ENABLED - 110--1s
}
//20080612由10ms改为膨胀阀8ms定时
//TIMER0 initialize - prescale:256
// WGM: Normal
// desired value: 8mSec
// actual value: 8.000mSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x83; //4MHZ-8ms set count
OCR0 = 0x7D;
TCCR0 = 0x06; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0x83;//64; //reload counter value
time_flag |=b_time_10ms; //f_10ms=1
t_10ms_times++; //10ms时间计时
if (t_10ms_times>=12)
{
time_flag |=b_time_100ms; //f_100ms=1
t_10ms_times=0;
}
if (mode & b_fast_test)time_flag |=b_time_1s; //快测f_1s=1
else
{//正常时计数100时置1秒
t_1s_times++; //10ms的计时1秒
if (t_1s_times>=125)
{
time_flag |=b_time_1s; //f_1s=1
t_1s_times=0;
}
}
if (run_state &b_beep_onask) //01-beep_on
{ //蜂鸣器要求响时,时间进行计数,计数到则关T2的CTC
if (beep_time >=beep_time_ask)
{//蜂鸣器响时间到时停止TIMER2,如次数未到则启动间隔计时
PORTB &=~b_beep; //beep=0 PB5时间到则关蜂鸣器
TCCR2 = 0x00; //stop T2 CTC
run_state &=~b_beep_onask; //清除蜂鸣器响标志
if (beep_times >=1) //如果要求响的次数大于1
{
beep_times--; // 蜂鸣器响的次数-1
auto_state |=b_beep_stop; //开始蜂鸣器停止的间隔计时
beep_stop_time =0; //间隔计时清0
}
}
else beep_time++;//蜂鸣器响时间未到时接着响,蜂鸣器响时间+1
}
else if (auto_state &b_beep_stop)
{//蜂鸣器间隔计时,计时到时启动TIMER2为CTC
beep_stop_time ++; //间隔计时+1
if (beep_stop_time >=beep_stop_time_ask)
{//蜂鸣器间隔计时到时启动TIMER2
TCCR2 = 0x00; //stop
TCNT2 = 0x87; //0x86; // 2048 Khz 0x83; //2khz
OCR2 = 0x79; //0x7a; //0x7d;
TCCR2 = 0x1A; //start
beep_time=0; //蜂鸣器响时间=0
auto_state &=~b_beep_stop; //清间隔计时标志
run_state |=b_beep_onask; //蜂鸣器响标志
}
}
else
{//无蜂鸣器响或间隔要求时关T2,输出0
TCCR2 = 0x00; //stop T2 CTC
PORTB &=~b_beep; //beep=0 PB5时间到则关蜂鸣器
}
//uart0 与主模块板通讯,等待主模块,接收正确后延时40MS发送应答,发送完成后立即转接收
if (txd_state0 &rxd_txdstart0) //rxd_txdstart=1
{
txd_rxd_delaytime0++;
if (txd_rxd_delaytime0>=5) //接收完成转发送时延时40ms
{
PORTE |= b_con4850; //pe2为uart0-485控制端=1 txd
UCSR0B = 0x48; // uart0_txd_on允许发送完成中断及发送
txd_state0 &= ~rxd_txdstart0; //rxd_txdstart=0
txd_rxd_delaytime0=0;
txd_len0=0;
UDR0 =txd_data0[txd_len0];//每隔1秒写入第1个数据发送
txd_len0++;
}
}
m_32mscountv=m_32mscountv+1;
m_500mscount=m_500mscount+1;
}
//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value: 1.000Hz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x0B; //setup
TCNT1L = 0xDC;
OCR1AH = 0xF4;
OCR1AL = 0x24;
OCR1BH = 0xF4;
OCR1BL = 0x24;
OCR1CH = 0xF4;
OCR1CL = 0x24;
ICR1H = 0xF4;
ICR1L = 0x24;
TCCR1A = 0x00;
TCCR1B = 0x03; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{//20080201将定时1秒改在定时10MS中,增加快测
//TIMER1 has overflowed 1s 1秒定时
TCNT1H = 0x0b; //reload counter high value
TCNT1L = 0xdc; //reload counter low value
//20080201time_flag |=b_time_1s; //f_1s=1
}
//TIMER2 initialize - prescale:8 中断未用,但用作蜂鸣器驱动2KHZ
// WGM: CTC
// desired value: 4KHz
// actual value: 3.992KHz (0.4%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
TCNT2 = 0x87; //0x86; // 2048 Khz 0x83; //2khz
OCR2 = 0x79; //0x7a; //0x7d;
}
#pragma interrupt_handler timer2_ovf_isr:11
void timer2_ovf_isr(void)
{//no use but remain,定时器2用途CTC蜂鸣器驱动
TCNT2 = 0x06; //reload counter value
}
//TIMER3未用
//TIMER3 initialize - prescale:256
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 100mSec
// actual value: 100.000mSec (0.0%)
void timer3_init(void)
{
TCCR3B = 0x00; //stop
TCNT3H = 0x0B; //setup
TCNT3L = 0xDC;
OCR3AH = 0xF4;
OCR3AL = 0x24;
OCR3BH = 0xF4;
OCR3BL = 0x24;
OCR3CH = 0xF4;
OCR3CL = 0x24;
ICR3H = 0xF4;
ICR3L = 0x24;
TCCR3A = 0x00;
// TCCR3B = 0x03; //start Timer
TCCR3B = 0x00;
}
#pragma interrupt_handler timer3_ovf_isr:30
void timer3_ovf_isr(void)
{//no use
//TIMER3 has overflowed
TCNT3H = 0x0b; //reload counter high value
TCNT3L = 0xdc; //reload counter low value
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x19; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x90; // uart0_rxd_on允许接收完成中断及接收
PORTE &= ~b_con4850; //pe2为uart0 485控制端=0接收
}
#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
//串行口0用作与显示板按7E7E商用通讯格式,接收到显示板ID01及点名02后回复
unsigned char m,n;
m =UCSR0A;
n =UDR0;
if ((m &0x1C)==0) //UCSRA中是否有接收出错(帧错、校验错、溢出错)
{//接收正常
switch (rxd_state0)
{
case 0x00: //接收头码7EH
{
if (n==0x7E)
{rxd_state0=0x01;rxd_good0=0;}
else rxd_state0=0x00; //出错时重新开始接收
break;
}
case 0x01: //接收头码7EH
{
if (n==0x7E)
{rxd_state0=0x02;}
else rxd_state0=0x00; //出错时重新开始接收
break;
}
case 0x02: //接收地址address; //本机地址
{
if (n==0x40) //20080201 if (n==address)
{
rxd_state0=0x03;
rxd_checksum0=n; //异或校验码初始值
}
else
{if (n==0x7E) rxd_state0=0x02; //接收到7EH为头码1
else rxd_state0=0x00; //出错时重新开始接收
}
break;
}
case 0x03: //接收发送方T_addr==0xff,其它出错
{
T_addr =n; //发送方T_addr
if (n==0xff)
{
rxd_state0=0x04;
rxd_checksum0^=n; //异或校验
}
else
{if (n==0x7E) rxd_state0=0x01; //接收到7EH为头码1
else rxd_state0=0x00; //出错时重新开始接收
}
break;
}
case 0x04: //接收包号0x11
{
if (n==0x11)
{
rxd_state0=0x05;rxd_len0=0;
rxd_checksum0^=n; //异或校验
}
else
{if (n==0x7E) rxd_state0=0x01; //接收到7EH为头码1
else rxd_state0=0x00; //出错时重新开始接收
}
break;
}
case 0x05: //接收长度<=48
{
if (n<=0x30)
{
rxd_state0=0x06;rxd_len0_ask=n;rxd_data0[rxd_len0]=n;
rxd_len0++;rxd_checksum0^=n; //异或校验
}
else
{if (n==0x7E) rxd_state0=0x01; //接收到7EH为头码1
else rxd_state0=0x00; //出错时重新开始接收
}
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -