Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 13 lip 2026, o 15:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 11 sie 2014, o 12:22 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 22
Pomógł: 0

Witam

Próbuje napisać aplikacje łączącą się przez gprs z serwerem w celu przesłania danych. Używam do tego Atmega644PA oraz moduł SIM908.
Poniżej kod.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Samo podłączenie do internetu i podłączenie do servera TCP działa.
Jednakże zaraz po podłączeniu czyli po wykonaniu instrukcji :
' if (sendATcommand("AT+CIPSTART=\"TCP\",\"secomnysa.dyndns.biz\",\"8080\"","CONNECT OK", "CONNECT FAIL", 10000) == 1)'
procesor restartuje. Po podłączeniu powinien pojawić się napis 'Connected" na wyświetlaczu LCD lub "Error openning the connection" w przypadku niepowodzenia. Nie pojawia się nic. Pojawia się napis 'Poczatek20' co sugeruje że program działa od początku. Doszedłem to tego iż funkcja sendATcommand wykonuje się do końca i po wykonaniu 'return answer' program działa od początku. Nie mam pojęcia dlaczego się tak dzieje. Każde wykonanie funkcji sendATcommand działa poprawnie tylko ostatnie jej wywołanie powoduje brak powrotu z tej funkcji i restart programu.
Czy ktoś może pomóc?

Pozdrawiam

Marcin



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 13:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Bezpośrednio z kodu to nie wynika, ale może masz odblokowane przerwania dotyczące UART'ów i w momencie wykonania tej instrukcji moduł przesyła dane co powoduje przeskok do nieistniejącej funkcji obsługi przerwania, a później to już wiadomo co...

Może to też być problem sprzętowy tzn. w momencie połączenia moduł może pobierać do 2A prądu, a więc krótko mówiąc zabiera go procesorowi który się resetuje (następuje duży spadek napięcia poniżej progu Vcc min uC).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 13:30 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 22
Pomógł: 0

Raczej nie bedzie to problem nieistniejących funkcji obsługi UARTów gdyż wszystkie powyższe wywołania funkcji sendATcommand się wykonują a po ich wywołaniu moduł wysyła komendy które są prawidłowo interpretowane przez Atmege. Problem występuje tylko po wywołaniu ostatniej funkcji sendATcommand.
Co do zasilania to moduł sim908 jest zasilany osobno a procesor osobno. Masy tylko są połączone. Więc zwiekszony pobór prądu modułu nie może wpłynąć na spadek zasilania na procesorze.

Na chwilę obecną dodatkowo zauważyłem iż gdy wykomentuje linię while(sendATcommand("AT+CIPSTATUS", "IP STATUS", "", 1000) == 0 );' - czyli bezpośrednio przed 'if (sendATcommand("AT+CIPSTART=\"TCP\",\"secomnysa.dyndns.biz\",\"8080\"","CONNECT OK", "CONNECT FAIL", 10000) == 1)' to problem nie występuje.

Czy jest coś takiego jak za duża liczba instrukcji 'if' w eclipse?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 13:36 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27462
Lokalizacja: Szczecin
Pomógł: 1045

secom napisał(a):
Czy jest coś takiego jak za duża liczba instrukcji 'if' w eclipse?


Pomyśl chwileczkę, zastanów się - co mają w ogóle instrukcje 'if' wspólnego z eclipse ? .... eclipse to TYLKO edytor kodu i nic więcej, ale ok pewnie może ci chodziło o kompilator WinAVR albo Atmel toolchain, to też zapomnieć możesz, że coś ci się resetuje bo jest ich jakaś ograniczona liczba.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 13:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

Ja zlogowałbym transmisję uC<>SIM900 i zobaczył jaka jest odpowiedź modemu na zadaną komendę AT+CIPSTART

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 13:54 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Zaczalbyym od podpiecia terminal z PC zamiast modulu GPRS i udawal recznie modul.
Oczywiscie przez jakis konweter max232 jesli masz rs, albo ft232 pod usb.

------------------------ [ Dodano po: 10 minutach ]

Jakbym mial strzelac to zrodlo problemu moze byc tu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zobacz co sie stanie jesli SIM908 zwroci ci wiecej niz 100 bajtow. Przy 101 sprobujesz zapisac do komorki. Jakiejs komorki, na pewno nie do tej ktora zarezerwowales piszac char response[100];

------------------------ [ Dodano po: 15 minutach ]

Druga sprawa to sposob w jaki uzywasz funkcji sendATcommand:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Patrzac w kod sendATcommand widze ze 0 moze zwrocic tylko w przypadku timeoutu. To na pewno oczekiwane zachowanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 14:15 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 22
Pomógł: 0

Ja mam podłączony terminal Putty przez przejsówke usb-rs232 do modułu i widze pieknie co wysyła procesor do modułu i co moduł odpowiada. Ewidentnie na terminalu widac że wszystko działa jak należy, moduł się podłącza komendą AT+CIPSTART poprawnie, nawet na serwerze widzę że przyszło połączenie. Jednak zaraz po tym nastepuje ponowne podłączanie modułu. Jak spojrzycie do kodu to jest tam zdefiniowana zmienna test. Na początku programu jest ona ustawiona na 20 oraz jest wyswietlona razem z napisem "Poczatek" w funkcji main() czyli na LCD pojawia się 'Poczatek20'. Tuż przed wykonaniem linii 'if (sendATcommand("AT+CIPSTART=\"TCP\",\"secomnysa.dyndns.biz\",\"8080\"","CONNECT OK", "CONNECT FAIL", 10000) == 1)' jest ta zmienna ustawiana na 10.
Po wykonaniu tej linii na wyswietlaczu LCD pojawia się napis 'Poczatek20' wiec wnioskuje że procesor sie zresetował.
Jednoczesnie w funkcji sendATcommand na jej końcu jest :

lcd_cls();
locate (1,0);
lcd_int(answer);
_delay_ms(2000);
lcd_cls();
return answer;


Ta sekwencja pokazuje mi jaki jest answer po wykonaniu funkcji sendATcommand.
Ta sekwencja również poprawnie się wykonuje po ostatnim wywołaniu funkcji sendATcommand (z instrukcja AT+CIPSTART). Ewidentnie w momencie dojscia programu do instrukcji return answer; procesor sie restartuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 14:41 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Cytuj:
Ta sekwencja również poprawnie się wykonuje po ostatnim wywołaniu funkcji sendATcommand (z instrukcja AT+CIPSTART). Ewidentnie w momencie dojscia programu do instrukcji return answer; procesor sie restartuje.

Niestety nie widze tyle co ty. Co ci wyswietla lcd_int(answer) w problematycznej funkcji?

PS. boli mnie ze nie czytasz uwag. Czy moglbys dla swietego spokoju (mojego) dodac po lini:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

linie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 16:48 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 22
Pomógł: 0

Faktycznie masz racje. Zwiększyłem rozmiar tablicy response do 200 bajtów i zaczęło działać. Dołożyłem jak wskazałeś warunek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i faktycznie przy wykonywaniu funkcji sendATcommand przy ostatnim wywolaniu answer był 3.
Dzieki za pomoc. Chyba długo bym do tego nie doszedł gdyż odpowiedz modułu na komende AT+CIPSTART jest albo "CONNECT OK" albo "CONNECT FAIL". A to napewno nie jest nawet 100 bajtów. Szczerze na chwile obecną nie rozumiem dlaczego rozmiar tablicy response 100 bajtów był niewystarczający ale może dojde do tego

Dzieki



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 16:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

secom napisał(a):
.....Chyba długo bym do tego nie doszedł gdyż odpowiedz modułu na komende AT+CIPSTART jest albo "CONNECT OK" albo "CONNECT FAIL". A to napewno nie jest nawet 100 bajtów. Szczerze na chwile obecną nie rozumiem dlaczego rozmiar tablicy response 100 bajtów był niewystarczający ale może dojde do tego.......



A czy echo w SIM900 masz wyłączone??

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 17:12 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 22
Pomógł: 0

Echo nie jest wyłączone. Jutro spróbuje z wyłączonym Echo i napisze czy będa problemy przy rozmiarze response 100 bajtów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 17:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

W procedurze inicjalizacji modemu wyślij ATE0, bez sensu żeby modem wysyłał to co otrzymał. Procek niepotrzebnie analizuje śmieci. Zapycha również bufor odbiorczy.


Autor postu otrzymał pochwałę

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2014, o 20:23 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

secom napisał(a):
i faktycznie przy wykonywaniu funkcji sendATcommand przy ostatnim wywolaniu answer był 3.
Dzieki za pomoc. Chyba długo bym do tego nie doszedł gdyż odpowiedz modułu na komende AT+CIPSTART jest albo "CONNECT OK" albo "CONNECT FAIL". A to napewno nie jest nawet 100 bajtów. Szczerze na chwile obecną nie rozumiem dlaczego rozmiar tablicy response 100 bajtów był niewystarczający ale może dojde do tego

No ale skoro masz przejsciowke usb-rs232 to podlacz ja do SIM'a i wyslij te same komendy co programem i zobacz co sie zwraca.

I popatrz jeszcze raz co pisalem o wywolaniu while(sendATcommand(...) == 0).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2014, o 16:33 
Offline
Nowy

Dołączył(a): 19 paź 2013
Posty: 22
Pomógł: 0

Sonix napisał(a):
A czy echo w SIM900 masz wyłączone??


Wyłączyłem echo i faktycznie działa z tablicą w rozmiarze 100 bajtów. Dzieki za pomoc.

charsz napisał(a):
No ale skoro masz przejsciowke usb-rs232 to podlacz ja do SIM'a i wyslij te same komendy co programem i zobacz co sie zwraca.

I popatrz jeszcze raz co pisalem o wywolaniu while(sendATcommand(...) == 0).


Ja cały czas monitorowałem odpowiedzi modułu za pomocą terminala Putty. Ale jakoś nie dotarło do mnie że echo to dodatkowe dane wysyłanie z modułu które procesor bedzie interpretował jako odpowiedz a komanda po wywołaniu której następował problem była znacząco dłuższa od innych.
Ok juz działa więc dzieki wielkie

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Bing [Bot] i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO