اطلاعیه

Collapse
No announcement yet.

مشکل در نوشتن برنامه پورت سریال

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در نوشتن برنامه پورت سریال

    سلام.
    من یک برنامه نوشتم که یک میکرو کانالهای ADC اول تا هشتم را می خواند و به پورت سریال می فرستد.و ضمنا هر یک ثانیه یکبار مقدار ساعت را به پورت سریال می فرستد(ساعت را در وقفه تایمر 2 که در حالت آسنکرون پیکره بندی شده است, نوشتم).حالا می خواهم برنامه یک میکرو که بعنوان گیرنده عمل می کند را بنویسم که مقدار ADC ها را بگیرد و روی سطر اول LCD نشان دهد و همچنین مقدار ساعت را بگیرد و روی سطر دوم LCD نشان بدهد.اما هر کاری کردم نشد تا اینکه متوجه شدم باید از وقفه دریافت پورت سریال استفاده کنم.پیکره بندی وقفه دریافت را در CodeWizard انجام دادم اما دیدم تو وقفه کلی برنامه خفن نوشته که ازش سر در نیاوردم.کسی می تونه به من کمک کنه؟راستی عدد 8 تو CodeWizard واسه تعداد بافر کافیه دیگه؟

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

    #include <mega16.h>
    #include <delay.h>
    #include <stdio.h>
    char s,m,h,a;

    // Timer 2 overflow interrupt service routine
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    // Place your code here
    s++;
    if(s==60)
    {
    s=0;
    m++;
    }
    if(m==60)
    {
    m=0;
    h++;
    }
    if(h==24)
    {
    h=0;
    }
    printf("%d:%d:%d\r",h,m,s);

    }

    #define FIRST_ADC_INPUT 0
    #define LAST_ADC_INPUT 7
    unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
    #define ADC_VREF_TYPE 0x00
    // ADC interrupt service routine
    // with auto input scanning
    interrupt [ADC_INT] void adc_isr(void)
    {
    register static unsigned char input_index=0;
    // Read the AD conversion result
    adc_data[input_index]=ADCW;
    // Select next ADC input
    if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
    input_index=0;
    ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
    // Start the AD conversion
    ADCSRA|=0x40;
    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: TOSC1 pin
    // Clock value: PCK2/128
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x08;
    TCCR2=0x05;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x40;

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 9600
    UCSRA=0x00;
    UCSRB=0xD8;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;

    // 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
    // ADC Auto Trigger Source: None
    ADMUX=FIRST_ADC_INPUT|ADC_VREF_TYPE;
    ADCSRA=0xCE;

    // Global enable interrupts
    #asm("sei&quot

    while (1)
    {
    // Place your code here
    for(a=0;a<8;a++){
    printf("ADC%d=%d\r",a,adc_data[a]);
    delay_ms(500);
    }


    };
    }

    #2
    پاسخ : مشکل در نوشتن برنامه پورت سریال

    سلام
    این نمونه برنامه برای استفاده از وقفه پورت سریال:
    http://www.eca.ir/forum2/index.php/topic,9013.0.html
    در دیر مغان آمد یارم قدحی در دست
    مست از می می خواران از نرگس مستش مست

    دیدگاه


      #3
      پاسخ : مشکل در نوشتن برنامه پورت سریال

      سلام.از جوابتون ممنونم.
      اما من زیاد از اون برنامه سر در نیاوردم.یعنی هنوز کارم راه نیفتاده.اگه ممکنه همین جا یک برنامه بنویسید که فقط حاوی وقفه دریافت پورت سریال باشد و کاراکترهای دریافتی از پورت را(مثلا ساعتی که میکرو اولی برای این میکرو می فرستد) گرفته و روی LCD نشان دهد.
      ضمن اگه ممکنه یه کم در مورد متغیرهایی که خود CODEVISION در این قسمت تعریف می کند (مثل rx_buffer و rx_wr_index و ....) توضیح بدهید که چه نقشی دارند.

      دیدگاه


        #4
        پاسخ : مشکل در نوشتن برنامه پورت سریال

        سلام
        من یکم توضیح میدم امیدوارم خودتون بتونید مشکل رو حل کنید
        اگر یه برنامه با فعال کردن وقفه توسط Codewizard بسازید یه سری کد براتون ایجاد میکنه
        یه جایی توی برنامه نوشته
        if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        این یعنی که یه بایت دیتا صحیح به دست شما رسیده
        قبل این If این بایت درون متغییر data ریخته شده data=UDR
        حالا وقتی if اجرا میشه صحت اطلاعات چک میشه،پس بعد از اجرای If شما اطلاعات صحیح رو درون متغییر data دارید
        همون اول if محتویات data ریخته میشه توی بافر rx_buffer[rx_wr_index]=data;
        خب معلومه که rx_wr_index نشون میده که الان چندتا بایت توی بافر هست( به محل توی آرایه بافر اشاره می کنه)
        خب اون پایین هم یدونه به rx_wr_index اضافه می کنه و اگر این مقدار بیشتر از اندازه بافری که تعریف کردی بشه،rx_wr_index صفر میشه
        پس شما کافیه که یه بایت برای نشون دادن شروع ارسال و یکی هم برای پایان ارسال بذاری مثلا Enter رو بذاری برای پایان که میشه 13
        بعد مینویسی
        if( (data==13)
        بعد کارهایی رو که میخوای با اطلاعاتت میکنی
        در دیر مغان آمد یارم قدحی در دست
        مست از می می خواران از نرگس مستش مست

        دیدگاه


          #5
          پاسخ : مشکل در نوشتن برنامه پورت سریال

          سلام.خیلی ممنونم.
          حالا یه چیزایی دستگیرم شد.
          فقط چند سوال دیگه.
          اطلاعات دریافتی و یا ارسالی به صورت کد اسکی هستند؟
          در اینصورت با کدام تابع می توان انها را به کاراکتر یا رشته یا دسیمال تبدیل کرد؟ من کتاب ندارم و از کتابخانه های استاندارد کدویژن چیزی نمی دونم.
          منظور از 8 برای بافر چیست؟ یعنی در صورت قراردادن 8 بایت برای بافر در تابع وقفه فقط 8 بایت را دریافت می کند؟
          تو فرستنده چه طوری برای مثال کد ENTER که 13 است را ارسال کنم؟
          تابع getchar که codewizard بعد از تابع وقفه می سازد چیست و چه کاربردی دارد؟

          یه سوال دیگه که ربطی به پورت سریال ندارد.همانطور که می دونید نوشتن روی EEPROM مدت زمانی طول می کشد.خوب مقدار دقیق این زمان با VCC=5V چقدر است و به چه متغیرهای دیگر میکرو وابسته است؟(مثلا به کلاک میکرو هم وابسته است؟)
          خواندن از EEPROM چی؟ همانند خواندن از SRAM است و هیچ وقتی نمی گیرد؟

          دیدگاه

          لطفا صبر کنید...
          X