马老师,你好,看了你书第10章的AD例子,总觉得还是不够用?
马老师,你好,看了你书第10章的AD例子,总觉得还是不够用?你能否在专栏里贴些CVAVR编的AD例子,供我们学习?谢谢,马老师。 下面是我做的一个测量3相交流电系统的部分代码,里面使用了3路AD,供参考吧./*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
?Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Chip type : ATmega8
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size: 0
Data Stack size : 256
*****************************************************/
#include "global.h"
__u8 ad_state;
__u8 time_count;
__u8 stand_by_time;
__u8 add_i,av;
__u16 av_sum;
__u8 work_state = standby_state;
__u8time_hl_volt,time_lf,time_mf,time_ble;
struct v_st{
__u16 high_volt,low_volt;
};
union vs1{
struct v_st v;
__u16 volt;
};
eeprom __u16 e_volt;
struct sf_st{
__u8 f12,f13,f21,f22,f23,f24;
};
union vs2{
struct sf_st s;
__u8 sf;
};
eeprom __u8 e_sf;
union vs1 volt_value;
union vs2 sf_value;
flash __u16 volt_lim_up = {high_volt_high,low_volt_high};
flash __u16 volt_lim_down = {high_volt_low,low_volt_low};
flash __u8 sf_value_up = {high_volt_diff,high_volt_up_down,200,200,200,60};
flash __u8 sf_value_down = {low_volt_diff,low_volt_up_down,1,1,1,3};
union lcd_union {
struct lcd_structure lcd_s;
__u8 lcd_data;
} lcd_u;
bit time_10ms_ok,blik_on,blik_on_1,set_on,yes_on;
bit j_out_ok;
__u8 com_sub_state;
__u8 p_date;
__u32 sum_time,work_time,work_num,err_time,err_num;
eeprom __u32 e_sum_time,e_work_time,e_work_num,e_err_time,e_err_num;
eeprom __u8 e_date;
eeprom __u8 e_flag;
#define av_c 1744 // 196 * 2.224 / 25
#define ADC_VREF_TYPE 0x60
// Timer 2 output compare interrupt service routine, 400us
interrupt void timer2_comp_isr(void)
{
if (ad_state < 3) ADCSRA=0xCD; // Start the AD conversion
if (++time_count >= 25)
{
time_10ms_ok = true;
time_count = 0;
}
}
// ADC interrupt service routine
interrupt void adc_isr(void)
{
av = ADCH; // Read the 8 most significant bits of the AD conversion result
switch (ad_state)
{
case 0:
if (++ add_i >= 50)
{
add_i = 0;
ADMUX = 1 | (ADC_VREF_TYPE);
ad_state = 1;
}
break;
case 1:
if (++add_i >= 50)
{
add_i = 0;
ADMUX = 2 | (ADC_VREF_TYPE);
ad_state = 2;
}
break;
case 2:
if (++add_i >= 50)
{
add_i = 0;
ADMUX = ADC_VREF_TYPE;
ad_state = 3;
}
break;
}
}
void main(void)
{
__u8 key_count, no_key_count, password;
__u8 key_value,sw_in_value;
__u8 sub_state1,sub_state2;
__u8 key_pass_time;
__u8 time_100ms_count,time_1s_count;
PORTB=0x1E;
DDRB=0x21;
PORTC=0x40;
DDRC=0x38;
PORTD=0x3F;
DDRD=0x4F;
lcd_init();
//TIMER2 initialize - prescale:64
// Clock source: System Clock, Clock value: 62.5kHz
// WGM: CTC, Mode: CTC top=OCR2 // OC2 output: Disconnected
// desired value: 400uSec
TCCR2 = 0x00; //stop
ASSR= 0x00; //set async mode
TCNT2 = 0xE7; //setup
OCR2= 0x18;
TCCR2 = 0x0C; //start
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
// ADCSRA=0x8D;
if (e_flag != eep_no && e_flag != eep_ok)
{
e_volt = 437;
e_volt = 204;
init_eeprom();
init_time_num();
e_sum_time = 0;
e_date = 8;
e_date = 1;
e_date = 28;
e_flag = eep_ok;
}
volt_value.v.high_volt = e_volt;
volt_value.v.low_volt = e_volt;
init_fs();
sum_time = e_sum_time;
init_t_n();
p_date = e_date;
p_date = e_date;
p_date = e_date;
// Global enable interrupts
#asm("sei")
while (1)
{
if (time_10ms_ok)
{
j_out_ok = false;
if (work_state != error_state)
{
key_value = read_key();
sw_in_value = read_sw_in();
if (key_value != key_no_key) no_key_count = 0;
}
if (++time_100ms_count>=10)
{
if(++time_hl_volt >= 250) time_hl_volt = 250;
if(++time_lf >= 250) time_lf = 250;
if(++time_mf>=250) time_mf = 250;
if (++time_1s_count >= 10)
{
if (++time_ble>=100) time_ble = 100;
if (++no_key_count >= 30)
{
if (work_state == set_1_state || work_state == set_2_state ||work_state == set_3_state)
{
set_on = false;
work_state = standby_state;
}
}
if (++sum_time >= 36000000) sum_time = 0;
if (++stand_by_time>=3) stand_by_time = 0;
if (work_state == run_state)
{
if (++work_time >= 36000000) work_time = 0;
}
if (work_state == error_state)
{
if (++err_time >= 36000000) err_time = 0;
}
blik_on_1 = ~blik_on_1;
time_1s_count = 0;
}
if (time_1s_count == 2 ||time_1s_count == 7) blik_on = ~blik_on;
time_100ms_count = 0;
}
if (sw_in_value)
{
if (work_state != error_state)
{
if (work_state != run_state)
{
if (++work_num >= 100000000) work_num = 0;
}
work_state = run_state;
}
}
else
{
if (work_state == run_state) work_state = standby_state;
}
/*
if (work_state != error_state)
{
if (time_hl_volt > sf_value.s.f21 || time_ble > sf_value.s.f24 ||time_lf > sf_value.s.f22 ||time_mf > sf_value.s.f23)
{
work_state = error_state;
if (++err_num >= 100000000) err_num = 0;
}
if (time_hl_volt > sf_value.s.f21) com_sub_state = 0;
if (time_ble > sf_value.s.f24) com_sub_state = 1;
if (time_lf > sf_value.s.f22) com_sub_state = 2;
if (time_mf > sf_value.s.f23) com_sub_state = 3;
}
else
{
if (time_hl_volt <= sf_value.s.f21 && time_ble <= sf_value.s.f24 && time_lf <= sf_value.s.f22 && time_mf <= sf_value.s.f23)
work_state = standby_state;
}
*/
lcd_init_1(10);
switch (work_state)
{
case standby_state:
case run_state:
lcd_k5_vol_on;
Hex2Buff1(av_sum);
if (stand_by_time == 0) lcd_v_va_on;
if (stand_by_time == 1) lcd_v_vb_on;
if (stand_by_time == 2) lcd_v_vc_on;
switch(sub_state1)
{
case 0:
num2buff2(work_num);
lcd_k1_work_on;
lcd_k3_num_on;
break;
case 1:
time2buff2(work_time);
lcd_k1_work_on;
lcd_k4_time_on;
lcd_col2_on;
break;
case 2:
num2buff2(err_num);
lcd_k2_err_on;
lcd_k3_num_on;
break;
case 3:
time2buff2(err_time);
lcd_k2_err_on;
lcd_k4_time_on;
lcd_col2_on;
break;
}
if (work_state == run_state)
{
lcd_t_on;
}
else
{
if (key_value == key_set_sort)
if(++sub_state1 >= 4) sub_state1 = 0;
if (key_value == key_set_long)
{
set_on = true;
com_sub_state = 0;
work_state = set_1_state;
}
if (key_value == key_down_sort|| key_value == key_up_sort)
{
if (key_value == key_down_sort) password = password >> 1;
if (key_value == key_up_sort) password += 3;
if (++key_count == 8)
{
if (password == 0x15)
{
com_sub_state = 0;
work_state = set_2_state;
}
if (password == 0x17)
{
com_sub_state = 0;
work_state = set_3_state;
}
}
key_pass_time = 0;
}
else
{
if (++key_pass_time >= 200)
{
key_pass_time = 0;
key_count = 0;
password = 0xff;
}
}
}
break;
case error_state:
lcd_k5_vol_on;
Hex2Buff1(av_sum);
if (stand_by_time == 0) lcd_v_va_on;
if (stand_by_time == 1) lcd_v_vb_on;
if (stand_by_time == 2) lcd_v_vc_on;
switch(com_sub_state)
{
case 0:
if (blik_on_1) lcd_k7k8_hv_lv_on;
break;
case 1:
case 2:
if(blik_on_1) lcd_k9_lf_on;
break;
case 3:
if (blik_on_1) lcd_k10_mf_on;
break;
}
if (blik_on_1) num2buff2(err_num);
lcd_k2_err_on;
lcd_k3_num_on;
j_out_ok = true;
break;
case set_1_state:
switch (com_sub_state)
{
case 0:
case 1:
if (set_on)
up_down_16(key_value,com_sub_state);
else
{
set_on = true;
com_sub_state++;
}
break;
case 2:
if (set_on)
up_down_8(key_value,0);
else
work_state = standby_state;
break;
}
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
break;
case set_2_state:
if (com_sub_state != 0) lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
switch (com_sub_state)
{
case 0:
lcd_u.lcd_s.lcd_buff_1 =lcd_d7_1;
lcd_u.lcd_s.lcd_buff_1 =lcd_d7_1;
lcd_u.lcd_s.lcd_buff_1 =lcd_d7_1;
if (key_set_ok(key_value))work_state = standby_state;
if (key_up_ok(key_value))com_sub_state++;
if (key_down_ok(key_value)) com_sub_state = 10;
break;
case 1:
case 2:
case 3:
case 4:
lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
if (set_on)
{
if (com_sub_state == 1) up_down_16(key_value,0);
if (com_sub_state == 2) up_down_16(key_value,1);
if (com_sub_state == 3) up_down_8(key_value,0);
if (com_sub_state == 4) up_down_8(key_value,1);
}
else
{
if (key_set_ok(key_value))set_on = true;
if (key_up_ok(key_value))com_sub_state++;
if (key_down_ok(key_value)) com_sub_state--;
}
break;
case 5:
case 6:
case 7:
case 8:
lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
if (set_on)
{
up_down_8(key_value, com_sub_state - 3);
}
else
{
if (key_set_ok(key_value))set_on = true;
if (key_up_ok(key_value))com_sub_state++;
if (key_down_ok(key_value)) com_sub_state--;
}
break;
case 9:
case 10:
lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 =lcd_d7_2;
if (set_on)
{
yes_no(key_value, com_sub_state-9);
}
else
{
if (key_set_ok(key_value))
{
yes_on = false;
set_on = true;
}
if (key_up_ok(key_value))
{ if(++com_sub_state>10) com_sub_state = 0;}
if (key_down_ok(key_value)) com_sub_state--;
}
break;
}
break;
case set_3_state:
switch (com_sub_state)
{
case 0:
if (key_set_ok(key_value))work_state = standby_state;
if (key_up_ok(key_value))com_sub_state++;
if (key_down_ok(key_value)) com_sub_state = 2;
break;
case 1:
if(key_down_ok(key_value)) com_sub_state--;
if(key_up_ok(key_value)) com_sub_state++;
time2buff2(sum_time);
lcd_k4_time_on;
lcd_col2_on;
break;
case 2:
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2 / 10];
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2 % 10];
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2 / 10];
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2 % 10];
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2 / 10];
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2 % 10];
switch(sub_state2)
{
case 0:
if(key_down_ok(key_value)) com_sub_state--;
if(key_up_ok(key_value)) com_sub_state = 0;
if (key_set_ok(key_value))sub_state2++;
break;
case 1:
if (blik_on)
{
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
}
if(key_up_ok(key_value))
{
if (++p_date >= 99) p_date = 99;
}
if(key_down_ok(key_value))
{
if (p_date >0) p_date--;
}
if (key_set_ok(key_value))sub_state2++;
break;
case 2:
if (blik_on)
{
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
}
if(key_up_ok(key_value))
{
if (++p_date >= 12) p_date = 12;
}
if(key_down_ok(key_value))
{
if (p_date > 1) p_date--;
}
if (key_set_ok(key_value))sub_state2++;
break;
case 3:
if (blik_on)
{
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
lcd_u.lcd_s.lcd_buff_2 = lcd_d7_2;
}
if(key_up_ok(key_value))
{
if (++p_date >= 31) p_date = 31;
}
if(key_down_ok(key_value))
{
if (p_date > 1) p_date--;
}
if (key_set_ok(key_value))
{
sub_state2 = 0;
e_date = p_date;
e_date = p_date;
e_date = p_date;
}
break;
}
lcd_col1_on;
lcd_col2_on;
break;
}
lcd_u.lcd_s.lcd_buff_1 =lcd_d7_1;
lcd_u.lcd_s.lcd_buff_1 =lcd_d7_1;
lcd_u.lcd_s.lcd_buff_1 =lcd_d7_1;
break;
}
if (work_state == set_1_state || work_state == set_2_state || work_state == set_3_state)
lcd_k6_set_on;
lcd_disp();
j_out_port = j_out_ok;
time_10ms_ok = false;
}
else
{
if (ad_state >= 3)
{
data_proc();
ad_state = 0;
}
}
} 天哪,这么长,不要时间?? 寒汗! 这个不算长呀,仅仅是使用M8做的一个小东西中的部分代码.
一个真正实用的系统代码,肯定是要比教材中的代码复杂和长多了. 呵呵很好。
页:
[1]