hyitzhb 发表于 2008-5-30 20:24:43

马老师,你好,看了你书第10章的AD例子,总觉得还是不够用?

马老师,你好,看了你书第10章的AD例子,总觉得还是不够用?你能否在专栏里贴些CVAVR编的AD例子,供我们学习?谢谢,马老师。

machao 发表于 2008-5-31 01:54:51

下面是我做的一个测量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;
                           }
                }
        }

token2000 发表于 2008-6-12 01:45:58

天哪,这么长,不要时间?? 寒汗!

machao 发表于 2008-6-12 18:05:27

这个不算长呀,仅仅是使用M8做的一个小东西中的部分代码.

一个真正实用的系统代码,肯定是要比教材中的代码复杂和长多了.

mljda 发表于 2008-6-12 18:34:06

呵呵很好。
页: [1]
查看完整版本: 马老师,你好,看了你书第10章的AD例子,总觉得还是不够用?