logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wysyłać SMSy za pomocą ATMEGI i siemensa s55?

romedalh 04 Sty 2011 15:51 3582 21
  • #1 8956348
    romedalh
    Poziom 10  
    Witam wszystkich,

    Jestem w trakcie tworzenia projektu stacji pogodowej, która wysyła informacje poprzez SMS z siemensa s55 do mojego telefonu. Schemat elektryczny jest w załączniku.

    Problem w tym, że o ile komunikacja z komputerem PC jest prawidłowa, o tyle telefon nie daje, żadnej odpowiedzi. Telefon jest zasilany z własnej baterii, komunikacja poprzez firmowy kabel RS-232 siemensa. Jak na razie korzystam z wewnętrznego kwarcu 8 MHz.

    Bardzo proszę o pomoc w rozwiązaniu problemu.

    Przesyłam też kod programu(zamiast wysyłania smsów jest tutaj próba dzwonienia, która również nie działa):
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include <stdio.h>
    
    
    #define POWER_SUPPLY 5.1
    #define F_CPU 8000000UL // 1MHz
    #define UART_BAUD 19200UL
    #define _UBBR_ ((F_CPU/(16*UART_BAUD))-1)
    
    
    /*USART*/
    void USART_Init( unsigned int baud_reg)
    {
       UBRRH = (unsigned char)(baud_reg>>8);
       UBRRL = (unsigned char)baud_reg;
       UCSRC = (1<<URSEL)/*|(1<<USBS)*/|(3<<UCSZ0);
       UCSRB = (1<<RXEN)|(1<<TXEN);  
                /* Set frame format: 8data, 2stop bit no parity */
    }
    
    void USART_Transmit( unsigned char data )
    {
       while ( !( UCSRA & (1<<UDRE)) );         /* Wait for empty transmit buffer */
       UDR = data;                           /* Put data into buffer, sends the data */
    }
    
    unsigned char USART_Receive( void )
    {
       while ( !(UCSRA & (1<<RXC)) );            /* Wait for data to be received */
       return UDR;                           /* Get and return received data from buffer */
    }
    
    
    void USART_Flush( void )
    {
    unsigned char dummy;
    while ( UCSRA & (1<<RXC) ) dummy = UDR;
    }
    
    void USART_TransmitString (char *str)
    {
       while ((*str != 0) /*&& (*str != 10)*/) USART_Transmit (*str++);
    }
    
    void USART_ReceiveString (char *str)
    {
    	do
    	{
    		(*str++) = USART_Receive();
    	}while(*str != 0);
    }
    
    /*GŁÓWNA FUNKCJA PROGRAMU*/
    int main(void)
    {
       	USART_Init(_UBBR_);
       	DDRC = 0x03;
       	PORTC = 0xFF;
    	
    	for(i = 0;i<10000;i++)
    		asm volatile ("nop"::);
    
       	if((PINC & 0x04) == 0)//Jeśli zworka jest nałożona
       		{
          	USART_TransmitString("ATD111111111\n");
    
    		}
    } 
    
  • #3 8956826
    romedalh
    Poziom 10  
    Tak sprawdzałem.
    Ogólnie komunikacja układu z PC działa bez problemów tak samo komunikacja PC z komórką. Przestawiłem fuse bity.

    Ogólnie wydaję mi się, że nie działa odbieranie informacji z komórki jednak nie wiem jak to naprawić.
  • #5 8956883
    mirekk36
    Poziom 42  
    No a gdzie w tym kodzie jest oprogramowane odbieranie danych z telefonu czy terminala ?

    Toż ten program to jakieś nieporozumienie ;) nie dość, że wykona się tylko określoną ilość razy i zakończy swoje działanie na amen, to jeszcze non stop wysyła do telefonu jakiś string który tak nawiasem mówiąc wcale nie spowodowałby dzwonienia jeśli zamiast tych jedynek byłby konkretny numer tel.

    A jakby był normalny i prawidłowo zakończony średnikiem to ja osobiście na miejscu telefonu dostałbym chyźla gdyby mi procek 300tys razy w ciągu sekundy non stop przysyłał taki string bez żadnej przerwy. ;) Bo nawet jeśli zworka jest założona na chwilę - to dla procka ta chwila to wieczność i zdąży milion razy wysłać ten string. Totalne nieporozumienie.
  • #6 8959020
    romedalh
    Poziom 10  
    mirekk36 napisał:

    non stop wysyła do telefonu jakiś string


    Program wysyła tylko raz ten string po czym się kończy. Nie ma w nim żadnej pętli sprawiającej że ten string przesyłany jest wiele razy.


    Co do braku odbierania poleceń z terminala to napisałem kolejny program wysyłający komendę AT i czekający na pobranie OK. W terminalu PC działa, a na komórce nie.
    
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include <stdio.h>
    #include "sht.h"
    
    #define POWER_SUPPLY 5.1
    #define F_CPU 8000000UL // 1MHz
    #define UART_BAUD 19200UL
    #define _UBBR_ ((F_CPU/(16*UART_BAUD))-1)
    
    /*USART*/
    void USART_Init( unsigned int baud_reg)
    {
       UBRRH = (unsigned char)(baud_reg>>8);
       UBRRL = (unsigned char)baud_reg;
       UCSRC = (1<<URSEL)/*|(1<<USBS)*/|(3<<UCSZ0);
       UCSRB = (1<<RXEN)|(1<<TXEN);  
                /* Set frame format: 8data, 2stop bit no parity */
    }
    
    void USART_Transmit( unsigned char data )
    {
       while ( !( UCSRA & (1<<UDRE)) );         /* Wait for empty transmit buffer */
       UDR = data;                           /* Put data into buffer, sends the data */
    }
    
    unsigned char USART_Receive( void )
    {
       while ( !(UCSRA & (1<<RXC)) );            /* Wait for data to be received */
       return UDR;                           /* Get and return received data from buffer */
    }
    void USART_Flush( void )
    {
    unsigned char dummy;
    while ( UCSRA & (1<<RXC) ) dummy = UDR;
    }
    
    void USART_TransmitString (char *str)
    {
       while ((*str != 0) /*&& (*str != 10)*/) USART_Transmit (*str++);
    }
    
    int main(void)
    {
            char buff[7];
    	int i = 0;
    	int j = 0;
    	/*INICJALIZACJE USARTA*/
       	USART_Init(_UBBR_);
       	DDRC = 0x03;
       	PORTC = 0xFF;
       	if((PINC & 0x04) == 0)//Jeśli zworka jest nałożona
       		{
          	        USART_TransmitString("AT");
    		USART_Transmit(0x0D);
    		PORTC  &= ~(1 << 1);//zero na PIN nr 1 portu C
    		for(j = 0;i<10000;i++)
    			asm volatile ("nop"::);
    		for(i = 0; i<2;i++)
    			buff[i] = USART_Receive();
    			for(j = 0;i<10000;i++)
    				asm volatile ("nop"::);
    		if(strncmp("OK",buff,2) == 0)
    			{
    			         PORTC  &= ~(1 << 0);
    			}
    
    		}
    };
    
  • #7 8959080
    mirekk36
    Poziom 42  
    Poprzedni kod wysyłał setki razy ten string a nie jeden raz - o jakiej ty pętli sprawdzającej mówisz? - gdy zworka była naciśnięta to w tej twojej pętli był on wysyłany wielokrotnie aż do jej skończenia.

    Albo z uwagi na bliżej nie określony czas trwania tych twoich pętli mógł być w ogóle nie wysłany.

    Nie znasz pan takich poleceń w AVR GCC jak: _delau_ms() , które tu by się przydały ???? zamiast tych dziwacznych pętli z rozkazem NOP w środku ???

    A jeśli już chcesz coś odebrać po wysłaniu z telefonu to wstawienie w tym czasie pętli opóźniającej to już jakaś masakra? jak to się ma do terminala na PC bo piszesz że tam ci działa. Tam działa bo terminal jest normalnie oprogramowany a tutaj niestety masz MISZ-MASZ na maxa :(

    Mógłbyś sobie pozwolić na pętlę czy jakieś opóźnienie po wysłaniu AT ale jeśli odbiór z RS232 miałbyś zrobiony jak się należy na przerwaniach. Tymczasem ty czekasz sobie ileś tam (nie wiadomo ile) czasu a potem łaskawi chcesz odebrać OK i to jeszcze znowu wkrzaczając tam kolejną dziką pętlę z NOP (No już inaczej tych pętli to nie można nazwać)

    Już lepiej by było jakbyś w pętli od razu po wysłaniu oczekiwał znaków z na USART - toż spójrz na kod swojej funkcji USART_Receive - tam masz oczekiwanie na znak - a ty jeszcze dowalasz jakieś swoje pętlo-logie.
  • #8 8959213
    romedalh
    Poziom 10  
    Nie sprawdzającej a sprawiającej :). Nie znałem funkcji delay_ms - od tej pory będę jej używał.
    Odchudziłem trochę ten program wyrzuciłem niepotrzebne i bezsensowne rzeczy jednak dalej zero odzewu z komórki.
    
    int main(void)
    {
    	int i = 0;
    	/*INICJALIZACJE USARTA*/
       	USART_Init(_UBBR_);
       	DDRC = 0x03;
       	PORTC = 0xFF;
    	_delay_ms(10);
          	USART_TransmitString("AT");
    	USART_Transmit(0x0D);
    	PORTC  &= ~(1 << 1);//zero na PIN nr 1 portu C
    	for(i = 0; i<2;i++)
    	        buff[i] = USART_Receive();
    	if(strncmp("OK",buff,2) == 0)
    	{
    		PORTC  &= ~(1 << 0);//zero na PIN nr 1 portu C
    	}
    
    };
    
  • #9 8959241
    mirekk36
    Poziom 42  
    No tylko nie nadużywaj tej funkcji _delay_ms() ;)

    A program odchudź jeszcze bardziej - po co ty na tym etapie gdzie ci nic na razie nie działa sprawdzasz jeszcze czy przyleciało "OK" ??? toż poza samym OK jeśli już coś przylatuje to na pewno przed nim i po nim przylatują znaki ENTER. eeeeh jak tak można utrudniać sobie życie? ;) .... weź na początek sprawdzaj czy w ogóle coś przylatuje z komórki - jakikolwiek bajt bo przecież tego też nie jesteś pewien.

    Dodano po 37 [sekundy]:

    Zawsze testowanie trzeba umiejętnie rozłożyć sobie na jak najmniejsze kroczki żeby później eliminować mniejsze błędy i składać wszystko w całość.
  • #10 8959458
    romedalh
    Poziom 10  
    Hmmm przetestowałem czy w ogole coś przychodzi z komórki i okazuje się, że program nie potrafi nic odebrać (nie potrafi przejść funkcji USART_Receive()).

    Wydaje mi się, że albo komórka nie potrafi odebrać tego co jej wysyłam, albo nie potrafi mi tego w jakiś sposób wysłać.
  • #11 8959490
    mirekk36
    Poziom 42  
    Ano widzisz, w końcu po doprowadzeniu do odpowiednio małego kroku można zacząć wyciągać wnioski i podjąć działania ratujące ;)

    Teraz sprawdź czy terminal w windows odbiera ten twój wysyłany string ;) jeśli odbiera to znaczy, że program w procku przynajmniej ten wysyłający jest OK, zatem problem masz gdzieś w połączeniach fizycznych z telefonem.

    No a to już jest konkretne znalezienie pierwszego babola, którego teraz można zacząć jakoś usuwać ;)
  • #12 8959524
    romedalh
    Poziom 10  
    PC odbiera bez problemów.
    Jeśli chodzi o warstwę fizyczną to pomiędzy kablem siemensa, a wtykiem na mojej płytce PCB musiałem użyć przejściówki (kabel siemensa jest żeński, mój wtyk na płytce również). Jednakże nie wydaje mi się by to miało jakieś wielkie znaczenie.

    Poza tym z tego co czytałem na tym forum niektórzy używali diod zenera lub dzielników rezystancyjnych do obniżenia napięcia na lini TxD mikrokontrolera. Jednakże wydaje mi się, że skoro używam MAXA232to ten problem też nie powinien istnieć.
  • #13 8959548
    mirekk36
    Poziom 42  
    Jeśli do terminala dostajesz AT ;) i nadal uważasz że nie powinien istnieć problem z połączeniami fizycznymi to znaczy tylko jedno. Nie ma problemu i tobie wszystko działa ;) .... po co więc dalej szukać ?

    Trochę bezsensowne podejście wg mnie - no ale można i tak.

    Pokaż może schemat jak podłączyłeś dokładnie się do tego telefonu łącznie z tym MAX232. Jaka dokłądnie wersja układu ? czy podłączyłeś prawidłowo wszystkie liniee w tym zdaje się na jeden pin w tym telefonie z tego co pamiętam przez mgłę trzeba też podać jakiś tam stan - no ale zakładam że tu masz wszystko obcykane skoro twierdzisz że nie ma problemu.

    A zdziwisz się na końcu ;) zobaczysz.
  • #14 8960075
    sulfur
    Poziom 24  
    Rozebrać oryginalną wtyczkę siemensa i zobaczyć z czego składa się układ. Jeśli zamiast jakiegoś maxa są tam dwie diody i dwa tranzystory, to działać nie będzie.
  • #15 8960809
    romedalh
    Poziom 10  
    @mirekk36 - chyba trochę przesadzasz :) . Wcale nie chodziło mi o to, że wg. mnie wszystko jest w porządku pod względem fizycznym. Ja jedynie przekazywałem informacje(m.in. o użyciu przejściówki i tych zenerkach) i przy okazji je komentowałem. Moja wiedza i doświadczenie elektroniczne wciąż są niewielkie, więc nie mam wszystkiego obcykanego :).

    Ale wracając do tematu:
    Używam MAXA232N (5 kondensatorów 1uF na poszczególnych nóżkach - wzięte z noty katalogowej).

    Schemat podłączenia MAXA z uC i złączem przesyłam w załączniku.

    O ile się nie mylę połączenie z komórką jest następujące:

    PCB --- Komórka
    DCD+DTR+DSR --- DCD+DTR+DSR
    TxD --- RxD
    RxD --- TxD
    GND --- GND
    RTS+CTS --- RTS+CTS


    @sulfur - też jest to jakieś rozwiązanie jednak wolę go uniknąć. Szukałem w sieci jakiegoś schematu elektrycznego tego kabla ( kabel IP40 ) jednak jak dotąd nie potrafię go znaleźć
  • #16 8960831
    mirekk36
    Poziom 42  
    Nie no ok,

    ale jednak schemat to podstawa. Tak mi się coś wydaje że niezgodnie z notą podłączyłeś kondki C6 oraz C7 - sprawdź dokładnie - muszą być podłączone odwrotnie bo to może zakłócać działanie scalaka i napięcia na wyjściu RS232 mogą być skopane. Zresztą weź miernik i sprawdź czy masz tam w granicach od -8V do +8V przynajmniej.

    Bo rozumiem, że telefon przez ten kabel podłączasz bezpośrednio do portu COM komputera ???

    Dodano po 2 [minuty]:

    Poza tym jeśli masz jakieś diody LED podpięte do nóg procka to oczywiście masz źle rozwiązane filtrowanie zasilania bo nie masz żadnego elektrolita przy nogach VCC. Dobrze że chociaż wszędzie dałeś te 100nF ;) ..

    ,,,,, masz wprawdzie 10uF ale to przy AVCC, jednak dałbym go przed tą cewkę żeby był przy VCC (jak najbliżej nóg zasilania) a przy AVCC można wtedy zostawić tylko ten 100nF.
  • #17 8961181
    romedalh
    Poziom 10  
    Miałeś rację co do kondensatorów, dziękuję. :)
    Napięcie na pinach Vs- i Vs+ to odpowiednio: -8,5V i 8,7V


    Tak, telefon podłączam przez ten kabel bezpośrednio do COMa.

    Hmmm teraz zauważyłem, że gdy podepne komórkę do układu, to czasami ona sama się wyłącza(przed wyłączeniem słychać takie niskie bipnięcie). Jeżeli już się nie wyłączy to zawiesza się do momentu wyciągnięcia kabla. Jednak gdy wpiąłem między układ a kabel siemensa inny kabel RS232 to wszystko już było w porządku (oprócz oczywiście transmisji, której jak nie było tak nie ma).
  • #18 8961438
    sulfur
    Poziom 24  
    Już to pisałem ale się powtórzę. Jeśli kabel jest wykonany po oszczędnościach i w sobie zamiast kostki max232 lub podobnej ma dwa tranzystory i dwie diody to układ nie będzie działał. Przerabiałem to już. Generalnie są tam trzy przewody, biały niebieski i zielony. Biały to masa. Resztę trzeba sprawdzić. Można połączyć układ na krótko dopasowując napięcia TTL<->CMOS.
  • #20 9029739
    romedalh
    Poziom 10  
    Wprowadziłem kilka zmian:
    - na piny DTR i RTS (a co zatym idzie na piny DSR i CTS) dałem napięcie 12V do zasilenia MAXa, który podobno (według mojego prowadzącego przedmiot) jest w tym kablu.
    - Zamiast połączenia DCD-DSR-DTR zrobiłem połączenie DSR-DTR, ponieważ przy wcześniejszym połączeniu komórka zawieszała się i wyłączała.

    Niestety brak jakichkolwiek postępów.
  • #22 9062594
    romedalh
    Poziom 10  
    Problem został rozwiązany.
    Jako, że miałem dwie żeńskie wtyczki należało skrosować TxD z RxD.

    Dziękuję wszystkim za pomoc
REKLAMA