DIY GSM Phone with open source code

- [SIZE=-1]DIY mobile phone[/SIZE] [SIZE=-1]with full-format telephone keyboard powered from [/SIZE][SIZE=-1]AAA batteries. Open source code, free schematic.
[/SIZE]

Replies

  • Kaustubh Katdare
    Kaustubh Katdare
    Why not share it all here if it's open source? Removing the link.
  • ecoo
    ecoo
    The_Big_K
    Why not share it all here if it's open source?
    OK, you right, but I see "You may not post attachments" in my "Posting Permissions"
  • Kaustubh Katdare
    Kaustubh Katdare
    Yeah, you'll need 10+ posts for attachments. Share the code, through post, if you can πŸ˜€
  • ecoo
    ecoo
    The_Big_K
    Share the code, through post, if you can πŸ˜€
    OK. Code for IAR EW compilator, ATmega8 processor. Attention: tab = 3; russian comments.

    // ProtoPhone Mod01 Mammoth, DIY GSM Phone with open source code.
    // protoboardfab.com 
    // ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС GSM-Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° ProtoPhone Mod01 Mammoth
    // ВСрсия 0.1 ΠΎΡ‚ 23 мая 2011
    // Tab = 3 символа
    #include "iom8.h"                                // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… рСгистров
    #include "inavr.h"                            // Intrinsic-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    #include "ctype.h"                            // ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с символами
    #include "string.h"                            // ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками
    
    #define bit(n)            (1 << (n))            // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π±ΠΈΡ‚Π°ΠΌΠΈ
    #define setbit(p,n)    (p|=bit(n))            // Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚
    #define clrbit(p,n)    (p&=~bit(n))        // Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π±ΠΈΡ‚
    
    #define MASTERCLOCK 7372800                                            // Вактовая частота процСссора Π² Π“Ρ†
    #define delay_us(c) __delay_cycles(MASTERCLOCK/1000000*c)    // ΠœΠΈΠΊΡ€ΠΎΡΠ΅ΠΊΡƒΠ½Π΄Π½Π°Ρ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°. c max = 268435455
    #define delay_ms(c) __delay_cycles(MASTERCLOCK/1000*c)        // ΠœΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡƒΠ½Π΄Π½Π°Ρ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°. c max = 268435
    
    // ΠŸΠΎΡ€Ρ‚ B
    #define PWRKEY        1            // Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GSM модуля
    #define ENA            2            // Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ питания GSM-модуля
    #define MOSI        3            // Линия MOSI SPI-интСрфСйса
    #define MISO        4            // Линия MISO SPI-интСрфСйса
    #define SCK            5            // Линия SCK SPI-интСрфСйса
    // ΠŸΠΎΡ€Ρ‚ C
    #define COL2        0            // Колонка 2 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define COL1        1            // Колонка 1 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define BUZZ        2            // Π’Ρ‹Π·Ρ‹Π²Π½ΠΎΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊ
    #define H_P            3            // Π‘Π²Π΅Ρ‚ΠΎΠ΄ΠΈΠΎΠ΄ "ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅"
    #define H_C            4            // Π‘Π²Π΅Ρ‚ΠΎΠ΄ΠΈΠΎΠ΄ "Π—Π²ΠΎΠ½ΠΎΠΊ"
    #define H_SL        5            // Π‘Π²Π΅Ρ‚ΠΎΠ΄ΠΈΠΎΠ΄ "Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ сигнала"
    #define RST            6            // Бброс
    // ΠŸΠΎΡ€Ρ‚ D
    #define TXD            0            // Π’Ρ‹Ρ…ΠΎΠ΄ UART GSM-модуля, Π²Ρ…ΠΎΠ΄ UART ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°
    #define RXD            1            // Π’Ρ…ΠΎΠ΄ UART GSM-модуля, Π²Ρ‹Ρ…ΠΎΠ΄ UART ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°
    #define ROW1        2            // Π‘Ρ‚Ρ€ΠΎΠΊΠ° 1 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define ROW2        3            // Π‘Ρ‚Ρ€ΠΎΠΊΠ° 2 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define COL3        4            // Колонка 3 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define ROW5        5            // Π‘Ρ‚Ρ€ΠΎΠΊΠ° 5 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define ROW4        6            // Π‘Ρ‚Ρ€ΠΎΠΊΠ° 4 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define ROW3        7            // Π‘Ρ‚Ρ€ΠΎΠΊΠ° 3 опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    #define ROWMASK    0xEC        // = 11101100b
    
    void PortInit(void)            // Активация ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°
    {
        DDRB = (1<>8);            // Π—Π°Π΄Π°Π΅ΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ
        UBRRL = (unsigned char) (MYUBRR);
    }// UARTinit
    
    int putchar(int data)                            // Π’Ρ‹Π²ΠΎΠ΄ Π±Π°ΠΉΡ‚Π° Π² UART
    {
        while ( !( UCSRA & DATA_REGISTER_EMPTY));
        UDR = data;
        while ( !( UCSRA & DATA_REGISTER_EMPTY));
    
        return data;
    }//putchar
    
    void OutText (char *text)        // Π’Ρ‹Π²ΠΎΠ΄ тСкста Π² UART
    {
        while (*text) putchar ( *text++ );
    }//OutText
    
    void OutDat (unsigned long int val, unsigned char len, unsigned char Const) // Π’Ρ‹Π²ΠΎΠ΄ числа Π² UART
    {
        unsigned char Str[16];        // Максимальная Π΄Π»ΠΈΠ½Π° числа (Π² ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅)
        unsigned char k = 0;
        
        for(k = 0; k < len; k++)    // ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ число Π² строку
        {
            *(Str + (len-k-1)) = (val%Const) + '0';
            
            if(*(Str+(len-k-1))>'9')
                *(Str+(len-k-1)) += 'A'-'0'-10;
            val /= Const;
        }
        
        Str[len] = 0;                    // ΠŸΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ число
        k = 0;
        while(Str[k] != 0)
            putchar(Str[k++]);
    }//OutDat
    
    #pragma vector = USART_RXC_vect                // ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Ρƒ Π±Π°ΠΉΡ‚Π° Π² UART
    __interrupt void USART_RXC_Interrupt(void)
    {
        char InData = UDR;                            // Π”Π°Π½Π½Ρ‹Π΅ ΠΈΠ· UDR Π½Π°Π΄ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π°ΠΌ Π½Π΅ пригодятся
        if (InData > 20)                                // ΠžΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Π΅ΠΌ слуТСбныС символы
        {
            RxBuf[RxBufWrPoint] = InData;            // ЗаписываСм ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ Π² массив RxBuf
            RxBufWrPoint++;
        }
    }//USART_RXC_Interrupt
    
    void ClearRxBuf(void)                            // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° массива RxBuf
    {
        for (unsigned char ClearPoint = 0; ClearPoint < RXBUFLENGTH; RxBuf[ClearPoint++] = 0);
        RxBufWrPoint = 0;
    }//ClearRxBuf
    
    void ClearNumBuf(void)                            // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° массива RxBuf
    {
        for (unsigned char ClearPoint = 0; ClearPoint < NUMBUFLENGTH; NumBuf[ClearPoint++] = 0);
        NumBufWrPoint = 0;
    }//ClearNumBuf
    
    char KeyConvert(char RawKey)                    // ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, считанноС с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π² Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄
    {
        char ConvertedKey = 0;
        
        switch (RawKey)
        {
            case (0xE8): ConvertedKey = 'Y'; break;
            case (0xE4): ConvertedKey = '1'; break;
            case (0x6C): ConvertedKey = '4'; break;
            case (0xAC): ConvertedKey = '7'; break;
            case (0xCC): ConvertedKey = '*'; break;
            case (0xF7): ConvertedKey = 'S'; break;
            case (0xF3): ConvertedKey = '2'; break;
            case (0x7B): ConvertedKey = '5'; break;
            case (0xBB): ConvertedKey = '8'; break;
            case (0xDB): ConvertedKey = '0'; break;
            case (0x06): ConvertedKey = 'N'; break;
            case (0x02): ConvertedKey = '3'; break;
            case (0x8A): ConvertedKey = '6'; break;
            case (0xCA): ConvertedKey = '9'; break;
            case (0xEA): ConvertedKey = '#'; break;
            default: ConvertedKey = 0; break;
        }
        return ConvertedKey;
    }//KeyConvert
    
    char KeyScan(void)    // Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Π’Ρ‹Π΄Π°Π΅Ρ‚ 0, Ссли Π½ΠΈ ΠΎΠ΄Π½Π° клавиша Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π° ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши (ΠΎΡ‚ 1 Π΄ΠΎ 15)
    {
        unsigned char PreKeyCode = 0;
        unsigned char KeyCode = 0;
        #define FIRST_DEBOUNCE_TIME    100
        #define DEBOUNCE_TIME    20
    
        clrbit(PORTC, COL1);    // Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ 1
        setbit(PORTC, COL2);
        setbit(PORTD, COL3);
        delay_ms(DEBOUNCE_TIME);
        PreKeyCode = ROWMASK&PIND;
        delay_ms(DEBOUNCE_TIME);
        KeyCode = ROWMASK&PIND;
        if ((KeyCode == PreKeyCode)&&(KeyCode != ROWMASK))
            return KeyConvert(KeyCode);
    
        setbit(PORTC, COL1);    // Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ 2
        clrbit(PORTC, COL2);
        setbit(PORTD, COL3);
        delay_ms(DEBOUNCE_TIME);
        PreKeyCode = ROWMASK&PIND;
        delay_ms(DEBOUNCE_TIME);
        KeyCode = ROWMASK&PIND;
        if ((KeyCode == PreKeyCode)&&(KeyCode != ROWMASK))
            return KeyConvert(KeyCode + 0x0F);
    
        setbit(PORTC, COL1);    // Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ 3
        setbit(PORTC, COL2);
        clrbit(PORTD, COL3);
        delay_ms(DEBOUNCE_TIME);
        PreKeyCode = ROWMASK&PIND;
        delay_ms(DEBOUNCE_TIME);
        KeyCode = ROWMASK&PIND;
        if ((KeyCode == PreKeyCode)&&(KeyCode != ROWMASK))
            return KeyConvert(KeyCode + 0x1E);
    
        setbit(PORTC, COL1);    // ΠšΠΎΠ½Π΅Ρ† сканирования
        setbit(PORTC, COL2);
        setbit(PORTD, COL3);
        return 0;
    }//KeyScan
    
    void GSM_On(void)            // Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GSM-модуля
    {
        setbit(PORTB, PWRKEY);
        delay_ms(3000);
        clrbit(PORTB, PWRKEY);
        delay_ms(8000);
        setbit(PORTB, PWRKEY);
        delay_ms(8000);    
    }//GSM_On
    
    void Beep(void)            // ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ сигнал
    {
        setbit(PORTC, H_C);
        setbit(PORTC, BUZZ);
        delay_ms(10);
        if ((GSMStatus != 2) && (GSMStatus != 3))        // Если ΠΈΠ΄Π΅Ρ‚ входящий ΠΈΠ»ΠΈ исходящий Π·Π²ΠΎΠ½ΠΎΠΊ, свСтодиод "Call" Π³Π°ΡΠΈΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ
            clrbit(PORTC, H_C);
        clrbit(PORTC, BUZZ);
        delay_ms(20);
    }//Beep
    
    void LongBeep(void)        // Π—Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ сигнал ΠΏΠΎΠ΄Π»ΠΈΠ½Π½Π΅Π΅
    {
        setbit(PORTC, H_C);
        setbit(PORTC, BUZZ);
        delay_ms(15);
        if ((GSMStatus != 2) && (GSMStatus != 3))        // Если ΠΈΠ΄Π΅Ρ‚ входящий ΠΈΠ»ΠΈ исходящий Π·Π²ΠΎΠ½ΠΎΠΊ, свСтодиод "Call" Π³Π°ΡΠΈΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ
            clrbit(PORTC, H_C);
        clrbit(PORTC, BUZZ);
        delay_ms(100);
    }//LongBeep
    
    void IncomingCallBeep(void)    // Π”Π»ΠΈΠ½Π½Ρ‹ΠΉ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ сигнал
    {
        setbit(PORTC, H_C);
        setbit(PORTC, BUZZ);
        delay_ms(100);
        if ((GSMStatus != 2) && (GSMStatus != 3))        // Если ΠΈΠ΄Π΅Ρ‚ входящий ΠΈΠ»ΠΈ исходящий Π·Π²ΠΎΠ½ΠΎΠΊ, свСтодиод "Call" Π³Π°ΡΠΈΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ
            clrbit(PORTC, H_C);
        clrbit(PORTC, BUZZ);
        delay_ms(100);
    }//IncomingCallBeep
    
    unsigned int PowerFlashOrder = 0xAAAA;            // = 1010101010101010b
    unsigned int SignalLevelFlashOrder = 0x0000;
    
    void TimerInit(void)                        // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°
    {
        TCCR0 = (1<>15);
            if(PowerFlashOrder&0x0001)    // ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ свСчСния свСтодиода "Power"
                setbit(PORTC, H_P);
            else
                clrbit(PORTC, H_P);
    
            SignalLevelFlashOrder = (SignalLevelFlashOrder<<1)|(SignalLevelFlashOrder>>15);
            if(SignalLevelFlashOrder&0x0001)    // ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ свСчСния свСтодиода "Signsl level"
                setbit(PORTC, H_SL);
            else
                clrbit(PORTC, H_SL);
            
            if ((TimerCounter%0x5000)==0)        // ΠŸΠΎΡ€Π° вновь ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сигнала
            {
                SignalLevelObsolete = 1;
            }
        }
    }//TIMER0_OVF_Interrupt
    
    int StrToInt (char* InputStr)                    // ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ строку Π² число Ρ‚ΠΈΠΏΠ° int. ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†ΠΈΡ„Ρ€Ρ‹
    {
        int ReturnValue = 0;
        unsigned char StrCount = 0;
    
        for (; StrCount <= strlen(InputStr); StrCount++)
            if (isdigit(InputStr[StrCount]))
                ReturnValue = 10*ReturnValue + (InputStr[StrCount] - 48);
    
        return ReturnValue;
    }//StrToInt
    
    void SignalLevelDefinition(void)
    {
        ClearRxBuf();                        // ΠŸΠ΅Ρ€Π΅Π΄ AT+CSQ
        OutText("AT+CSQ\n\r");            // Запрос уровня сигнала сотовой сСти
        delay_ms(300);
        OutText(RxBuf);OutText("\n\r");
        strtok(RxBuf, ",");                // ΠžΡ‚ΡΠ΅ΠΊΠ°Π΅ΠΌ bit error rate , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ΄Π΅Ρ‚ послС запятой
        GSMSigStrength = StrToInt(RxBuf);
        if (GSMSigStrength >= 25)        // ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
            GSMSigStrength = 5;
        else
        {
            GSMSigStrength /= 5;
            if (GSMSigStrength == 0) GSMSigStrength = 1;    // Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΡ€Π³Π½ΡƒΡ‚ΡŒ хотя Π±Ρ‹ Ρ€Π°Π· ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Ρ‡Ρ‚ΠΎ GSM-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π²ΠΈΠ΄ΠΈΡ‚ ΡΠ΅Ρ‚ΡŒ
        }
        if (GSMSigStrength == 99)                                //    ΠΠ΅Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, скорСС всСго, 99 - "Not known or not detectable"
            GSMSigStrength = 0;
    
        switch (GSMSigStrength)
        {// ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ свСчСния свСтодиода "Signsl level"
            case 5:     SignalLevelFlashOrder = 0xAA80; break;    // = 1010101010000000b
            case 4:     SignalLevelFlashOrder = 0xAA00; break;    // = 1010101000000000b
            case 3:     SignalLevelFlashOrder = 0xA800; break;    // = 1010100000000000b
            case 2:     SignalLevelFlashOrder = 0xA000; break;    // = 1010000000000000b
            case 1:     SignalLevelFlashOrder = 0x8000; break;    // = 1000000000000000b        
            case 0:     SignalLevelFlashOrder = 0xAAAA; break;    // = 1010101010101010b
            default: break;
        }
    }//SignalLevelDefinition
    
    void main(void)
    {
          PortInit();                    // Активация ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°
        UARTinit();                    // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ UART
        TimerInit();                // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°
        ClearRxBuf();
        
        asm("sei");                    // Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ прСрывания
    
        setbit(PORTC, H_P);        // ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π°Π½ΠΎ
        delay_ms(300);
        Beep();
        delay_ms(300);
        Beep();
        delay_ms(1000);
    
        setbit(PORTB, ENA);        // Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ GSM модуля
        delay_ms(1000);
        
        while (GSMStatus == 0)
        {
            GSM_On();                            // Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ GSM ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
            ClearRxBuf();
            OutText("AT+IPR=115200\n\r");    // УстанавливаСм Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ связи
            delay_ms(300);
            OutText("ATE0\n\r");                // ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ эхо Π² UART
            delay_ms(300);
            OutText("AT+CHFA=0\n\r");        // Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π°ΡƒΠ΄ΠΈΠΎΠΊΠ°Π½Π°Π»
            delay_ms(300);
            OutText("AT+CLVL=90\n\r");        // Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ усилСния Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°
            delay_ms(300);
            OutText("AT+CMIC=0,7\n\r");    // Π§ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΡ„ΠΎΠ½Π°
            delay_ms(300);
            
            if ((strstr(RxBuf, "OK") != NULL)    && (strstr(RxBuf, "ERROR") == NULL))    // Если GSM-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π²Ρ‹Π΄Π°Π» ошибки ΠΈ Π²Ρ‹Π΄Π°Π» OK...
                GSMStatus = 1;
            ClearRxBuf();
        }
    
        LongBeep(); LongBeep(); LongBeep();
        SignalLevelDefinition();
        PowerFlashOrder = 0xFFFF;            // = 1111111111111111b, Ρ‚. Π΅. свСтодиод "Power" Π³ΠΎΡ€ΠΈΡ‚ постоянно
        
        delay_ms(FIRST_DEBOUNCE_TIME);    // Для устаканивания ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½Ρ‹Ρ… процСссов послС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ питания, ΠΌΠΎΠ³ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ»Π΅Π·Ρ‚ΡŒ Π½Π° Π²Ρ…ΠΎΠ΄Ρ‹ сканирования ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    
        char Key = 0;
        char OldKey = 0;
    
       while (1)
       {
            if (SignalLevelObsolete == 1)
            {
                SignalLevelDefinition();
                SignalLevelObsolete = 0;
            }
        
            if (strstr(RxBuf, "RING") != NULL)
            {
                IncomingCallBeep();
                IncomingCallBeep();
                IncomingCallBeep();
                IncomingCallBeep();
                GSMStatus = 3;
                setbit(PORTC, H_C);
            }
            
            if (strstr(RxBuf, "NO CARRIER") != NULL)
            {
                GSMStatus = 1;
                clrbit(PORTC, H_C);
            }
            
            if (strstr(RxBuf, "BUSY") != NULL)
            {
                GSMStatus = 1;
                clrbit(PORTC, H_C);
            }
            
            ClearRxBuf();
        
            OldKey = Key;
            Key = KeyScan();
            if ((Key != 0) && (Key != OldKey))    // Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ отсканировано ΠΈ Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€, ΠΌΠΎΡ€Π³Π½Π΅ΠΌ Π»Π°ΠΌΠΏΠΎΡ‡ΠΊΠΎΠΉ ΠΈ Π²Ρ‹ΡˆΠ»Π΅ΠΌ ΠΊΠΎΠ΄
            {
                if ((Key != 'Y') && (Key != 'S') && (Key != 'N') && (GSMStatus != 2) && (GSMStatus != 3) && (GSMStatus != 4))    // НаТата цифровая клавиша ΠΈΠ»ΠΈ * ΠΈΠ»ΠΈ # плюс Π²ΠΎ врСмя Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ слуТСбныС клавиши "YES" ΠΈ "NO"
                {
                    NumBuf[NumBufWrPoint] = Key;
                    NumBufWrPoint++;
                    Beep();
                }
            
                if (Key == 'N')                    //    НаТата клавиша "NO"
                {
                    ClearNumBuf();
                    OutText("ATH\n\r");            // ...Ρ‚ΠΎ сбрасываСм Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€
                    clrbit(PORTC, H_C);            // Гасим свСтодиод "Call"
                    GSMStatus = 1;
                    delay_ms(200);
                    LongBeep();
                    LongBeep();
                }
                
                if ((Key == 'Y')&&(GSMStatus == 1))    //    НаТата клавиша "YES"
                {
                    OutText("ATD"); OutText(NumBuf); OutText(";\n\r");    // Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° связь с Π½Π°Π±ΠΈΡ‚Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ
                    ClearNumBuf();
                    delay_ms(200);
                    LongBeep();
                    LongBeep();
                    GSMStatus = 2;
                    setbit(PORTC, H_C);                    // Π—Π°ΠΆΠΈΠ³Π°Π΅ΠΌ свСтодиод "Call"
                }
                if ((Key == 'Y')&&(GSMStatus == 3))    //    НаТата клавиша "YES"
                {
                    OutText("ATA\n\r");
                    ClearNumBuf();
                    GSMStatus = 4;
                    delay_ms(200);
                    LongBeep();
                    LongBeep();
                    setbit(PORTC, H_C);                    // Π—Π°ΠΆΠΈΠ³Π°Π΅ΠΌ свСтодиод "Call"
                }
                
                if ((Key == 'S')&&(GSMStatus == 1))    //    НаТата клавиша "SOS"
                {
                    OutText("ATD89177985198;\n\r");    // Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° связь со слуТбой тСхничСской ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ protoboardfab.com
                    ClearNumBuf();
                    delay_ms(200);
                    LongBeep();
                    LongBeep();
                    GSMStatus = 2;
                    setbit(PORTC, H_C);                                            // Π—Π°ΠΆΠΈΠ³Π°Π΅ΠΌ свСтодиод "Call"
                }
            }
        }//while (1)
    }// main()
    
  • ecoo
    ecoo
    And a little video, if you allow.
    [video=youtube;hJw9nksJCG0]https://www.youtube.com/watch?v=hJw9nksJCG0[/video]

You are reading an archived discussion.

Related Posts

I've heard that Apple has killed ndrv_setspec() integeroverflow in IOS 5 beta which makes the phone more difficult to jailbreak. I've also heard that the IOS 5 beta was jailbroken...
I remember that in one of the projects I worked on as a software engineer, our team always had debates on how to name our UNIX servers. Today's Dilbert comics...
I think Lego has this fantastic product called Mindstorms NXT 3.0 which has all the elements to help you learn, program and build robots from scratch. Here's the link: LEGO.com...
Electronics and Sony are synonymous. Sony has just announced an upgraded version of their alpha series models. The new NEX-C3 has more megapixels for larger and clearer photos and also...