NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4250 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 1 از 1

موضوع: کمک فوری برای ارسال و دریافت صدا باavr

  1. #1
    تازه وارد
    تاریخ عضویت
    Aug 2008
    نوشته ها
    1
    تشکر
    1
    تشکر شده 0 بار در 0 پست

    پیش فرض کمک فوری برای ارسال و دریافت صدا باavr

    سلام به همه عزیزان
    برای پروژم مدار فرستنده و گیرنده صوتی با AVR در نظر گرفتم.
    کدهای برنامه های ارسال و دریافت و شماتیک مدار رو براتون میذارم. امیدوارم بتونید کمکم کنید.
    مشکلم اینه که مدار توی فرکانسهای خیلی پایین خروجی مناسبی داره(کمتز از 100 هرتز)
    نمیدونم کجای مدار یا برنامه ایرادی داره. اگه سوالی داشتید یا جاییش مبهم بود بپرسید تا جواب بدم.
    عمل کرد کلی مدار هم به این صورته که سیگنال آنالوگ یا همون صوت وارد پبن ورودی میکرویی که با برنامه ارسال پروگرم شده میشه.بعد توسط ADC دیجیتالی مشه و با استفاده از پروتکل UART به پین خروجی ارسال میشه. پین خروجی به پین ورودی میکرویی که با برنامه دریافت صوت پروگرم شده وصل و در نهایت به پورت خوجی فرستاده میشه. خروجی دیجیتال هم با DAC آنالوگ مشه.
    (توی شماتیک مدار همه چی مشخصه)
    http://mypoem.persiangig.com/Project.zip

    برنامه ارسال:

    #include <mega32.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <delay.h>

    //set baud for 27.7 kbps
    #define baudnum 36
    #define halfbaudnum 18

    //set ADC reference to AREF
    #define ADC_VREF_TYPE 0x20

    //timeout value for task1 voice sampler
    //a value of 1 ensures the task executes at
    //every overflow
    #define t1 1

    //global variables
    char bitcnt; // bit counter
    char Txbyte; // data to be transmitted
    char sb; // number of stop bits (1, 2, ...)
    char carry; // carry bit
    unsigned char reload; // timer 0 reload
    int time1; // timeout counter
    unsigned char temp; // temporary data holder

    //the task subroutine
    void task1(void);

    //the data transmit subroutine
    void put(void);

    //************************************************** ********
    //timer 0 overflow ISR
    interrupt [TIM0_OVF] void timer0_overflow(void)
    {
    //reload to force overflow period
    TCNT0=reload;

    //decrement the time if not zero
    if (time1>0) --time1;
    }

    // ADC interrupt service routine
    interrupt [ADC_INT] void adc_isr(void)
    {
    // Read the 8 most significant bits
    // of the AD conversion result and
    // transfer to the transmit byte
    Txbyte=ADCH;
    temp=Txbyte;
    put();
    }

    //************************************************** ********
    //Task 1
    void task1(void)
    {
    time1=t1; //reset the task timer
    ADCSR.6=1; //initiate ADC conversion
    PORTB=temp; //send result to PORTB for debugging
    }

    //Transmit Byte
    void put(void)
    {
    bitcnt=9+sb; //initiate bit counter

    Txbyte=~Txbyte; //invert byte for easier handling

    carry=1; //set carry to 1 for start bit

    //while loop transmits the data bits using delay
    while(bitcnt>0)
    {
    //transmit opposite of what is in carry
    if (carry)
    {
    PORTD.1=0;
    }
    else
    {
    PORTD.1=1;
    #asm("nop")
    }

    delay_us(baudnum); //1 bit delay

    carry=(Txbyte&0b00000001); //move LSB to carry1

    Txbyte=Txbyte>>1; //shift transmit byte right

    bitcnt--; //decrement bitcnt, 1 bit sent
    }
    }

    void main(void)
    {
    //set up timer 0
    reload=256-21; //value for about 1/3 Msec at 16 MHz
    TCNT0=reload; //initial reload
    TIMSK=1; //turn on timer 0 overflow ISR
    TCCR0=4; //prescalar to 256

    //init the task timers
    time1=t1;

    DDRB=0xff; //direction for debugging port
    DDRD=0b00000010; //direction for UART pins

    sb=1; // set to 1 stop bit

    // 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;
    ADCSR=0x8F;

    // Global enable interrupts
    #asm("sei")

    //infinite loop ensures task1 executes at evey overflow
    //ISRs do the rest of the work
    while (1)
    {
    //execute task1 when time1 is 0
    if (time1==0) task1();
    }
    }


    برنامه دریافت:


    #include <mega32.h>
    #include <stdio.h>
    #include <delay.h>

    //set baud to 27.7 kbps
    #define baudnum 36
    #define halfbaudnum 18

    //global variables
    char bitcnt; // bit counter
    char Rxbyte; // received data
    char sb; // number of stop bits (1, 2, ...)
    char k; // debugging counter

    //the data receive subroutine
    void get(void);

    //Receive Byte
    void get(void)
    {
    Rxbyte = 0x00; //clear receive byte

    bitcnt=9+sb; //initialize bit counter

    k=0; //initialize debug counter

    //while loop waits for start bit
    while(PIND.0 != 0)
    {
    k=k+1;// hang out
    }

    //delay to middle of start bit
    delay_us(halfbaudnum);

    //while loop samples at middle of bits
    //stops at bitcnt of 2 to avoid shifting
    //in stop bit
    while(bitcnt>2)
    {
    delay_us(baudnum); //1 bit delay

    Rxbyte=Rxbyte>>1; //shift receive byte right 1

    //sample bit
    //move value to MSB of receive byte
    if (PIND.0)
    {
    Rxbyte=Rxbyte | 0b10000000;
    }
    else
    {
    Rxbyte=Rxbyte & 0b01111111;
    }

    bitcnt--; //decrement bitcnt, 1 bit received
    }

    //blast received byte out PORTB
    PORTB = Rxbyte;
    }

    void main(void)
    {
    DDRD=0b00000010; //direction for UART pins
    DDRB=0xff; //direction for output port

    sb=1; // set to 1 stop bit

    //infinite loop constantly calls get() to receive bytes
    while (1)
    {
    //receive bytes
    get();

    //delay 1 bit to get past stop bit
    delay_us(baudnum);
    }
    }

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •