اطلاعیه

Collapse
No announcement yet.

مشکل ارتباط سریال در atmega64 a

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

    مشکل ارتباط سریال در atmega64 a

    با سلام به همه دوستان
    من یک میکرو atmega64a دارم و یک ماژول sim900 که می خوام با اون اس ام اس ارسال کنم
    قبلا یا atmega32 این کار را انجام دادم پس مسائل مربوط به راه اندازی ماژول رو ندارم ( تغذیه و نحوه اتصال پایه ها و .... )
    اما مشکل اینجاست که برنامه ای که قبلا روی مگا 32 داشت کار می کرد اینجا کار نمی کنه
    من با مگا 64 قبلا کار نکرده ام
    لطفا راهنمایی بفرمائید
    من فکر کنم مشکل از اونجاست که مگا 64 دو تا پورت ارتباط سریال داره
    من به سریال 1 متصل کرده ام و با سی و کدویژن برنامه می نویسم

    لطفا کمک کنید
    با تشکر

    #2
    پاسخ : مشکل ارتباط سریال در atmega64 a

    سلام

    پایه های TXD RXD را از نظر سخت افزاری درست ببندید.

    از اتصال کامل پورت سریال اگاه باشید که یک LED ساده با یک مقاومت در خروجی سریال ببندید ببنید دیتا ارسال میشه .که حاصل ارسال دیتا با چشمک زدن LED همراه است .

    اگر موار بالا اوکی بود برنامه را چک کنید .

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

    دیدگاه


      #3
      پاسخ : مشکل ارتباط سریال در atmega64 a

      ممنون از شما
      مشکل سخت افزاری نیست
      تمام اتصالات درست وصل شده اند
      امکان اتصال led هم نیست چون pcb زدم و نمیشه روش led نصب کرد
      احتمالا مشکل از برنامه هست
      من تابعی که باهاش sms رو می خونم می نویسم اینجا لطفا را هنمایی کنید
      این تابع کار نمی کنه و پیغامها رو نمی خونه
      کد:
      int SMS_Recieve (char *sms_txt , char *phone , char sms_num)
      {
        char *dest,*ptempA,*ptempB;
        char text1[100],text2[100];
        //rep1 : 
        // +CMGR: "REC UNREAD","+8613918186089", "","02/01/30,20:40:31+00" This is a test 
        printf("AT+CMGF=1%c",Enter);
        getstr(text2);
        getstr(text2);
        
        printf("AT+CMGR=%d%c",sms_num,Enter);  // Read SMS number 1
        //getstr(text2);
        getstr(text2);
        getstr(text1);  
      
        
        
        
        if(!strcmp(text1,"OK"))
          return 0;
        /*
        if(!strncmp(text1,"+CMS ERROR:",11))
        {  
          goto rep1;
        } 
        
        */
        getstr(sms_txt);   // text2 include the main sms
        getstr(text2); 
      
      //lcd_clear();
      //lcd_gotoxy(0,0);
      //lcd_puts(text2);
      //lcd_gotoxy(0,1);
      //lcd_puts(text2);
      //delay_ms(5000);
        //strcpy(sms_txt,text2);
        ptempA = text1;
        ptempB = strchr(ptempA,',');
        ptempA = ptempB + 5;
        dest = strchr(ptempA,'\"'); 
        phone[0] = '0';
        strncpy(phone+1,ptempA,dest - ptempA + 1);
        phone[dest - ptempA + 1] = 0; 
        return 1;   
      }
      
      
      
      void getstr(char *str)
      {
        char ch = 0;
        ch = getchar1();
        while((ch == 10) || (ch == 13) || (ch == 0))
          ch = getchar1();
        
        while((ch != 10) && (ch != 13))
        {
          *str++ = ch;
          ch = getchar1();
        }
        *str = 0;
      }
      در تابع دوم که مربوط هست به گرفتن یک کاراکتر از ورودی من با تابع getchar که مربوط به خود کدویژن هست ازمایش کردم
      اما چون توی مگا 64 به سریال 1 متصل کردم برای همین توی اینجا از getchar1 استفاده کردم
      لازم هست این رو بگم که این کدها رو توی قسمت وقفه نوشتم و پایه ri هم متصل هست
      لطفا راهنمایی بفرمائید

      دیدگاه


        #4
        پاسخ : مشکل ارتباط سریال در atmega64 a

        مشکل مربوط به استفاده از تابع printf هستش.
        به طور پیش فرض این تابع روی USART0 کار میکنه.
        شما رشته ای رو که میخوای ارسال کنی با کمک تابع putchar1 کاراکتر به کاراکتر ارسال کن.
        میتونی هم خودت براش یه تابع بنویسی که رشته رو یجا بدی به اون تابع اون برات ارسال کنه (با استفاده از همین تابع putchar1).

        البته یه راه حل های دیگه ای هم دیدم که به شما امکان میده که با کمک printf روی usart1 ارسال داشته باشید، ولی نمیدونم کار میکنه یا نه.

        دیدگاه


          #5
          پاسخ : مشکل ارتباط سریال در atmega64 a

          نوشته اصلی توسط 1768lpc
          مشکل مربوط به استفاده از تابع printf هستش.
          به طور پیش فرض این تابع روی USART0 کار میکنه.
          شما رشته ای رو که میخوای ارسال کنی با کمک تابع putchar1 کاراکتر به کاراکتر ارسال کن.
          میتونی هم خودت براش یه تابع بنویسی که رشته رو یجا بدی به اون تابع اون برات ارسال کنه (با استفاده از همین تابع putchar1).

          البته یه راه حل های دیگه ای هم دیدم که به شما امکان میده که با کمک printf روی usart1 ارسال داشته باشید، ولی نمیدونم کار میکنه یا نه.
          از شما ممنون هستم
          خود من هم شکم به همین بود
          ولی ارسال کاراکتر به کاراکتر مشکل هست چون تعدا پیامهام زیاد هستن و ارسال دریافتش مشکل میشه

          راهی نیست که از همین تابع printf بشه استفاده کرد ؟؟؟

          دیدگاه


            #6
            پاسخ : مشکل ارتباط سریال در atmega64 a

            اینو امتحان کنید ببینید کار میکنه؟

            این دوتا دستور رو به برنامه اضافه کنید:
            [code=c]#define _ALTERNATE_GETCHAR_
            #define _ALTERNATE_PUTCHAR_[/code]
            حالا اسم دوتا تابع getchar1 و putchar1 رو به getchar و putchar تغییر بدین.
            امیدوارم به کار بیاد.

            از این منبع :
            http://www.avrfreaks.net/forum/usart0-default-usart1-atmega128-using-printf

            البته یه مورد دیگه هم هست که ممکنه کار بکنه.
            این رو هم امتحان کنید. وارد کتابخونه stdio بشید (از طریق خود کدویژن). اون پایین یه دستور define هست که اینه:
            [code=c]#define _ATXMEGA_USART_ USARTC0[/code]
            اینو به این یکی تغییر بدین:
            [code=c]#define _ATXMEGA_USART_ USARTC1[/code]
            ممکنه این باعث بشه که توو کتابخونه stdio توابعش USART1 رو پیش فرض قرار بدن.
            امتحان کنید.
            به ماهم خبر بدین!
            موفق باشید.

            دیدگاه


              #7
              پاسخ : مشکل ارتباط سریال در atmega64 a

              از همه دوستان تشکر می کنم
              درست شد
              مشکل دقیقا همون چیزی که بود که حدس می زدیم
              دستور printf بصورت پیشفرض usart0 رو مد نظر داشت که با دستوراتی که دوستمون 1768lpc معرفی کردند درست شد
              خیلی از ایشون سپاسگزار هستم

              دیدگاه


                #8
                پاسخ : مشکل ارتباط سریال در atmega64 a

                سلام دوستان
                من یه مشکلی با تابع printf در ATmega324 مواجه شدم و USART0 استفاده می کنم ولی نمی دونم چرا کارکتر عجیب می گیرم:
                کد:
                [FONT=Yekan]#include <mega324.h>[/FONT]
                
                // Declare your global variables here
                
                
                // Standard Input/Output functions
                #include <stdio.h>
                #include <delay.h>
                
                
                int i;
                
                
                void main(void)
                {
                // Declare your local variables here
                
                
                // Crystal Oscillator division factor: 1
                #pragma optsize-
                CLKPR=(1<<CLKPCE);
                CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
                #ifdef _OPTIMIZE_SIZE_
                #pragma optsize+
                #endif
                
                
                // Input/Output Ports initialization
                // Port A initialization
                // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
                DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
                // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
                PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
                
                
                // Port B initialization
                // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
                DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
                // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
                PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
                
                
                // Port C initialization
                // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
                DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
                // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
                PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
                
                
                // Port D initialization
                // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
                DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
                // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
                PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
                
                
                // Timer/Counter 0 initialization
                // Clock source: System Clock
                // Clock value: Timer 0 Stopped
                // Mode: Normal top=0xFF
                // OC0A output: Disconnected
                // OC0B output: Disconnected
                TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
                TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
                TCNT0=0x00;
                OCR0A=0x00;
                OCR0B=0x00;
                
                
                // Timer/Counter 1 initialization
                // Clock source: System Clock
                // Clock value: Timer1 Stopped
                // Mode: Normal top=0xFFFF
                // OC1A output: Disconnected
                // OC1B output: Disconnected
                // 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=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
                TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
                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
                // OC2A output: Disconnected
                // OC2B output: Disconnected
                ASSR=(0<<EXCLK) | (0<<AS2);
                TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
                TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
                TCNT2=0x00;
                OCR2A=0x00;
                OCR2B=0x00;
                
                
                // Timer/Counter 0 Interrupt(s) initialization
                TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
                
                
                // Timer/Counter 1 Interrupt(s) initialization
                TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
                
                
                // Timer/Counter 2 Interrupt(s) initialization
                TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);
                
                
                // External Interrupt(s) initialization
                // INT0: Off
                // INT1: Off
                // INT2: Off
                // Interrupt on any change on pins PCINT0-7: Off
                // Interrupt on any change on pins PCINT8-15: Off
                // Interrupt on any change on pins PCINT16-23: Off
                // Interrupt on any change on pins PCINT24-31: Off
                EICRA=(0<<ISC21) | (0<<ISC20) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                EIMSK=(0<<INT2) | (0<<INT1) | (0<<INT0);
                PCICR=(0<<PCIE3) | (0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
                
                
                // USART0 initialization
                // Communication Parameters: 8 Data, 1 Stop, No Parity
                // USART0 Receiver: On
                // USART0 Transmitter: On
                // USART0 Mode: Asynchronous
                // USART0 Baud Rate: 9600
                UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
                UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
                UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
                UBRR0H=0x00;
                UBRR0L=0x4D;
                
                
                // USART1 initialization
                // USART1 disabled
                UCSR1B=(0<<RXCIE1) | (0<<TXCIE1) | (0<<UDRIE1) | (0<<RXEN1) | (0<<TXEN1) | (0<<UCSZ12) | (0<<RXB81) | (0<<TXB81);
                
                
                // Analog Comparator initialization
                // Analog Comparator: Off
                // The Analog Comparator's positive input is
                // connected to the AIN0 pin
                // The Analog Comparator's negative input is
                // connected to the AIN1 pin
                ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
                ADCSRB=(0<<ACME);
                // Digital input buffer on AIN0: On
                // Digital input buffer on AIN1: On
                DIDR1=(0<<AIN0D) | (0<<AIN1D);
                
                
                // ADC initialization
                // ADC disabled
                ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
                
                
                // SPI initialization
                // SPI disabled
                SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
                
                
                // TWI initialization
                // TWI disabled
                TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
                
                
                while (1)
                      {
                      PORTB.0 = 1;
                      delay_ms(100);
                      PORTB.0 = 0; 
                      delay_ms(100);
                      i = 5;
                      printf("%d",i);
                
                
                      }
                [FONT=Yekan]}
                [/FONT]
                تابع pritf در تنظیمات codevision با int تعریف شده. لطفا عکس ها رو ببینید.



                دیدگاه

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