اطلاعیه

Collapse
No announcement yet.

ارتباط دوتا میکرو با usart

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

    ارتباط دوتا میکرو با usart

    با سلام من دوتا میکرو را با usart به هم وصل کردم که یکی از میکروها دیتایی را برای میکرو گیرنده میفرسته و میکروی دوم از طریق این دیتا یک ضریب بدست میاره و در مقدار adc ضرب میکنه حالا مشکلم اینه که وقتی کابل ارتباط usart بین دو میکرو وصله درسته اما وقتی کابل را قطع میکنم مقدار ضریب صفر میشه برای ارتباط سریال هم از اینتراپت استفاده کردم آیا کسی میتونه کمک کنه

    #2
    پاسخ : ارتباط دوتا میکرو با usart

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

    دیدگاه


      #3
      پاسخ : ارتباط دوتا میکرو با usart

      کد:
      [left]
      /*****************************************************
      This program was produced by the
      CodeWizardAVR V2.05.3 Standard
      Automatic Program Generator
      © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com
      
      Project : 
      Version : 
      Date  : 2013-06-29
      Author : PerTic@n
      Company : If You Like This Software,Buy It
      Comments: 
      
      
      Chip type        : ATmega8
      Program type      : Application
      AVR Core Clock frequency: 8.000000 MHz
      Memory model      : Small
      External RAM size    : 0
      Data Stack size     : 256
      *****************************************************/
      #include <mega8.h>
      #include <delay.h>
      #include <math.h>
      // Standard Input/Output functions
      #include <stdio.h>
      #include "display.h"
      
      #define  SCAN  PORTC
      #define  LED_V PORTC.1
      #define  LED_F PORTC.5 
      void gen_7seg(int temp);
      //void gen_7seg(int number);
      void show_v(void);
      void show_f(void);
      void show_7seg(void);
      void calibre_set(void);
       flash unsigned char nom[]=
      {
      /*0  1  2   3  4  5  6  7  8  9 */
      0x21,0xe7,0xa8,0xa2,0x66,0x32,0x30,0xa7,0x20,0x22,187,0,129,89,129
      };
      unsigned long T,T1;
       unsigned int data_7seg[4],time_out;
      unsigned long int adc_temp;
      float f,calibre_factor=1,temp,data_calibre_e;
      // External Interrupt 0 service routine
       bit key=0,fine_adc=0,freq_flag=0,calibre_flag=0;
      eeprom  unsigned long int calibre_factor_e=1; 
      eeprom  unsigned char calibre_ok=0;
      #ifndef RXB8
      #define RXB8 1
      #endif
      
      #ifndef TXB8
      #define TXB8 0
      #endif
      
      #ifndef UPE
      #define UPE 2
      #endif
      
      #ifndef DOR
      #define DOR 3
      #endif
      
      #ifndef FE
      #define FE 4
      #endif
      
      #ifndef UDRE
      #define UDRE 5
      #endif
      
      #ifndef RXC
      #define RXC 7
      #endif
      
      #define FRAMING_ERROR (1<<FE)
      #define PARITY_ERROR (1<<UPE)
      #define DATA_OVERRUN (1<<DOR)
      #define DATA_REGISTER_EMPTY (1<<UDRE)
      #define RX_COMPLETE (1<<RXC)
      
      // USART Receiver buffer
      #define RX_BUFFER_SIZE 8
      char rx_buffer[RX_BUFFER_SIZE];
      
      #if RX_BUFFER_SIZE <= 256
      unsigned char rx_wr_index,rx_rd_index,rx_counter;
      #else
      unsigned int rx_wr_index,rx_rd_index,rx_counter;
      #endif
      
      // This flag is set on USART Receiver buffer overflow
      bit rx_buffer_overflow;
      
      // USART Receiver interrupt service routine
      interrupt [USART_RXC] void usart_rx_isr(void)
      {
      char status,data;
      status=UCSRA;
      //data=UDR;
      //data_calibre_e=data;
      LED_F=!LED_F;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {    
         data_calibre_e=UDR;
        calibre_flag=1;
        
        //LED_F=0;
        //rx_buffer[rx_wr_index++]=data; 
        
      //#if RX_BUFFER_SIZE == 256
      //  // special case for receiver buffer size=256
      //  if (++rx_counter == 0) rx_buffer_overflow=1;
      //#else
      //  if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      //  if (++rx_counter == RX_BUFFER_SIZE)
      //   {  
      //   //data_calibre= data; 
      //   rx_counter=0;
      //   rx_buffer_overflow=1;
      //   }
      //#endif
        }
      }
      
      
      
      
      interrupt [EXT_INT0] void ext_int0_isr(void)
      {
      // Place your code here
      static bit timer_st=0;
       timer_st=!timer_st;
       if(timer_st)TCCR1B=0x3;
       else 
       {TCCR1B=0x0;
       freq_flag=1;
       T1=TCNT1;
       TCNT1=0;
       }
      }
      
      // External Interrupt 1 service routine
      interrupt [EXT_INT1] void ext_int1_isr(void)
      {
      // Place your code here
      key=!key;
      }
      
      // Timer1 overflow interrupt service routine
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      // Place your code here
      
      }
      
      // Timer2 output compare interrupt service routine
      interrupt [TIM2_COMP] void timer2_comp_isr(void)
      {
      // Place your code here
       show_7seg();
       ADCSRA|=0x40; 
      // if(calibre_flag==1)time_out++;
      }
      
      #define ADC_VREF_TYPE 0x00
      
      // ADC interrupt service routine
      interrupt [ADC_INT] void adc_isr(void)
      {
      static unsigned int adc_data=0,n=0;
      static unsigned long temp1=0;
      // Read the AD conversion result
      //adc_data=ADCW;
      // Place your code here
         if(fine_adc==0)
         {   
      //    //if(ADCW=502)temp1=((unsigned int)ADCW-522);
          if(ADCW>=502)temp1=((unsigned int)ADCW-502);
          if(ADCW<502)temp1=((unsigned int)501-ADCW); 
          //if(temp1<=7)temp1=0;
           //adc_temp+=temp1;
          //temp1=abs(temp1);
          adc_temp+=((unsigned long int)temp1*temp1);
      
          if(++n==1000)
          { 
           
          //temp1=0; 
          
          fine_adc=1;
          n=0;
          }
         }
      }
      
      // Declare your global variables here
      
      void main(void)
      {
      // Declare your local variables here
      
      // Input/Output Ports initialization
      // Port B initialization
      // Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
      // State7=T State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
      PORTB=0x00;
      DDRB=0x3F;
      
      // Port C initialization
      // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In 
      // State6=T State5=0 State4=1 State3=1 State2=1 State1=0 State0=T 
      PORTC=0x1C;
      DDRC=0x3E;
      
      // Port D initialization
      // Func7=Out Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In 
      // State7=0 State6=0 State5=T State4=T State3=P State2=T State1=1 State0=P 
      PORTD=0x0B;
      DDRD=0xC2;
      
      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      TCCR0=0x00;
      TCNT0=0x00;
      
      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer1 Stopped
      // Mode: Normal top=0xFFFF
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer1 Overflow Interrupt: On
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      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: System Clock
      // Clock value: 62.500 kHz
      // Mode: CTC top=OCR2
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x0D;
      TCNT2=0x00;
      OCR2=120;
      
      // External Interrupt(s) initialization
      // INT0: On
      // INT0 Mode: Rising Edge
      // INT1: On
      // INT1 Mode: Falling Edge
      GICR|=0xC0;
      MCUCR=0x0B;
      GIFR=0xC0;
      
      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x84;
      
      // USART initialization
      // Communication Parameters: 8 Data, 1 Stop, Odd Parity
      // USART Receiver: On
      // USART Transmitter: Off
      // USART Mode: Asynchronous
      // USART Baud Rate: 9600
      UCSRA=0x00;
      UCSRB=0x90;
      UCSRC=0xB6;
      UBRRH=0x00;
      UBRRL=0x47;
      
      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;
      
      // ADC initialization
      // ADC Clock frequency: 62.500 kHz
      // ADC Voltage Reference: AREF pin
      ADMUX=ADC_VREF_TYPE & 0xff;
      ADCSRA=0x8F;
      
      // SPI initialization
      // SPI disabled
      SPCR=0x00;
      
      // TWI initialization
      // TWI disabled
      TWCR=0x00;
      
      // Global enable interrupts
      #asm("sei")
      key=0;
      LED_V=1;
      LED_F=1;
      calibre_factor=calibre_factor_e;
      delay_ms(5);
      //if(calibre_ok==0)
      //{
      //UCSRA=0x00;
      //UCSRB=0x90;
      //}
      while (1)
         {
         // Place your code here 
         //if(calibre_flag==1)calibre_set();
         //if(key==0)
         show_v();
         //else show_f();
         //LED_F=calibre_flag;
         }
      }
      
      void show_v(void)
       { 
       LED_V=0;
      // LED_F=1;
       static long int adc_valu=0;
        if(fine_adc)
         { 
         adc_valu=(adc_temp/1000);
         adc_valu=sqrt(adc_valu); 
         //adc_valu=adc_temp/100;
         temp=adc_valu; 
         if(calibre_flag==1)
           {
           calibre_set(); 
           
           calibre_factor=calibre_factor*100;
            LED_F=1; 
           UDR=0;
           }
         adc_valu=adc_valu*calibre_factor; 
         gen_7seg(calibre_factor); 
         
         fine_adc=0;
         
         adc_temp=0;
         } 
       } 
       void calibre_set(void)
       {   
       ///static float data_calibre=0;
      
       //data_calibre=getchar();
       calibre_factor=(float)(data_calibre_e/temp); 
       calibre_factor_e=calibre_factor; 
       delay_ms(5);
       calibre_ok=1; 
       calibre_flag=0;
       }
      void show_f(void)
       { 
        LED_V=1;
       LED_F=0;
       static unsigned char sample_freq=0; 
         if(freq_flag)
         { 
         GICR|=0x80; 
         //T1=(unsigned long)(T1*10);
         T=(unsigned long)(T+T1); 
           //sample_freq=0;
           if(++sample_freq==100)
           {
           //f=(float)(12800/T); 
           f=(float)(100000000/T); 
           f=(float)(f*1.73);
           if(f>0)f=(float)(f+1);
           sample_freq=0;
           gen_7seg(f); 
           T=0;
           }
         TCNT1=0;
         freq_flag=0;
         GICR|=0xC0;
         }
       }
      void gen_7seg(int temp)
       { 
       static unsigned char i=0;
       for(i=0;i<3;i++)
        { 
        data_7seg[i]=temp%10;
        temp/=10;
        } 
       } 
       void show_7seg(void)    
       {  
        static unsigned char dg=0; 
        static unsigned char data_org=0,data_copy=0;
        SCAN =SCAN|0b011100;
        delay_us(5);    
        data_org = nom[data_7seg[dg]]; 
        data_copy=data_org;
        PORTB=data_copy;
        data_copy=data_org&0b11000000;
        //PORTD=data_copy; 
        if(dg==0)
        SCAN = SCAN&0b101111;
        if(dg==1)
        SCAN = SCAN&0b110111; 
        if(dg==2)
        SCAN = SCAN&0b111011;
        if(++dg>2)dg=0;   
       }
      
      [/left]
      مشکل تو همین قسمته

      دیدگاه


        #4
        پاسخ : ارتباط دوتا میکرو با usart

        سلام خوب مگه نباید اینطور باشه؟ میخواید وقتی usart قطع میشه آخرین مقدار دریافت شده ازش ضریب بمونه؟ خوب شما مقدار usart (رجیستر udr ) را مستقیم ضرب نکن تو مقدار adc چون وقتی قطع میشه یعنی همش داره 0 دریافت میشه و کلا صفر میشه . شما تو یک ترد مقدار usart را بریز تو یک متغییر (بافر) و چک کن اگر مقدار دریافت شده صفر بود و مقدار خط هم صفر بود مقدار بافر رو تغییر نده.
        البته یه چیز الان به ذهنم خورد بهتره ،امتحان کن ببین میشه : pull up پین دریافت سریال رو فعال کن . فکر کنم درست میشه(چون تو حالت قطع یوزارت میره تو IDLE) . اگه درست شد ،ممنون میشم خبرش رو بهم بدی.
        راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

        دیدگاه


          #5
          پاسخ : ارتباط دوتا میکرو با usart

          با سلام و مرسی از پاسخت من از اینتراپت usart استفاده میکنم و وقتی دیتا از سمت فرستنده بیاد باید بیاد تو روتین اینتراپت و اگر پریتی و بیت استارت درست باشه مقدار udr را قبول میکنه پس اصلا نباید بره توی روتین اینتراپت در ضمن اگر دربرنامه نگاه کنید میبینید که پول پ فعال شده

          دیدگاه


            #6
            پاسخ : ارتباط دوتا میکرو با usart

            کسی برای مشکل من راه حلی نداره؟

            دیدگاه


              #7
              پاسخ : ارتباط دوتا میکرو با usart

              با سلام من دوباره تست کردم و مقدارudr را چک کردم که اگر صفر بود مقدارش را داخل رجیستر نریزه اما باز هم نشدمثل اینکه تو روتین اینتراپت گیر میکنه کسی نظری داره؟

              دیدگاه


                #8
                پاسخ : ارتباط دوتا میکرو با usart

                اگر دربرنامه نگاه کنید میبینید که پول پ فعال شده
                میتونی از پول پ خارجی استفاده کنی... شاید جواب بده...

                اگه نداد، بگو که یه راه دیگه براش پیدا کنیم...

                :job:
                قامت انسان با لباس انسانیت شکل می گیرد،
                والا مترسک جالیز را هم می توان لباسی فاخر پوشاند

                (عبدالرضا کشاورز)

                دیدگاه


                  #9
                  پاسخ : ارتباط دوتا میکرو با usart

                  با سلام
                  من از usart با اینتراپت استفاده میکنم اما تازمانی که تو فرستنده از دستور get char استفاده نکردم میکروهام درست کار می کنند اما زمانی که این دستور مینویسم کلا ارتباطم قطع میشه
                  از طرفی دوستان میگن باید تو اینتراپت اطلاعات رسیده شده رو بخونم چه طوری میتونم این کار بکنم ؟(یعنی خودن اطلاعات از سرویس وقفه )
                  اما داخل کتاب اقای مهندس دالوندی بخش سریال نوشته نباید داخل این سرویس وقفه چیزی بنویسید
                  خواهشمند کمک کنید بدجور گیر کردم
                  با تشکر فراوان
                  دست همتون درد نکنه .
                  داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
                  پیامبر اکرم (ص)
                  علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
                  اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)

                  دیدگاه


                    #10
                    پاسخ : ارتباط دوتا میکرو با usart

                    تازمانی که تو فرستنده از دستور get char استفاده نکردم میکروهام درست کار می کنند
                    از میکروی فرستنده به عنوان گیرنده هم استفاده میکنین که این دستور رو لازم دارین؟
                    اگه میتونین کدتون رو بذارین تا بیشتر کمکتون کنم...
                    قامت انسان با لباس انسانیت شکل می گیرد،
                    والا مترسک جالیز را هم می توان لباسی فاخر پوشاند

                    (عبدالرضا کشاورز)

                    دیدگاه


                      #11
                      پاسخ : ارتباط دوتا میکرو با usart

                      با سلام
                      ممنون از تئجهتون مشکلی که گفتم حل شد فعلا دارم رو پروتکل مد باس (rtu) کار میکنم اگه به مشکل خوردم دوباره مزاحم میشم
                      داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
                      پیامبر اکرم (ص)
                      علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
                      اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)

                      دیدگاه

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