Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ATMEGA128 + SIM900D - inicjalizacja i nie chce gadać

wind_energy 04 May 2012 16:44 3034 13
  • #1
    wind_energy
    Level 14  
    Witam kolegów i koleżanki (o ile takie są:P),

    Próbuję uruchomić SIM900D niestety bez skutku. Całkowity brak nadawania z modemu. Modem kupiony w mikromania więc można odrzucic tezę o blędnym schemacie.
    Schemat płytki z modemem:
    Link

    Co robię:

    - włączam modem poprez PIN Power_key
    - dostaję odpowiedź na lini STATUS o wartości "1" - modem w tym czasie nic nie wysyła (według noty katalogowej powinien wysłać jednorazowo ciąg kilku znaków)
    - rozpoczynam wysyłanie w pętli komendy AT - nic nie otrzymuję, totalny brak reakcji. Przebiegi oglądam również na oscyloskopie.

    Poprawność wysyłania i odbierania sprawdziłem robiąc pętlę TXD i RXD w procku. Poziomy napięć sprawdziłem na oscyloskopie - 2,85V stan wysoki, 0V stan niski.

    Powiem szczerze, że podejrzewam jakieś złe ustawienia z autobaunding, ale za bardzo nie wiem jak wyzerować modem, kurcze brakuje mi już pomysłów jak to ugryźć.
    Dwa razy odebrałem przypadkowo 0x25 ale nie wiem czym to bylo spowodowane.

    Proszę nakierujcie mnie, podpowiedzcie coś bo czuję, że utknąłem w martwym punkcie, dostałem zaporowego bata na d...
  • #3
    wind_energy
    Level 14  
    na ATZ nie ma reakcji, podejrzewam że po prostu nie może złapać synchronizacji, dlatego nie dociera żadna komenda. Dziwi mnie fakt że mikromaniacy w swoim module nie wyprowadzili pinów CTS i RTS, które na hardwarowym flow control są niezbędne, a taki jest domyślnie ustawiony jako deafultowy - byc może mikromaniacy wszystkie moduły ustawiają na softwarowy flow control. Teoretycznie powinienem to wykluczyć, ale czy na pewno?
    Modem wydaje się być prawie martwy, w linku który podaje mickpr jest co prawda o resecie ale nie ma szczegółów jak go wykonać przy braku komunikacji.

    Dodano po 18 [minuty]:

    powiem Wam szczerze że po tej przygodzie wolalbym kupić świeży moduł, zaprojektować płytkę, mieć świerzy układ bez domysłów i nie myśleć co zrobili mikromaniacy.
    Prawda jest taka, że moduł jest jedynie wrażliwy na zasilanie i jeśli tylko dobrze się je wykona układ śmiga. Ja kupilem ten moduł po to by wykluczyć błędy w płytce, ale teraz widzę, że źle zrobiłem. Proszę o dalsze sugestie i pomysły.
    Kurcze, to powinno chodzić, wszystko sprawdzone na oscyloskopie, a się uparło i nie chce no gadać to ustrojstwo jedne.
    Kiedyś walczyłem z LCD UC1608 którego mało komu udało się uruchomić via uart. Slaba dokumentacja że trzeba było z trzech różnych korzystać, udało mi się przebrnąć i wyciągnąć wnioski z tych dokumentacji, scalić to w jeden projekt, a teraz z takim prostym modułem nie moge sobie poradzić...ahh
  • #4
    jousto
    Level 17  
    Ważne jest aby pierwsze synchronizujące AT były pisane z WIELKIEJ litery A. Kiedyś się złapałem na tym że chciałem go zsynchonizować używając at - dwa dni mi to zajęło zanim doczytałem dokumentację.
    Modem standardowo ma ustawioną opcję autobauding, ja zawsze po pierszej synchonizacji przestawiam ją na sztywno np na 9600 albo 19200 potem już nie potrzebuje się synchronizować. Nie używam ani CTS ani RTS. Kilka SIM900 już uruchomiłem i nie było z nimi żadnego problemu. Mam też porównanie z SIM300 który był wrażliwy na zmiany napięcia na linii TxD w czasie inicjacji modemu. Pin musiał wisieć w powietrzu inaczej modem nie odzywał się. W SIM 900 już chyba się z tym uporali bo nie ma znaczenia.

    Dodano po 2 [minuty]:

    A czy używasz NETLIGHT? i co wskazuje?
  • #5
    wind_energy
    Level 14  
    Kolego jousto dziękuję Ci za Twój pomocny post. Nie używałem netlight dotychczas. Podłaczyłem się pod ten pin i mam:
    64ms ON / 800ms OFF moduł jest niezsynhronizowany z siecią - czyli nie jest uszkodzony - choinka:/

    Dodano po 7 [minuty]:

    oczywiście używam AT zamiast at.
    Robię tak:
    
    void gprs_inicjalizacja(){
    if(funkcja_modem_wlaczony==1){wyswietla_napis('modem wlaczony',1,0);}
    else{wlacz_modem();}
    
    uart_open();
    		
    
    
    while (synchro==0)
    	{
    
    		// jezeli odbierze znak 'A' wychodze z petli
    		timer=100;	synchro=0;
    
    		while ((timer--)&&(synchro==0))
    		{
    		
    		uart_put('A');
    		uart_put('T');
    
    
    			// jezeli w porcie szeregowym jest jakas dana
    		//odebrana = UDR0; 
    			if (UCSR0A_Bit7==1)	{
    			dioda2=1;
    				// to odbierz
    				odebrana = UDR0; //odebrana=uart_get();
    
    				if (odebrana=='A') {synchro=1;}
    			}
    			// jezeli nie ma danych, to czekaj 10ms
    			else
    			{
    				__delay_cycles(100000);dioda1=~dioda1;
    			}
    		}
    		
    	wyswietla_napis('zakonczylem',5,0);
    	
    	if(synchro==1){ wyswietla_napis('sukces',6,0);}
    	if(synchro==0){ wyswietla_napis('porazka',6,0);}
    	}


    Dodano po 11 [minuty]:

    Jeśli robię reset wysyłam ATZ0 czyli w miejsce

    uart_put('A'); 
    uart_put('T'); 


    wpisuje:


     uart_put('A'); 
     uart_put('T'); 
     uart_put('Z'); 
     uart_put('0'); 
  • Helpful post
    #6
    jousto
    Level 17  
    A gdzie wysyłasz znak końca linii CR?
    Kod 0D(hex) lub 13(dec) jak kto woli.

    Dodano po 8 [minuty]:

    Właściwie analizując ten schemat brakuje mi rezystorów pośredniczących kartę sim od modemu, zauważyłem że bez nich niektóre karty (PLAY) nie chcą się poprawnie inicjalizować lub jeśli to potem się zawieszają, szczególnie karty zasilane 1,8V. Modem ma możliwość rozpoznania karty i podania odpowiedniego napięcia zasilającego na SIMVDD ale zauważyłem że bez tych rezystorów ma tendencję do zawieszania się po jakimś czasie. Zastosowanie rezystorów (oraz dodatkowych kondensatorów) było polecane swego czasu przez SIMCOM co widać na schematach w starszych wersjach, ale potem zrezygnowali z nich. Ja niemniej stosuję je.
  • #7
    wind_energy
    Level 14  
    jousto wrote:
    A gdzie wysyłasz znak końca linii CR?
    Kod 0D(hex) lub 13(dec) jak kto woli.

    cenna uwaga - dodałem - no results

    uart_open();
    
    		uart_put('T');
    		uart_put('Z');
    		uart_put('0');
    		uart_put(0x0d);
    
    		


    jousto wrote:

    Właściwie analizując ten schemat brakuje mi rezystorów pośredniczących kartę sim od modemu, zauważyłem że bez nich niektóre karty (PLAY) nie chcą się poprawnie inicjalizować lub jeśli to potem się zawieszają, szczególnie karty zasilane 1,8V. Modem ma możliwość rozpoznania karty i podania odpowiedniego napięcia zasilającego na SIMVDD ale zauważyłem że bez tych rezystorów ma tendencję do zawieszania się po jakimś czasie. Zastosowanie rezystorów (oraz dodatkowych kondensatorów) było polecane swego czasu przez SIMCOM co widać na schematach w starszych wersjach, ale potem zrezygnowali z nich. Ja niemniej stosuję je.

    w przyszlości o tym pomyślę, ale najpierw trzeba zacząć z nim gadać
  • Helpful post
    #8
    jousto
    Level 17  
    A gdzie zjadłeś "A"

    Prawdę mówiąc nie do końca rozumiem tego kodu. Po mojemu powinno wysłać się do modemu AT+chr(13) i nie ma siły modem odpowiada.

    Zrób taki test podłącz jakikolwiek terminal odpalony na PC (HyperTerminal, Br@y itp) i poprzez konwenter napięć TTL (MAX232) wyślij AT{Enter}. Jak wtedy nie odpowie to powiem że coś nie tak.
  • #9
    wind_energy
    Level 14  
    może teraz czytelniej:
    void uart_open(void)
    {
    
    SREG_Bit7 = 0; //globalne zadblokowanie przerwan 
    	UBRR0H=0;	// starsza cześć, // ustawiam prędkość 9600 dla zegara 8MHz
    	UBRR0L=71;	// młodsza część	// ustawiam prędkość 9600 dla zegara 8MHz
    	UCSR0C=0x06;	UCSR0B=0x18;  // transmisja asynchroniczna, jeden bit stop, ramka 8 bit
    SREG_Bit7 = 1; //globalne odblokowanie przerwan 
    
    
    
    }
    
    
    int main (void){
    
    ...
    
    uart_open(); 
    while(1){ // robie w nieskonczonosc - resetuje komendą ATZ wartosc 0 i 100 razy wysylam AT
    		uart_put('A');	uart_put('T');	uart_put('Z');	uart_put('0');	uart_put(0x0d); // wykonuje RESET
    __delay_cycles(10000000);
    		
    
    	
    		timer=100;	synchro=0; 
    		while (timer--) 
    		{
    		uart_put('A');	uart_put('T');	uart_put(0x0d); // probuje 100 razy - ogladając na oscyloskopie przebiegi faktycznie je wysyła o wartości 2,85V - jedynka logiczna
    
    			if (UCSR0A_Bit7==1)	{  // czy odebral jakiekolwiek dane z RXD? - w ogole nic nie odbiera i nigdy nie spelnia tego warunku, na oscyloskopie nawet nie ma jakijkolwiek proby komunikacji - caly czas "1"
    			dioda2=1;	odebrana = UDR0; //odebrana=uart_get();
                  if (odebrana=='A') {dioda3=1;} // jesli odebral 'A' powinien zapalic diode3
    			}
    			else
    			{
    				__delay_cycles(10000000);dioda1=~dioda1; // jesli nic nie odebral czeka  800ms i ponownie wysyła AT+CR 
    			}
    		}}
    	}


    JOUSTO chyba możesz powiedzieć, że coś jest nie tak :/
  • #10
    jousto
    Level 17  
    Tak jak wcześniej sugerowałem, zrób próbę z terminalem na PC zamiast mikrokontrolera.
  • #11
    wind_energy
    Level 14  
    Upaliłem rs232 i zamówilem sobie gotowy konwerter, póki go jeszcze nie mam chcę powalczyć na up. napisałem softwarowy uart i zaraz będę robił testy. JOUSTO czy na 100% możesz powiedzieć że przy świeżych SIM900D nie ma włączonego sprzętowego flowcontrol?

    Dodano po 33 [minuty]:

    Ale zabawne...jak wyłączyłem podciąganie rezystorem PORTU dostaje stringi...
  • Helpful post
    #12
    jousto
    Level 17  
    Przy świeżych SIM900 jest włączony sprzętowy flow control, ale to niczego nowego nie wnosi. Modem ma się synchronizować i już. Inna sprawa, że w przypadku świeżego modemu autobauding obsługuje prędkości: 4800, 9600, 19200, 38400, 57600 oraz 115000, jeśli twój mikrokontroler używa innych to się nie dogadają. Polecam też włożenie karty SIM i sprawdzenie czy modem loguje się do sieci, karta musi mieć wyłączone sprawdzenie PIN kodu, wtedy modem bez żadnej ingerencji z zewnątrz sam się loguje, poprawność zalogowania można sprawdzić dzwoniąc na numer karty SIM, wcześniej sprawdź wskazania NETLIGHT (musi błyskać raz na ok 3 sek).
    Ja zawsze do pierwszego uruchomienia korzystam z terminala (Terminal by Br@y) odpalonego na PC wtedy unikam przypadku, że mikrokontroler coś nawala, Dopiero jak mam pewność że modem się poprawnie synchronizuje z PC to przełączam do kontrolera. Tak samo można podłączyć mikrokontroler do kompa i zobaczyć na terminalu co naprawdę on wysyła. W tej chwili nie jesteś jednoznacznie pewien czy problem leży po stronie modemu czy kontrolera, a więc najpierw musisz coś wykluczyć, inaczej jeśli uda ci się to uruchomić to raczej będzie to dzieło przypadku niż empirycznego rozwiązania.

    Dodano po 2 [minuty]:

    Podciągasz linie UART rezystorem????
  • #13
    przemekbary
    Level 16  
    Miałem kiedys podobny problem. Zobacz linie RTS, CTS, DTR.
  • #14
    wind_energy
    Level 14  
    Jousto Twoje rady są na prawdę bardzo cenne, bardzo Ci za to dziękuję i na pewno się przydadzą one nie jednej osobie. Podniosłem logiczną jedynkę o 0,2V czyli do 3,03V i modem zaczął gadać, widać tutaj niezgodność z datasheetem. Wiesz w moim przypadku gdzie korzystam ze sprzętu z wysokiej półki gdzie wszystko widzę po przebiegach nie zawsze podpianie do kompa uprości sprawę (w rs232 też bywają problemy np. z łącznością bo coś np. nie łączy). Mam takiego tektronixa 40 kanałów analizatora stanow logicznych, jak byś byl zainteresowany za symboliczne pieniądze pisz na prv. Każdy jednak korzysta z tego co ma już sprawdzone i jakie ma możliwości. Ja zamówiłem sobie konwerter RS232 na RS485 i na pewno w przyszłości będe chciał się tym podpierać bo to bardzo ciekawe i szybkie w zastosowaniu rozwiązanie. Tematu póki co nie zamykam, zobaczymy jak mi pójdzie wysyłka danych na serwer i odbiór na statyczne IP.
    Pozdrawiam Cię serdecznie.

    Dodano po 3 [godziny] 27 [minuty]:

    Wysyłam AT - odbieram A.
    Temat uważam za wyczerpany - zamykam.