اطلاعیه

Collapse
No announcement yet.

مشکل در ارسال SMS با SIM900

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

    #16
    پاسخ : مشکل در ارسال SMS با SIM900

    ممنون از پاسخ تون.
    RTC رو بلدم.
    کد:
     if(a==2){
      if(data=='>')
      a=3
    1.الان دقیقا این کد چیکار می کنه؟
    2.مقدار a رو موقع declare کردن چند بذارم؟
    3.من کلا نمی دونم وقفه سریال عملکردش چه جوریه. احتمالا سر همین نمی فهمم چیکار کردید. با سرچ فقط فهمیدم مثل اینکه داده ی مورد نظر برای ارسال رو هر 8 تا بیتش رو توی بافر میذاره بعد ارسال می کنه درست فهمیدم؟؟؟
    4.یه سوال دیگه! وقفه سریال موازی با while اصلی مون اجرا میشه؟
    5.این while چیکار می کنه؟ مگه یه بار چک نکردیم شرطمون رو با if چرا توی لوپ انداختیدش؟
    کد:
    if(PINB.0==0)
        {
        while(PINB.0==0); 
        delay_m(20); 
        a=1;
        }

    دیدگاه


      #17
      پاسخ : مشکل در ارسال SMS با SIM900

      شما زمانی که دستورat+cmgs="number"می فرستی ماژول <اینو برای شما می فرسته و شما از وقفه که در میکرو به خاطره دریافت این دیتا از سمت ماژول میکرو، وارد وقفه می شه و این دیتارو در اون شرطی که گذاشتیم در وقفه سریال مقایسه می کنه اگه درست باشه شروع به ارسال متن پیام می کنه.
      4-زمانی که در میکرو وقفه ایجاد می شه میکرو اخرین ادرسو ذخیره می کنه و وارد وقفه می شه ووقتی که وقفه تمام شد باز هم وارد برنامه می شه از جای شروع می کنه که برنامه قطع شده است.
      5-این whileبه خاطره گرفته شدن بانس کلید است یعنی تا زمانی که دست تو از روی کلید بر نداری برنامه اجرا نمی شه

      دیدگاه


        #18
        پاسخ : مشکل در ارسال SMS با SIM900

        نوشته اصلی توسط 1morteza
        شما زمانی که دستورat+cmgs="number"می فرستی ماژول <اینو برای شما می فرسته و شما از وقفه که در میکرو به خاطره دریافت این دیتا از سمت ماژول میکرو، وارد وقفه می شه و این دیتارو در اون شرطی که گذاشتیم در وقفه سریال مقایسه می کنه اگه درست باشه شروع به ارسال متن پیام می کنه.
        4-زمانی که در میکرو وقفه ایجاد می شه میکرو اخرین ادرسو ذخیره می کنه و وارد وقفه می شه ووقتی که وقفه تمام شد باز هم وارد برنامه می شه از جای شروع می کنه که برنامه قطع شده است.
        5-این whileبه خاطره گرفته شدن بانس کلید است یعنی تا زمانی که دست تو از روی کلید بر نداری برنامه اجرا نمی شه
        1.پس طبق توضیح خودتون فکر کنم این دستور رو اشتباه نوشتید:
        کد:
            if(a==1){
            printf("at+cmgda=%1c%s%1c%1c",q,del,q,enter);
            a=2;
            }
        فکر کنم باید جای دستور printf بالا اینو بذارم:
        کد:
        printf("at+cmgs=%1c%s%1c%1c",q,tel,q,enter);
        درسته؟ چون وقتی شماره رو می فرسته، ماژول < می فرسته! و توی a=2 رو توی وقفه باید چک کنه.
        2.اون delay های اولیه رو حذف کنم و کدهای شما رو بنویسم برای ماژولم مشکلی ایجاد نشه؟چون من از کسی که یادگرفتم گفت حتما باید delay ها رو بذارید که ماژول قاطی نکنه!!!!
        خیلی ممنون از اینکه کمک می کنید.

        دیدگاه


          #19
          پاسخ : مشکل در ارسال SMS با SIM900

          من این کد رو پیاده سازی کردم ولی آخرین مقداری که a میگیره 2 هست! و اصلا 3 نمیشه که بخواد پیامک ارسال کنه!
          شما قبلا از روشتون جواب گرفتید؟
          کد:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.05.0 Advanced
          Automatic Program Generator
          © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : 
          Version : 
          Date  : 07/17/2014
          Author : www.Eca.ir *** www.Webkade.ir
          Company : 
          Comments: 
          
          
          Chip type        : ATmega16
          Program type      : Application
          AVR Core Clock frequency: 11.059200 MHz
          Memory model      : Small
          External RAM size    : 0
          Data Stack size     : 256
          *****************************************************/
          
          #include <mega16.h>
          #include <alcd.h>
          #include <string.h>
          #include <stdio.h>
          #include <delay.h>
          char a=0;
          char flag,flag1;
          char count=1;
          char m[32];
          char b[9];
          char direct1[20];
          char second=0,minute=0,hour=0;
          char anemometer();
          char temperature();
          char humidity();
          void RTC();
          char speed;
          char enter=13;
          char q=34;
          char del[8]="DEl ALL";
          char tel[12]="09120000000";
          char cz=26;
          #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;
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
            {
            rx_buffer[rx_wr_index++]=data;
             if(a==2)
              {
              if(data=='>')
                a=3;
              }
          #if RX_BUFFER_SIZE == 256
            // special case for receiver buffer size=256
            if (++rx_counter == 0)
             {
          #else
            if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
            if (++rx_counter == RX_BUFFER_SIZE)
             {
             rx_counter=0;
          #endif
             rx_buffer_overflow=1;
             }
            }
          }
          
          #ifndef _DEBUG_TERMINAL_IO_
          // Get a character from the USART Receiver buffer
          #define _ALTERNATE_GETCHAR_
          #pragma used+
          char getchar(void)
          {
          char data;
          while (rx_counter==0);
          data=rx_buffer[rx_rd_index++];
          #if RX_BUFFER_SIZE != 256
          if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
          #endif
          #asm("cli")
          --rx_counter;
          #asm("sei")
          return data;
          }
          #pragma used-
          #endif
          
          // Standard Input/Output functions
          #include <stdio.h>
          
          // Timer2 overflow interrupt service routine
          interrupt [TIM2_OVF] void timer2_ovf_isr(void)
          {
          second++;
          
          }
          
          #define ADC_VREF_TYPE 0x60
          
          // Read the 8 most significant bits
          // of the AD conversion result
          unsigned char read_adc(unsigned char adc_input)
          {
          ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
          // Delay needed for the stabilization of the ADC input voltage
          delay_us(10);
          // Start the AD conversion
          ADCSRA|=0x40;
          // Wait for the AD conversion to complete
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          return ADCH;
          }
          
          // 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=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTD=0x00;
          DDRD=0x40;
          
          // Timer/Counter 0 initialization
          // Clock source: T0 pin Rising Edge
          // Mode: Normal top=0xFF
          // OC0 output: Disconnected
          TCCR0=0x07;
          TCNT0=0x00;
          OCR0=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: TOSC1 pin
          // Clock value: PCK2/128
          // Mode: Normal top=0xFF
          // 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=0x98;
          UCSRC=0x86;
          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: 691.200 kHz
          // ADC Voltage Reference: AVCC pin
          // ADC Auto Trigger Source: ADC Stopped
          // Only the 8 most significant bits of
          // the AD conversion result are used
          ADMUX=ADC_VREF_TYPE & 0xff;
          ADCSRA=0x84;
          
          // SPI initialization
          // SPI disabled
          SPCR=0x00;
          
          // TWI initialization
          // TWI disabled
          TWCR=0x00;
          
          // Alphanumeric LCD initialization
          // Connections specified in the
          // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
          // RS - PORTC Bit 5
          // RD - PORTC Bit 4
          // EN - PORTC Bit 3
          // D4 - PORTC Bit 2
          // D5 - PORTC Bit 1
          // D6 - PORTC Bit 0
          // D7 - PORTD Bit 7
          // Characters/line: 16
          lcd_init(16);
          
          // Global enable interrupts
          #asm("sei")
          printf("at+cmgf=1%1c",enter);
          printf("at+cmgda=%1c%s%1c%1c",q,del,q,enter);
          while (1)
             {
             RTC();
             PORTD.6=1; 
             b[1]=PINB.1;
             b[2]=PINB.2;
             b[3]=PINB.3;
             b[4]=PINB.4;
             b[5]=PINB.5;
             b[6]=PINB.6;
             b[7]=PINB.7;
             b[8]=PIND.2;     
          
             if(b[1]==1)
              strcpy(direct1,"North");
             else if(b[2]==1)
                strcpy(direct1,"East");
             else if(b[3]==1)
                strcpy(direct1,"Northeast");
             else if(b[4]==1)
                strcpy(direct1,"Southeast");
             else if(b[5]==1)
                strcpy(direct1,"East");
             else if(b[6]==1)
                strcpy(direct1,"Northeast");
             else if(b[7]==1)
                strcpy(direct1,"Southeast");
             else if(b[8]==1)
                strcpy(direct1,"Southeast");
             else
              strcpy(direct1,"undefined");
             lcd_clear();
             sprintf(m,"C=%dT=%dH=%ds=%d\n%d:%d a%d ",TCNT0,temperature(),humidity(),anemometer(),second,minute,a);
             lcd_puts(m); 
             lcd_puts(direct1); 
             if(minute!=1*count)
              flag1=0;
             if(minute==1*count && flag1!=1)
              {
              flag1=1;
              count++;
              a=1;
              } 
              
              
              if(a==1)
              {
              printf("at+cmgs=%1c%s%1c%1c",q,tel,q,enter);
              a=2;
              }
              
              if(a==3)
              {
              printf("Ba salam\rTemperature=%d\rHumidity=%d\rWind Direction=%s\rWind Speed=%d%1c%1c",temperature(),humidity(),direct1,anemometer(),cz,enter);
              a=0;
              }
          
             }
          }
          char anemometer()
            { 
             if(second!=15)
              flag=0;
            if(second==15 && flag!=1)
              {
              speed=(TCNT0)/3;    //********************************
              //delay_ms(70);
              flag=1;
              TCNT0=0;
              }
            return speed;  
            }
          char humidity()
            {
            char humid;
            humid=(read_adc(0))*0.944;
            return humid;
            }
          char temperature()
            {
            char temp;
            temp=((read_adc(1))*18)/13;
            return temp;
            }
          void RTC()
          {  
            //char j[16];
            if(second==60)
              {
                minute++;
                second=0;
              }  
             if(minute==60)
              {
                hour++;
                minute=0;
                second=0;
              }
          }

          دیدگاه


            #20
            پاسخ : مشکل در ارسال SMS با SIM900

            دوستان من مشکلم حل شد! مشکل یه راه حل ساده داشت!
            at رو باید AT می نوشتم!!
            جالبه که بدونید من قبلا با at جواب می گرفتم!
            این موضوع رو با تست کامپیوتر(پورت سریال) - ماژول فهمیدم! وقتی شماره رو برای ماژول می فرستی باید ماژول < را برای شما بفرستد!
            امیدوارم یه روز به کار کسی بیاد!

            دیدگاه

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