اطلاعیه

Collapse
No announcement yet.

ارتباط میکرو و plc

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

    ارتباط میکرو و plc

    سلام دوستان
    من میخام atmega 8 را به plc با ارتباط سریال rs485 وصل کنم اینم
    اما هرکاری میکنم به مشکل می خورم
    اینم برنامم
    کد:
    #include <mega8.h>
    #include <delay.h>
    #include <stdlib.h>
     
    int f=3;
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {delay_ms(300); 
    f=f+1;
    // Place your code here
    
    }
    
    #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)
    
    // Write a character to the USART Transmitter
    #ifndef _DEBUG_TERMINAL_IO_
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while ((UCSRA & DATA_REGISTER_EMPTY)==0);
    UDR=c;
    }
    #pragma used-
    #endif
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // Declare your global variables here
    
    void main(void)
    {unsigned char str[32];
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // 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
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // 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=Out Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x10;
    
    // 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: Off
    // 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: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    GICR|=0x40;
    MCUCR=0x02;
    GIFR=0x40;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // Communication Parameters: 7 Data, 1 Stop, Even Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Sync. Master UCPOL=0
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0xE4;
    UBRRH=0x01;
    UBRRL=0xA0;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {delay_ms(500);
       itoa(f,str);
       printf("%s",str);
    
       // Place your code here
    
       }
    }

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

    نوشته اصلی توسط rasoul1
    سلام دوستان
    من میخام atmega 8 را به plc با ارتباط سریال rs485 وصل کنم اینم
    اما هرکاری میکنم به مشکل می خورم
    اینم برنامم
    کد:
    #include <mega8.h>
    #include <delay.h>
    #include <stdlib.h>
     
    int f=3;
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {delay_ms(300); 
    f=f+1;
    // Place your code here
    
    }
    
    #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)
    
    // Write a character to the USART Transmitter
    #ifndef _DEBUG_TERMINAL_IO_
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while ((UCSRA & DATA_REGISTER_EMPTY)==0);
    UDR=c;
    }
    #pragma used-
    #endif
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // Declare your global variables here
    
    void main(void)
    {unsigned char str[32];
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // 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
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // 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=Out Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x10;
    
    // 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: Off
    // 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: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    GICR|=0x40;
    MCUCR=0x02;
    GIFR=0x40;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // Communication Parameters: 7 Data, 1 Stop, Even Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Sync. Master UCPOL=0
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0xE4;
    UBRRH=0x01;
    UBRRL=0xA0;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {delay_ms(500);
       itoa(f,str);
       printf("%s",str);
    
       // Place your code here
    
       }
    }
    سلام
    تو str چرا هیچی نگذاشتی؟؟؟
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


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

      اگه بیشتر دقت کنید میبینید که f به عنوان متغیر سراسری تعریف شده و با وقفه افزایش پیدا میکنه
      بعد تو برنامه اصلی توسط دستور itoaعدد صحیح به رشته تبدیل و داخل str ریخته می شه و str روی پورت قرار می گیره

      دیدگاه


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

        برنامه درست کار میکنه ولی مشکل از اینه که plc وقتی عدد را می خونه بصورت پشت سر هم می خونه یعنی اگه ارسالی 2 باشه توی رجیستر 16 بیتی plc دوتا 2 بصورت معادل اسکی نشون داده می شه و همینطور اگه مثلا 153 ریخته بشه رجیستر اول 15 و رجیستر دوم 31 را نشون میده
        :surprised:

        دیدگاه


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

          نوشته اصلی توسط rasoul1
          اگه بیشتر دقت کنید میبینید که f به عنوان متغیر سراسری تعریف شده و با وقفه افزایش پیدا میکنه
          بعد تو برنامه اصلی توسط دستور itoaعدد صحیح به رشته تبدیل و داخل str ریخته می شه و str روی پورت قرار می گیره
          سلام
          من با avr-gcc کار می کنم و شاید مشکل شما این نکته که می خوام بگم نباشه اما شاید راه گشا باشه:
          جهت کاهش کد معمولا متغییر هایی که جایی تو برنامه تغییری نمی کنند از بین می رن و همون اول مقدارشون لحاظ میشه. احتمالا متغییر شما دیگه بروز نمیشه چون گرفتار optimize شده...(آ‌وقفه ها خارجی حساب میشوند و جز اجزا داخلی برنامه حساب نمی شوند.

          در ضمن چرا توی وقفه تاخیر گذاشتی ...

          دیدگاه


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

            تاخیر وقفه بخاطر این بود که با اینکه وقفه حساس به لبه هستش ولی نمیدونم ایراد از کجاست که بعضی وقتا با یه بار فشار دادن کلید چندتا عددم اضافه میشد با این تاخیر بهتر عمل می کنه!
            اما در مورد از بین رفتن متغییر اینطور نیست چون متغییرم همونطور که میخام عوض میشه و روی lcd نمایش داده می شه ولی توی plc به اون ترتیبی که گفتم خونده میشه فکر می کنم توی تشخیص بیت پایان مشکل وجود داره!

            یه مشکل هم با نمایش lcd داشتم که چون داده ها تک تک فرستاده می شه وقتی به صورت
            lcd_clear();
            lcd_puts(str);
            مینویسم از اعداد دو رقمی به بالا فقط یکیشا نشون میده مثلا برای 10 فقط 1 نشون میده!!

            دیدگاه

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