Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega128 C] Program do wysyłania SMSa (SL45).

maly_misiak 26 Sty 2006 20:27 2692 0
  • #1 26 Sty 2006 20:27
    maly_misiak
    Poziom 10  

    Witajcie

    Znalazłem program taki jak poniżej. Chciałbym go przerobić w taki sposób aby móc go zastosować na SL45i i przy wykorzystaniu Atmega128. Kochani powiedzcie laikowi jak....

    Wymienione biblioteki posiadam: siemens35.h, eeprom8252.h

    Mam także pytania:
    1. Dodam, że nieinteresuje mnie wykorzystywanie jako alarmu zatem co usunąć?
    2. Oraz w jaki sposób mogę sprawdzić czy ten program rzeczywiście działa (nieposiadam jeszcze procesorka)?
    3. W czym kompilować?

    Oto listing:

    Code:
    /*************************************************
    
     Alarm z powiadomieniem przez SMS oraz wyłączany
     przez odbiór identyfikacji osoby dzwoniącej CLIP
     
     UWAGA: przystosowany do pracy z telefonami
     GSM firmy SIEMENS M/S/C35
     *************************************************/

    #pragma DEFJ(TIM1_INIT=0xFD)      //Timer 1 jako zegar UART (19200,n,8,1)
                                     //wartość TH1 = 0xFD dla 11,0592MHz
    #pragma SMALL                     //wybór modelu pamięci

    #include <stdio.h>               //funkcje wejścia - wyjścia
    #include <string.h>               //operacje na łańcuchach
    #include <siemens35.h>            //biblioteka obsługi SIEMENS35
    #include <reg8252.h>               //definicje rejestrów AT89S8252
    #include <eeprom8252.h>            //biblioteka funkcji obsługi pamięci eeprom AT89S8252

    //definicje stałych
    #define OFF       0
    #define ON         1
    #define ACTIVE      0x0F
    #define DISACTIVE   0xF0
    #define time2on   8               //czas opóźnienia do załączenia alarmu
    #define alarmtime   60               //przybliżony czas załączenia alarmu w sekundach

    //definicja zewnętrzna komunikatu wysyłanego przez program
    extern code char TEKSTPOWIADOMIENIA[];
    //definicja zewnętrzna "telefonu supervisora"
    extern code char SPHONE[];

    //bity załączające układy wykonawcze
    sbit RELAY_1 = P3^5;
    sbit RELAY_2 = P3^4;
    sbit BUZZER = P1^4;
    sbit NIBBLE = P3^2;

    //zmienna określająca tryb pracy alarmu
    data BYTE INWATCHMODE;
    //zmienna zawierająca stan czujników




    data BYTE SENSORS;
    //licznik czasu opóźnienia
    data BYTE DELAYTIME;
    //bit znacznika ustawiany przez uprawniony do wyłączenia alarmu telefon; należy załączyć identyfikację
    //osoby dzwoniącej-jeśli alarm odbierze ten telefon, to zostanie wyłączony;bit ustawiany w obsłudze przerwania
    bit NOPHONE = 1;
    //bufor odbioru dla UART
    at 0x0400 xdata BYTE RBUF[256];
    //indeks bufora odbioru
    data BYTE RECVD = 0;
    //licznik odebranych znaków nowej linii (0x0A)
    data BYTE OxOA_CNT = 0;
    //numer odczytany z pamięci telefonu
    data BYTE READPHONE[13];


    //procedura obsługi przerwania UART
    void UART_Isr() interrupt 4 using 2
    {
       BYTE temp;
       
       if (RI != 0)                           //fragment kodu wykonywany, gdy ustawiona jest
       {                                       //flaga odbioru
          RI = 0;
          temp = SBUF;
          if (temp > 0x0D) RBUF[RECVD++] = temp;
          if (temp == 0x0A) OxOA_CNT++;
       }
    }


    //sygnalizacja błędu przy pomocy LED: 2 krótkie błyski+0,5s przerwy
    void comunicationerror()
    {
       while(1)
       {
          SCK = 0; delay(80);
          SCK = 1; delay(150);
          SCK = 0; delay(80);
          SCK = 1; delay(500);
       }
    }


    //sprawdzenie numeru dzwoniącego telefonu, dane pobierane z bufora UART
    bit checknumber()
    {
       data BYTE T[13];
       signed char compresult;
       
       EA = 0;                                 //blokowanie przerwań
    //-----------------------------------------------------------------------------------------------------------------
       strncpy(&SPHONE, &READPHONE, 10);      //kopiowanie numeru uprawnionego z ROM do zmiennej w RAM;
                                              //UWAGA:może być zastąpione przez odczyt numeru zapamiętanego na przykład
                                              //na pozycji 1 SMS w pamięci telefonu czy karty SIM!
    //-----------------------------------------------------------------------------------------------------------------
       RECVD = 0;                              //wyszukanie "G" i ustawienie indeksu na "G" + 8 (CR-LF zostały pominięte)
       while ((RBUF[RECVD] != 'G') && (RECVD < 256)) RECVD++;
       if (RECVD < 256)                        //jeśli brak znaku "G" - wyjście z funkcji
       {
          disconnect();                        //połączenie sprawdzone,rozłączenie
          strncpy(&T, &RBUF, 10);               //uformowanie łańcucha do porównań
          compresult = strcmp(&T, &READPHONE);//porównanie tekstów numeru z ROM z numerem telefonu dzwoniącego
                                              //funkcja zwraca wartość "0", jeśli numery są zgodne
       }
       RECVD = OxOA_CNT = 0;                  //zerowanie licznika i indeksu
       EA = 1;                                 //załączenie przerwań
       return(compresult == 0);
    }


    //obsługa załączenia alarmu
    void alarmon()
    {
       BYTE i;
       
       DELAYTIME = alarmtime;                  //licznik czasu załączenia alarmu
       RELAY_1= ON;                            //załączenie przekaźnika RL1
       SCK = 0;                                 //załączenie diody LED
       NOPHONE = 1;
       sendsms(TEKSTPOWIADOMIENIA);
       while ((DELAYTIME--)&& NOPHONE)         //w tej pętli program oczekuje na wyłączenie w postaci przekroczenia czasu
       {                                       //przewidzianego dla alarmu lub wyłączenie na skutek odebrania "uprawnionego"
                                              //telefonu (numer jest wpisany do pamięci telefonu - modemu GSM)
          RELAY_2 = ON;                        //ten przekaźnik będzie pracował "pulsacyjnie"
          delay(2000);                        //będzie załączany na 2s. w odstępie 1s.
          RELAY_2 = OFF;
          delay(1000);
          if (OxOA_CNT == 4) NOPHONE = checknumber();
       }
       if (NOPHONE == 0)                      //jeśli wyłączono alarm "normalnie",wyłączenie trybu czuwania
       {                                       //oraz wyłączenie przerwań
          INWATCHMODE = DISACTIVE;
          EA = 0;
       }
    }


    //odczyt wejść czujników alarmowych (stan zwracany w SENSORS,aktywna 1)
    void readsensors()
    {
       BYTE r1;
       
       NIBBLE = 0;                              //odczyt połówki umownie uznanej za starszą
       SENSORS = (P1 << 4) & 0xF0;
       NIBBLE = 1;                              //odczyt połówki umownie uznanej za młodszą
       r1 = P1;
       r1 &= 0x0F;
       SENSORS |= r1;                           //sumowanie obu połówek
       SENSORS = ~SENSORS;                     //teraz "1" jest stanem aktywnym, podczas gdy zadziałanie czujki wymusza "0"
    }


    //program główny
    void main()
    {
       WMCON |= 0x02;                           //zerowanie timer'a watchdog
       WMCON &= 0xFE;                           //zatrzymanie watchdog'a, jeśli uK został zrestartowany
       SCK = 0;                                 //załączenie LED
       delay(1000);                           //czas na stabilizację warunków pracy
       PCON |= 0x80;                           //ustawienie bitu prescalera zegara transmisji

       RELAY_1 = RELAY_2 = BUZZER = OFF;      //warunki początkowe pracy przekaźników
       REN = ES =1;                           //zezwolenie na pracę odbiornika UART i na przyjmowanie przerwań od UART
       
       INWATCHMODE = ee_getbyte(0);             //status alarmu pobierany z eeprom,np.po restarcie watchdog,wyłączeniu
                                              //zasilania i temu podobnych sytuacjach
       if (INWATCHMODE == 0xFF)               //inicjalizacja,jeśli pamięć eeprom nie była używana (pierwsze załączenie)
       {
          ee_savebyte(DISACTIVE, 0);
          INWATCHMODE = DISACTIVE;
       }

       if (!initgsm())                        //funkcja zwraca wartość TRUE, jeśli inicjalizacja telefonu jest OK
                                              //jeśli błąd komunikacji z telefonem,to jest on sygnalizowany przez
          comunicationerror();                  //szybkie mruganie LED

    //------------------ GŁÓWNA PĘTLA PROGRAMU ------------------
       while (1)
       {
    loopbegin:
          if (INWATCHMODE == ACTIVE)
          {
             EA = 1;                           //załączenie przerwań dla odbioru ew.sygnału dzwonienia
             if (OxOA_CNT == 4) NOPHONE = checknumber();   //odebrano identyfikację CLIP
             if (NOPHONE == 0)                  //jeśli funkcja sprawdziła,że to uprawniony telefon,to wyłączenie alarmu
             {
                INWATCHMODE = DISACTIVE;      //wyłączenie trybu czuwania
                EA = 0;                        //wyłączenie przerwań
                SCK = 1;                        //wyłączenie diody LED
                goto loopbegin;               //powrót na początek pętli
             }
             SCK = 0;                           //załączenie diody LED
             readsensors();                     //odczyt czujników,wartość odczytu w zmiennej SENSORS
             delay(100);                       //aktywnemu czujnikowi odpowiada stan logiczny "1" mimo,iż
             SCK = 1;                           //transoptor w przypadku załączenia czujnika daje "0"
             delay(400);
             if (SENSORS != 0)                  //jeśli zmienna ma wartość <>0,to aktywna jest któraś czujka
             {                                 //następuje wyzerowanie watchdoga - w ten sposób zyskuję 2sekundy -
                delay(100);                     //ponowny odczyt dla upewnienia się
                readsensors();
                if (SENSORS != 0)
                {
                   DELAYTIME--;               //równe "time2on x 1,5s."
                   delay(1000);
                   if (DELAYTIME == 0) alarmon();   //jeśli przekroczono czas opóźnienia,to załączenie alarmu
                }
             }
                else DELAYTIME = time2on;
          }
             else
          {
             SCK = 1;                           //wyłączenie diody LED
             readsensors();                     //odczyt czujników,interesuje nas bit połączony z X2
             if (SENSORS == 0x08)               //jeśli bit jest ustawiony, to ponowny odczyt dla
             {                                 //upewnienia się, ale po czasie 500ms dla eliminacji zakłóceń
                delay(500);
                readsensors();
                if (SENSORS == 0x01)          //jeśli bit nadal ustawiony, to opóźnienie na "ucieczkę" i załączenie
                {                              //trybu czuwania (INWATCHMODE=ACTIVE)
                                              //pętla opóźnienia o czasie trwania ok. time2on x 2sekundy
                   for (RECVD = time2on; RECVD > 0; RECVD--)
                   {
                      SCK = 0;                  //załączenie diody LED
                      delay(1000);            //opóźnienie 1 sekunda
                      SCK = 1;                  //wyłączenie diody LED
                      delay(1000);            //opóźnienie 1 sekunda
                   }
                   INWATCHMODE = ACTIVE;      //załączenie trybu czuwania
                }
             }
          }
       }
    }
    Moderowany przez Light-I:

    3. W temacie wiadomości należy dokładnie zawrzeć całą istotę wysyłanych informacji. Gwarantuje to łatwe wyszukiwanie i czytelne przeglądanie przez osoby zainteresowane. Nie akceptujemy tematów w stylu "pomoc", "problem"
    Regulamin www.elektroda.pl znajduje się Tutaj.Bardzo proszę o logiczne i zgodne z regulaminem tytułowanie tematu. Nadużywasz słowa 'pomoc' - nie jesteś ważniejszym od innych użytkownikiem forum, każdy, kto tu zakłada nowy temat, ma z czymś istotny problem... A "pilne", "ważne", "pomoc", "Pomocy!!!", "Help!!!" działa raczej odwrotnie od twoich zamiarów - odstrasza bardziej zaawansowanych użytkowników od czytania... . Wyróżnianie tematu jest możliwe przez odpowiednie spożytkowanie punktów na tym forum. Treść tematu zmieniono na bardziej adekwatną. Kod ujęto w tagi "code".

    0 0