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

SIM300 BASCOM błędnie odbierane potwierdzenia po RS232

robusta 02 Kwi 2010 19:29 3756 17
  • #1 02 Kwi 2010 19:29
    robusta
    Poziom 15  

    Witam,
    w oparciu o przeczytane na forum posty (w szczególności https://www.elektroda.pl/rtvforum/topic1441719.html) stworzyłem poniższy kod, który w 99% działa.
    Poprawnie wysyła SMSy i poprawnie dzwoni w zależności od tego jaki guzik się naciśnie.

    Problem mam z odbiorem potwierdzeń z modułu SIM300CZ.
    Wiadome mi jest (po podłączeniu komputera), że na komendy typu: AT odpowiada OK, poniższy kod miał mi te "OK" np. po linii Print "AT+CMGF=1" ; Chr(13);
    wyświetlić na LCDku - niestety wyświetlane są pojedyncze kropki. Wyświetlacz działa, bo tekst wprowadzony normalnie Lcd " SIM300 " w każdej linii wyświetla dobrze.
    Nie mam w tej chwili do dyspozycji innego wyświetlacza.
    Czy według Was kod jest dobry i powinien wyświetlać a LCD jest np. zbyt wolny i nie wyrabia czy jednak jest błąd - siedzę nad tym dziś już od 6 godzin i chyba już mam mętlik w głowie, proszę o korektę lub cenne wskazówki.
    pozdrawiam,
    Przemo

    Code:

    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 19200
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Porte.4 , Db5 = Porte.5 , Db6 = Porte.6 , Db7 = Porte.7 , E = Porte.3 , Rs = Porte.2

    Ddrf.0 = 0
    Ddrf.1 = 0
    Set Portf.1
    Set Portf.0
    G1 Alias Pinf.0
    G2 Alias Pinf.1

    Dim Numer As String * 9
    Dim Znak As String * 10
    Dim Rs As Byte
    Dim A As Byte

    Cursor Off , Noblink
    Display On
    Locate 1 , 1
    Lcd "      SIM300        "
    Locate 2 , 1
    Lcd "                    "
    Locate 3 , 1
    Lcd "                    "
    Locate 4 , 1
    Lcd "                    "

    Numer = "123123123"

    Glowny:
    Do
    If G1 = 0 Then : Goto Wyslij : End If
    If G2 = 0 Then : Goto Dzwon : End If
    Waitms 100
    Loop

    Wyslij:
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "ATH"
    Wait 1
    Print "ATE0"
    Waitms 500
    Print "ATE0"
    Waitms 500
    Znak = ""
    Print "AT+CMGF=1" ; Chr(13);
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 10 Then Exit Do
       Loop
       Cls
       Locate 3 , 1
       Lcd "> " ; Znak
    Waitms 200
    Znak = ""




    Print "AT+CSCS=" ; Chr(34) ; "GSM" ; Chr(34) ; Chr(13);
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 10 Then Exit Do
       Loop
       Cls
       Locate 3 , 1
       Lcd "> " ; Znak
    Waitms 200
    Znak = ""
    Print "AT+CMGS=" ; Chr(34) ; Numer ; Chr(34) ; Chr(13);
    Waitms 500
    Print "nacisniety guzik G1" ; Chr(26) ; Chr(13);
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 10 Then Exit Do
       Loop
       Cls
       Locate 3 , 1
       Lcd "> " ; Znak
       Waitms 200
    Locate 2 , 1
    Lcd "SMS wyslany"
    Wait 2
    Locate 2 , 1
    Lcd "                    "
    Goto Glowny

    Dzwon:
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "ATH"
    Waitms 200
    Print "ATD123123123;"
    Wait 2
    Locate 2 , 1
    Lcd "                    "
    Goto Glowny



    ---------------- 3-04-2010 ---
    dziś posiedziałem znowu parę godzin, przestawiłem z zewnętrznego kwarcu 16MHz na wewnętrzny RC 8MHz a potem jeszcze 4MHz - pogorszyło się jeszcze bardziej - nie działało mi odbieranie potwierdzeń z modułu SIM300 a na wewnętrznym kwarcu 8 i 4MHz nawet SIM300 nie chciał zadzwonić i wysłać SMSa, przełączyłem zatem ponownie na kwarc i wysyłanie znowu działa.

    W programie zamiast wysyłania na LCD dałem Print #2 , Znak - i wysyłam na 2 uarcie na laptopa, generalnie bez zmian, raz nawet przyszło "O" czyli jedną literkę z potwierdzenia "OK" przyjął.
    Kiedy dam Print #2, "TEST" to na laptopie słowo TEST jest odebrane.
    Zaczynam podejrzewać, że program może być dobry a atmega leży lub coś z jej taktowaniem i poziom błędów jest bardzo duży.

    W tej chwili nie mam pod ręką innych modułów z prockami na innych kwarcach i będę próbował dalej w przyszłym tygodniu.

    Może jednak ktoś zechce wyrazić swoje odczucia czy soft jest poprawny i jednak ta atmega..., a może ktoś ma przetestowany blok odbioru takiego potwierdzenia, który u niego na pewno działa i zechce się podzielić.

    pozdr.
    Przemo

    0 17
  • Arrow Multisolution Day
  • #2 05 Kwi 2010 21:14
    jousto
    Poziom 16  

    Generalnie mam ten sam problem.
    Modem reaguje poprawnie na wysyłane komendy ale nie odbiera potwierdzeń z modemu.
    Zuważyłem, że gdy zastosuję następującą procedurę uruchamiania to działa poprawnie:
    1 zasilanie mikrokontrolera
    2 odłączenie TxD modemu do kontrolera
    3 zasilanie modemu (PWRKey do GND)
    4 połączenie ponownie TxD modemu do kontrolera

    Dodano po 3 [minuty]:

    W twoim programie dodałbym linię

    Code:
    Config Serialin = Buffered , Size = 20


    poczytaj sobie w helpie bascoma i postaraj się zrozumieć co daje ustaienie bufora UART

    ja na początku też miałem problemy z odbiorem kompletnego bufora, czasem gubiło się kilka znaków na poczatku i końcu.

    0
  • #3 05 Kwi 2010 21:18
    robusta
    Poziom 15  

    u mnie to nie działa, odpinam rs232 na czas programowania po isp - w m128 isp wisi na uarcie1 i na wszelki wypadek wyciągam wtyczke db9,
    jutro przetestuję to na innym procku - mam jakąś m32 na innej płytce i wtedy zobaczę - u mnie transmisja między SIM300 a uC jest na maxach232 z dwóch stron, przyznam, że nie testowałem czy bez maxów wpięte bezpośrednio (po stronie SIM300 na nóżce RX jest dzielnik napięciowy 1k8 i 3k3).
    Jeśli ktoś mi potwierdzi, ze program jest dobry i powinno działać a na m32 też nie zadziała to zacznę kombinować, na tą chwilę nie wiem czy problem leży po stronie software czy hardware...

    Code:

    Config Serialin = Buffered , Size = 20


    miałem tę linię i usunąłem, wyrzuciłem też wtedy liczenie 10x ze zmienną A, kiedy jest ta linia program nie przechodzi dalej i zatrzymuje się zapewne na pierwszej linii z If Rs = 13 Then Exit Do,
    generalnie jak miałem buforowanie to nawet smsa nie chciał wysłać - usunąłem linię i wysyłanie działa...

    pozdr.
    Przemo

    0
  • Arrow Multisolution Day
  • #4 05 Kwi 2010 22:58
    jousto
    Poziom 16  

    Zastanów się nad tą częścią

    Code:
    Print "AT+CMGF=1" ; Chr(13); 
    
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 10 Then Exit Do
       Loop


    najpierw wysyłasz komendę do modemu a następnie nie dając mu czasu na odpowiedź nasłuchujesz UART, przez kilka cykli zegara, pewnie że będzie pusto w buforze i dlatego program przechodzi do wysyłania następnych komend.
    Proponuję daj mu chwię czasu na odpowiedź i dopiero sprawdzaj bufor.
    I dalej upieram się żebyś zbuforował UART, bo nigdy nie jesteś pewien kiedy bufor będzie gotowy do odbioru danych.

    0
  • #5 05 Kwi 2010 23:36
    robusta
    Poziom 15  

    słusznie, faktycznie czas był wyśrubowany, dołożyłem buforowanie i 2 uart na odpowiedzi do PCta,
    w tej chwili program wygląda tak:

    Code:

    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 19200
    $baud1 = 19200
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Porte.4 , Db5 = Porte.5 , Db6 = Porte.6 , Db7 = Porte.7 , E = Porte.3 , Rs = Porte.2
    Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Serialin = Buffered , Size = 20
    Config Serialin1 = Buffered , Size = 20
    Open "COM2:" For Binary As #2

    Ddrf.0 = 0
    Ddrf.1 = 0
    Set Portf.1
    Set Portf.0
    G1 Alias Pinf.0
    G2 Alias Pinf.1

    Dim Numer As String * 9
    Dim Znak As String * 10
    Dim Rs As Byte
    Dim A As Integer

    Cursor Off , Noblink
    Display On
    Locate 1 , 1
    Lcd "      SIM300        "
    Locate 2 , 1
    Lcd "                    "
    Locate 3 , 1
    Lcd "                    "
    Locate 4 , 1
    Lcd "                    "

    Numer = "123123123"

    Glowny:
    Do
    If G1 = 0 Then : Goto Wyslij : End If
    If G2 = 0 Then : Goto Dzwon : End If
    Waitms 100
    Loop

    Wyslij:
    Print "AT"
    Print #2 , "AT"
    Wait 1
    Print "AT"
    Print #2 , "AT"
    Wait 1
    Print "AT"
    Print #2 , "AT"
    Wait 1
    Print "ATH"
    Print #2 , "ATH"
    Wait 1
    Print "ATE0"
    Print #2 , "ATE0"
    Waitms 500
    Print "ATE0"
    Print #2 , "ATE0"
    Waitms 500
    Znak = ""
    Print #2 , "AT+CMGF=1"
    Print "AT+CMGF=1" ; Chr(13);
    Waitms 500
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 32000 Then Exit Do
       Loop
       Print #2 , "> " ; Znak
       Locate 2 , 1
       Lcd "> " ; Znak
    Waitms 200
    Znak = ""
    Print #2 , "AT+CSCS=GSM"
    Print "AT+CSCS=" ; Chr(34) ; "GSM" ; Chr(34) ; Chr(13);
    Waitms 500
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 32000 Then Exit Do
       Loop
       Print #2 , "> " ; Znak
       Locate 3 , 1
       Lcd "> " ; Znak
    Waitms 200
    Znak = ""
    Print #2 , "AT+CMGS=numer"
    Print "AT+CMGS=" ; Chr(34) ; Numer ; Chr(34) ; Chr(13);
    Waitms 500
    Print "nacisniety guzik G1" ; Chr(26) ; Chr(13);
    Waitms 500
       A = 1
       Do
       Rs = Inkey()
       If Rs = 13 Then Exit Do
       Znak = Znak + Chr(rs)
       Incr A
       If A = 32000 Then Exit Do
       Loop
       Print #2 , "> " ; Znak
       Locate 4 , 1
       Lcd "> " ; Znak
       Waitms 200
    Print #2 , "SMS wyslany"
    Locate 1 , 1
    Lcd "SMS wyslany    "
    Wait 2
    Locate 2 , 1
    Lcd "                    "
    Goto Glowny

    Dzwon:
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "ATH"
    Waitms 200
    Print "ATD123123123;"
    Wait 2
    Locate 2 , 1
    Lcd "                    "
    Goto Glowny



    zarówno na wyświetlaczu jak i w terminalu do komendach dostaję jedynie "> " i pusto, jutro muszę wypróbować na innym procku...
    teoretycznie powinno działać, modem na terminalu zawsze odpowiada mi OK po wysłaniu polecenia,
    opóźnienia po wysłaniu czegokolwiek próbowałem od waitms 20 po 500 - bez zmian,

    pozdr.
    P.

    0
  • #6 06 Kwi 2010 10:07
    jousto
    Poziom 16  

    Akurat mam na stole rozłożoną Atmegę32 z LCD i SIM300, jak znajde chwile czasu to wrzucę ten program i spróbuję ustalić czy coś jeszcze poradzę. Generalnie sądzę że to powinno działać (u mnie działa) ale pewnie coś przekombinowałeś.
    Jak masz ustawioną transmisję na SIM? u mnie jest Autobauding.
    oraz 9600 na kontrolerze.
    Mam także problem z synchronizacją SIMa i kontrolera pomimo że modem przyjmuje polecenia i je wykonuje (tak jak u ciebie) to jednak nie odpowiada. Ale ja radzę sobie tak:
    1. Włączam kontroler
    2. Odpinam linię TxD od modemu
    3. Odpalam modem
    4. Łączę ponownie TxD

    i wtedy odpowiada juz dobrze.
    Spróbuj też połączyć tak.
    1. TxD modemu do RxD w COM w kompie przy uzyciu MAX232
    2. RxD modemu do TxD kontrolera.
    Wysyłaj komendy z kontrolera i obserwuj co się dzieje na terminalu uruchomionym na kompie.

    0
  • #7 06 Kwi 2010 10:58
    robusta
    Poziom 15  

    ok, spróbuję z tym odpinaniem choć i to wydaje mi się dziwne - dziś sprawdziłem na m32 i to samo, na m128 zmieniłem kwarc na 7372800 aby był lepiej podzielny, to samo.
    Znalazłem jeden brak: Enable Interrupts - dlatego bufor nie działał, teraz działa ale ale, po pierwsze komendzie AT+CMGF=1 na LCDku jest: >kwadracik, linia 3: >.OK kwadracik, linia 4: >.kwadracik

    w linii 2 powinno być OK są śmieci, w linii 3 jest OK ale też kropa i kwadracik zatem coś tam się w buforze dzieje, w 4 linii nie pamiętam czy powinno być też OK czy jakieś inne potwierdzenie po wysłaniu SMSa - generalnie jest kropa i kwadracik - smsy są wysyłane,

    program aktualnie wygląda tak:

    Code:

    $regfile = "m128def.dat"
    $crystal = 7372800
    $baud = 19200
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Porte.4 , Db5 = Porte.5 , Db6 = Porte.6 , Db7 = Porte.7 , E = Porte.3 , Rs = Porte.2
    Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Serialin = Buffered , Size = 20

    Ddrf.0 = 0
    Ddrf.1 = 0
    Set Portf.1
    Set Portf.0
    G1 Alias Pinf.0
    G2 Alias Pinf.1

    Dim Numer As String * 9
    Dim Znak As String * 10
    Dim Rs As Byte
    Dim A As Integer

    Cursor Off , Noblink
    Display On
    Locate 1 , 1
    Lcd "      SIM300        "
    Locate 2 , 1
    Lcd "                    "
    Locate 3 , 1
    Lcd "                    "
    Locate 4 , 1
    Lcd "                    "

    Numer = "123123123"

    Enable Interrupts

    Glowny:
    Do
    If G1 = 0 Then : Goto Wyslij : End If
    If G2 = 0 Then : Goto Dzwon : End If
    Waitms 100
    Loop

    Wyslij:
    Locate 1 , 1
    Lcd "Procedura wysylania"
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "ATH"
    Wait 1
    Print "ATE0"
    Waitms 500
    Print "ATE0"
    Waitms 500
    Print "AT+CMGF=1" ; Chr(13);
    Wait 1
    If Ischarwaiting() = 1 Then
          Znak = ""
          Do
          Rs = Inkey()
          Znak = Znak + Chr(rs)
          If Rs = 13 Then Exit Do
          Loop
          Locate 2 , 1
          Lcd ">" ; Znak
    End If
    Wait 1
    Print "AT+CSCS=" ; Chr(34) ; "GSM" ; Chr(34) ; Chr(13);
    Wait 1
    If Ischarwaiting() = 1 Then
          Znak = ""
          Do
          Rs = Inkey()
          Znak = Znak + Chr(rs)
          If Rs = 13 Then Exit Do
          Loop
          Locate 3 , 1
          Lcd ">" ; Znak
    End If
    Wait 1
    Print "AT+CMGS=" ; Chr(34) ; Numer ; Chr(34) ; Chr(13);
    Waitms 500
    Print "nacisniety guzik G1" ; Chr(26) ; Chr(13);
    If Ischarwaiting() = 1 Then
    Wait 1
          Znak = ""
          Do
          Rs = Inkey()
          Znak = Znak + Chr(rs)
          If Rs = 13 Then : Exit Do : End If
          Loop
          Locate 4 , 1
          Lcd ">" ; Znak
    End If
    Waitms 200
    Locate 1 , 1
    Lcd "SMS wyslany         "
    Wait 2
    Locate 1 , 1
    Lcd "                    "
    Goto Glowny

    Dzwon:
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "AT"
    Wait 1
    Print "ATH"
    Waitms 200
    Print "ATD123123123;"
    Wait 2
    Locate 2 , 1
    Lcd "                    "
    Goto Glowny

    0
  • #8 06 Kwi 2010 11:13
    rpal
    Poziom 27  

    Czy ja dobrze pojmuję te posty a mianowicie Panowie chcąc zaoszczędzić na uC bawią się w przełaczenie transmisji po rs232 między PC-tem a SIM-em ? Jeśli tak to gratuluje pomyslowości bo zdecydowanie wygodniej i wcale nie drożej jest użyć procka z dwoma kanałami UART. Poza ty z własnego podwórka widzę że aby wydajnie przetestować komendy AT dla SIM-a warto zainwestować w kabel DKU-5 od noki i wprost włączyć się w moduł z własnym PC-tem. Nie trzeba sie babrać w jakieś sztuczki z uC i wszystko widać w oknie terminala od PC-ta. Wydatek 20 PLN to nie są aż tak wielkie pieniądze a wygoda zdecydowanie większa.

    0
  • #9 06 Kwi 2010 11:25
    robusta
    Poziom 15  

    źle rozumujesz, chodzi o to żeby zrobić moduł np. do powiadamiania GSM o wystąpieniu alarmu w domu bez użycia PCta a mikrokontroler ma być pewnym wysłania SMSa otrzymując potwierdzenie OK z modułu GSM a nie wysyłać w powietrze sądząc, że pewnie poszło,
    aktualnie odpowiada OK załączając przed tym krzaki - i przed OK i po,
    podłączyłem równolegle terminal na PC - tylko linia RX do nasłuchu i potwierdzenia w terminalu są prawidłowo OK po każdej komendzie, na LCD dodatkowo są krzaki,
    sprawdzając soft i naduszając na klawiaturze przyciski na LCDku ładnie okazuje się naciskany guzik bez żadnych krzaków,

    sprawdzałem też to odpinanie linii TX między uC i SIM300 i bez efektu,

    0
  • #10 06 Kwi 2010 11:59
    rpal
    Poziom 27  

    kol. robusta doskonale rozumiem o co chodzi z ta ylko różnicą że GPS wysyła dane na UART, SIM300 także więc jakby nie patrzeć potrzebne są 2 UARTY, chyba że jeden z nich będzie programowy. Co do samego obrazowania wyników uważam że masz błędy w połaczeniach i tyle albo nieprawidłowe poziomy napięć na linii Rxd modułu SIM. W swoim czasie miałem tego typu przypadlość kiedy to podobnie jak ty założyłem tylko odbiór z linii Txd SIM-a a Rxd zostawiłem podpiętą pod nieużywane wyjście z uP. Do póki nie ustaliłem tam na stałe 1 w ogóle nic nie dostawałem na wyjściu Txd tylko same śmiecie. Linia Rxd SIM-a musi mieć ustawiony poziom 1 aby cokolwiek odczyta/zapisać do modułu. To gwarantuje np. DKU-5 kiedy bawisz się PC-tem i SIM-em jak równierz sam uP kiedy zdefiniujesz obsługę nadawania i odbioru z UART-a (stan wyjść odpowiadającego portu linią Txd i Rxd jest wówczas ignorowany) Więc po prostu taka partyzantka w uruchamianiu mści się śmieciami, mimo że każdy element z osobna niby działa. Chesz mieć pewność co do poprawności wysyłanych komend do SIM-a zasymuluj uP za pomoca PC-ta a potem przenieś poprawne komendy do procesora, nie chcesz tego robić użyj poprawnego połączenia uP(czyli obydwie linie Rxd, Txd podłączone) a skutki działania transmisji obserwuj np. JTAG-iem. Mozliwości masz wiele tylko rób to z głową :) Trochę się tu zapędzilem bo pierwotnie zrozumiałem że ma do tego być GPS. Ale teraz łapię. Moim zdaniem równoległe połączenie PC-ta SIM-a i uP jest tutaj całą istota sprawy, dla mnie osobiście to po prostu egzotyka. Tym bardziej że nie wiem skąd czerpiesz zasilanie np. dla bufora rs232 dopasowującego poziom zasilania, druga sprawa jak się to tobie w ogóle udaje połaczyć skoro SIM-pracuje w innych poziomach napięć niż np. popularny MAX232 jeden chodzi na 5 V drugi oscyluje koło 3,6 V pytanie w jakiej logice napięć chodzi sam uP. Reasumując najprościej jest wykonać połaczenie rxd-txd na liniach od uP oraz SIM-a a stan wysyłanych i otrzymywanych informacji podglądać JTAG-iem o ile go masz oczywiście nie zapominająć oczywiście o odpowiednich poziomach napięć bo takie równoległę łaczenie RS232 to mi pachnei po prostu partyzantką.

    0
  • #11 06 Kwi 2010 12:42
    robusta
    Poziom 15  

    ok, GPSu nie używam - cały mój problem polega na tym, że:
    1. posiadam moduł SIM300CZ i konwerter max232 (powinien być max3232 ale na linii RX modułu SIM300 jest dzielnik napięciowy 1k8 i 3k3) TX leci bezpośrednio na uC lub MAXa232 bo wiadomo)

    2. podpięcie w/w do PCta i obsługa przez terminal działa bardzo dobrze - każdy komunikat natychmiastowo jest potwierdzany GSM odpowiedzią OK

    3. płyta testowa z m128 - podpięcie jej pod PCta - działa bardzo dobrze
    (na płytce m128 też mam maxa232 do komunikacji z PCtem).

    4. podpięcie całości w taki sposób: m128 <> max232 <> max232 <> SIM300 powoduje to, że moduł GSM wszystkie komunikaty wykonuje prawidłowo, wysyła smsy i dzwoni i nawet potwierdza, gdyż w momencie podpięcia się żabką z portu COM1 w PCcie między maxami232 podglądam co gadają - widzę każdą odpowiedź modułu SIM300, że jest OK.

    5. m128 pomimo, że OK idzie nie odbiera go (ale znak ASCII 13 tak bo przechodzi dalej zatem warunek spełniony) - losowo na LCDka wyrzuca OK nawet i z dwa razy ale za każdym razem dodając mu krzaczki z przodu i z tyłu (kropka, kwadracik) - na innym LCDku były jakby chińskie literki...

    Wyrzuciłem maxy232 pośredniczące i dałem bezpośrednio SIM300 <> m128 - to samo bez zmian.
    Fakt, że m128 jest zasilana z 5V logika 5V a SIM300 za przetwornicą z 4,2V - logika 3V.

    W kolejnym teście zasilę m128 z 3,6V choć nie posiadam chyba w tej chwili max3232 i z podglądem na PCie będzie problem - LCD odpada w tym momencie. Połączę m128 z SIM300 bez maxów i zobaczę - domyślam się, że jednak mam problem hardwarowy ale i tak ręce opadają,
    pozdr.

    0
  • #12 06 Kwi 2010 13:04
    rpal
    Poziom 27  

    Po kiego grzyba w ogóle jest ci potrzebny ten PC-te. Jeśli się przy nim tak uparłeś a masz przecież 2 UART-y to pod jednego podepnij sobie PC-ta z MAX232 a pod drugi SIM-a a dzielnikiem na wyjściu Txd do atmega128 albo buforem 74LVHC08 zasilonym z samego SIM-a. Bedziesz sobie transmitował we wszystkie strony ile dusza zapragnie. Najwydajniejsza jest obsługa odbioru w przerwaniach a pamięci na bufory odczytu masz aż nadto bo 4KB. Skoro wszystko indywiduwalnie działa to dylemat czemu się sypie przy równoległych połaczeniach jest aż nadto oczywisty. Masę od PC-ta masz w ogóle podpiętą , tak przy okazji zapytam? A w ogóle to może zastanów się co się dzieje podczas Twoje szpiegowania transmisji. Rxd od PC-ta nie jest jakimś szalonym obciążeniem i udaje się tobie coś tam zobaczyć. Pomyśl co się dzieje kiedy łaczysz równolegle Txd PC-ta które jest ewidentnym wyjściem i drugim wyjściem jakim jest Txd od uP dodatkowo przepuszczone przez bufor MAX232, przyszło ci może do głowy sprawdzić woltomierzem jakie panują tam poziomy napięć choćby podczas oczekiwania na transmisje? Jak chcesz wydajnie szpiegować to uzyj sobie drugiego COM-a od PC-ta oraz drugiego okna terminala ale załącz na linię Txd uP linię Rxd od RS232 PC-ta.

    0
  • #13 06 Kwi 2010 15:15
    robusta
    Poziom 15  

    PCet mi nie jest w ogóle potrzebny, służy teraz tylko do tego żeby podejrzeć co idzie skoro na LCDku są krzaki,

    "Masę od PC-ta masz w ogóle podpiętą" - nie podejrzewaj mnie o coś takiego...

    "Rxd od PC-ta nie jest jakimś szalonym obciążeniem i udaje się tobie coś tam zobaczyć. Pomyśl co się dzieje kiedy łaczysz równolegle Txd PC-ta" - nie pisałem, że łączę TXa - żabka jest użyta w liczbie pojedynczej bo jedynie podsłuchuję i wpinam się tylko 5(masa) i 2(RX), generalnie podpięcie 2 i 5 nic nie zmienia w transmisji między SIM300 >> m128 i są krzaki,
    tak jak pisałem wcześniej w stronę m128 >> SIM300 działa poprawnie.

    0
  • #14 06 Kwi 2010 16:12
    jousto
    Poziom 16  

    u mnie krzaki to rzecz normalna i nie przejmuję się nimi.
    Zawsze będzie tak że do bufora coś wpadnie.
    Od czego są polecenia: InStr i ChKey i Mid?
    Ważne że między krzakami jest odpowiedź.

    0
  • #15 06 Kwi 2010 17:16
    robusta
    Poziom 15  

    aktualnie tak zrobiłem - zawsze na 1 pozycji jest krzak zatem MID i odcięcie pierwszego i jest w miarę dobrze - najgorsze jest tylko to, że wysyłając:

    (poniżej kod odbioru już trochę zmieniony (kanał 2 uarta m128 idzie w celach monitorowania na RX PCta))

    Code:

    Print #2 , "AT"
    Print "AT"
    Waitms 10
    If Ischarwaiting() = 1 Then
          Znak = ""
          Do
          Rs = Inkey()
          Znak = Znak + Chr(rs)
          If Rs = 13 Then Exit Do
          Loop
          Z = Mid(znak , 2 , 2)
          Print #2 , Z
    End If

    Wait 1

    Print #2 , "AT"
    Print "AT"
    Waitms 10
    If Ischarwaiting() = 1 Then
          Znak = ""
          Do
          Rs = Inkey()
          Znak = Znak + Chr(rs)
          If Rs = 13 Then Exit Do
          Loop
          Z = Mid(znak , 2 , 2)
          Print #2 , Z
    End If

    Wait 1

    Print #2 , "ATH"
    Print "ATH"
    Waitms 10
    If Ischarwaiting() = 1 Then
          Znak = ""
          Do
          Rs = Inkey()
          Znak = Znak + Chr(rs)
          If Rs = 13 Then Exit Do
          Loop
          Z = Mid(znak , 2 , 2)
          Print #2 , Z
    End If
    Wait 1


    dostaję potwierdzenie OK po pierwszym AT, potem cisza i po ATH znowu OK - generalnie można powiedzieć, że przychodzi co drugie potwierdzenie, po ponownym naciśnięciu guzika G1 aby wysłać znowu, po pierwszym AT jest pusto, po drugim jest OK i po ATH znowu pusto itd. itd.

    to mnie martwi najbardziej - tak jak mówisz, krzaki zawsze mogę odciąć ale już nie odbierane "OK" to nie dobrze, nie dobrze...

    zastanawia mnie jedna rzecz, modem na pewno wysyła CR+LF (13 10) ja wychodzę z pętli przy wartości 13 - czy 10 może mi bruździć czy komendą Znak = "" przed pobieraniem jest czyszczone to? czy można to jeszcze wyczyścić inaczej?

    0
  • #16 06 Kwi 2010 19:45
    rpal
    Poziom 27  

    Nie wiem co Panowie wyczyniacie u siebie w tym basicu, używam C i odbiór w przerwaniach, dane są czyste bez żadnych śmieci czy krzaków.

    0
  • #17 06 Kwi 2010 21:34
    jousto
    Poziom 16  

    Ja też mam odbiór bufora na przerwaniu, wywoływanym co około 1 sek,
    śmieci się zdarzają, ale bardzo rzadko,
    nie zauważyłem natomiast gubienia odpowiedzi modemu

    Code:
    Odebrane = ""
    
      Do
       Ch = Inkey()
       Select Case Ch
           Case 0 : Exit Do                                       'nie ma nic to kończ pętlę
           Case 13 : Call Wysw                                  'jeśli enter to wyświetla linię
           Case 10 :                                                'jeśli LF to nie rób nic, pomijaj
           Case Else
             Odebrane = Odebrane + Chr(ch)
             Text = Odebrane
        End Select

      Loop

    0
  • #18 23 Cze 2010 23:03
    robusta
    Poziom 15  

    dziękuję bardzo za podpowiedzi, temat okazał się znacznie prostszy - przyznam, że nie doczytałem w PDFie, że odpowiedź z modemu GSM wygląda następująco:
    <ENTER><odpowiedź><ENTER>
    zatem wychodzenie z pętli po pierwszym enterze było w tym przypadku bez sensu bo dane dopiero wchodziły do bufora, a gdy dane nie były buforowane lub nie było czyszczenia bufora po odczycie to przy kolejnej próbie odczytu siedziały tam jeszcze dane z poprzedniej odpowiedzi...
    jeszcze raz dziękuję za odpowiedzi i temat zamykamy,
    pozdr.
    Przemo

    0