PDA

Επιστροφή στο Forum : Έλεγχος GSM modem από PIC



geepal
21-04-10, 12:03
Προσπαθώ να ελέγξω με ΑΤ εντολές ένα modem της Wavecom (Fastrack Supreme 10) από ένα κύκλωμα με τον PIC16F688 για να κάνει αποστολή δεδομένων μέσω GPRS.

Όλες τις λειτουργίες που θέλω να κάνει το μόντεμ όπως εκκίνηση GPRS session, άνοιγμα socket στον server και αποστολή δεδομένων τα κάνω χωρίς πρόβλημα από το HyperTerminal.
Για να δω αν το μόντεμ μπορεί να λάβει ΑΤ εντολές από άλλη πηγή έγραψα ένα πρόγραμμα στο PC για να στείλε μία ΑΤ εντολή(εισαγωγή του pin AT+CPIN=xxxx) σαν string και με κάθε byte ξεχωριστά (σαν ASCII) και το μόντεμ το λαμβάνει χωρίς πρόβλημα(έχει ένα LED που αναβοσβήνει αν μπει στο δίκτυο).

Από τον μικροελεγκτή δοκίμασα σε assembly να στείλω αυτήν την εντολή κάθε byte ξεχωριστά. Σε πρόγραμμα στον Η/Υ βλέπω ότι όλα τα bytes φτάνουν στο προορισμό τους μέσω σειριακής, αλλά το συνδέσω στο μόντεμ, εκείνο δεν ανταποκρίνεται.
Δοκίμασα ακόμα :

1)Nα συνδέσω τα CTS και RTS με τον μC, στέλνοντας από τον PIC λογικό 1 από την πόρτα για το RTS και διαβάζοντας την πόρτα για το CTS) αλλά και πάλι δεν τα καταφέρνω.

2)Βραχυκύκλωσα το CTS με το RTS και το DTR με το DSR (διάβασα ότι έτσι "ξεγελάω το modem ότι έχει έλεγχο ροής από το DTE), αλλά και πάλι τίποτα.

Από ότι έχω παρατηρήσει το πρόβλημα βρίσκεται στο κύκλωμα. Είναι θέμα firmware ή πρέπει να αλλάξω κάτι στο ίδιο το κύκλωμα;

lastid
21-04-10, 12:46
Δεν αναφέρεις τίποτε για το κύκλωμα. Να υποθέσουμε ότι χρησιμοποιείς MAX232? Χρησιμοποιείς τα TX, RX και ποια από τα control signals?
Αν το πρόβλημα είναι hardware handshaking, μπορείς να δοκιμάσεις όλους τους τρόπους σύνδεσης που περιγράφονται στη σελίδα http://www.lammertbies.nl/comm/info/RS-232_null_modem.html.

klik
21-04-10, 14:44
Εχεις υποθέτω επιλέξει ίδια ταχύτητα μεταξύ PIC και modem.

Περιμένεις κάποιο χρόνο (1-2 sec) μετα το power on για να κάνει init το modem και να μπορεί να δεχθεί εντολές AT;

Εχεις δει στις προδιαγραφές του modem αν θέλει να επιλέξεις τρόπο handshake;

Αντι για modem συνδεσε τη σειριακή απο ένα PC για να δεις αν στέλνεις σωστά τα δεδομένα απο το κύκλωμα. Το καλώδιο που θέλει το modem είναι MODEM cable (1-1), αλλά βέβαια έχει σημασία πως έχεις συνδεσει το D9 στο MAX (π.χ. ένα σχέδιο (http://www.hlektronika.gr/forum/showpost.php?p=352749&postcount=26)).

geepal
22-04-10, 18:13
Δεν αναφέρεις τίποτε για το κύκλωμα. Να υποθέσουμε ότι χρησιμοποιείς MAX232? Χρησιμοποιείς τα TX, RX και ποια από τα control signals?
Αν το πρόβλημα είναι hardware handshaking, μπορείς να δοκιμάσεις όλους τους τρόπους σύνδεσης που περιγράφονται στη σελίδα http://www.lammertbies.nl/comm/info/RS-232_null_modem.html.

Για την επικοινωνία μεταξύ κυκλώματος-modem αρχικά χρησιμοποίησα μόνο τα Tx και Rx pins πριν από τους δύο τρόπους που επιπλέον δοκίμασα.
Την επικοινωνία μεταξύ μικροελεγκτή και σειριακή θύρας στο κύκλωμα την έχω γεφυρώσει με μια πύλη ΝΟΤ για αντιστροφή των σημάτων (ναι, ειναι ανορθόδοξο αλλά δουλεύει).
Μετά πρόσεξα στο manual του modem ότι απαιτεί για την λειτουργία του τα Tx,Rx,CTS και RTS(τα υπόλοιπα στην σειριακή θύρα είναι προαιρετικά).
Με τις δοκιμές που περιέγραψα στο προηγούμενο post είμαι σίγουρος ότι το πρόβλημα είναι η αναγνώριση των ΑΤ εντολών από το μικροελεγκτή στο μόντεμ απευθείας, δλδ το hardware handshake.
Είχα ξαναδεί αυτήν την σελίδα και έχω δοκιμάσει όλες τις συνδέσεις εκτός από το partial handshaking. Πώς το υλοποιώ αυτό; Τα σήματα CTS,RTS,DTR και DSR τα συνδέω στις πόρτες του μικροελεγκτή; Αν ναι, τι αλγόριθμο χρειάζεται να υλοποιήσω στο πρόγραμμα που θα τρέχει για την αποστολή των ΑΤ εντολών από αυτόν στο modem?


Εχεις υποθέτω επιλέξει ίδια ταχύτητα μεταξύ PIC και modem.

Περιμένεις κάποιο χρόνο (1-2 sec) μετα το power on για να κάνει init το modem και να μπορεί να δεχθεί εντολές AT;

Εχεις δει στις προδιαγραφές του modem αν θέλει να επιλέξεις τρόπο handshake;

Αντι για modem συνδεσε τη σειριακή απο ένα PC για να δεις αν στέλνεις σωστά τα δεδομένα απο το κύκλωμα. Το καλώδιο που θέλει το modem είναι MODEM cable (1-1), αλλά βέβαια έχει σημασία πως έχεις συνδεσει το D9 στο MAX (π.χ. ένα σχέδιο (http://www.hlektronika.gr/forum/showpost.php?p=352749&postcount=26)).

Και το modem και το κύκλωμα λειτουργούν στα 115200bps.
Το μόντεμ είναι ήδη έτοιμο να δεχτεί εντολές, σε αυτήν την φάση ανάπτυξης έχει διαφορετική πηγή τροφοδοσίας από το κύκλωμα.

Κάθε βοήθεια είναι ευπρόσδεκτη παρακαλώ γιατί έχω φάει 2 βδομάδες με αυτό το θέμα.

lastid
22-04-10, 22:58
Αν λοιπόν το manual του modem αναφέρει μόνο τα CTS,RTS, αυτά και μόνο θα χρησιμοποιήσεις.
Έχεις δύο επιλογές:

1.
RTS_PIC -> CTS_modem και RTS_modem -> CTS_PIC.
Θα πρέπει όμως και να γράψεις software στον PIC που να χρησιμοποιεί τα RTS,CTS.

2.
RTS_modem -> CTS_modem
Το οποίο και είναι το απλούστερο.
Βλέπε και http://www.zytrax.com/tech/layer_1/cables/heavy.htm, παράγραφος "It gets worse".

geepal
22-04-10, 23:12
Αν λοιπόν το manual του modem αναφέρει μόνο τα CTS,RTS, αυτά και μόνο θα χρησιμοποιήσεις.
Έχεις δύο επιλογές:

1.
RTS_PIC -> CTS_modem και RTS_modem -> CTS_PIC.
Θα πρέπει όμως και να γράψεις software στον PIC που να χρησιμοποιεί τα RTS,CTS.

2.
RTS_modem -> CTS_modem
Το οποίο και είναι το απλούστερο.
Βλέπε και http://www.zytrax.com/tech/layer_1/cables/heavy.htm, παράγραφος "It gets worse".

Χμ δεν ξέρω αν αυτό θα κάνει κάτι.
Οι 2 αυτοί τρόποι που περιγράφεις μοιάζουν με τις 2 προσπάθειες που έκανα πέρα από τη βασική σύνδεση μόνο με Tx και Rx που έγραψα στο 1ο post.
Μάλλον δεν εξήγησα καλά αυτά που γράφω. Στη προσπάθεια 2 αυτό που έκανα είναι: πάνω στο κύκλωμα, στο βύσμα της σειριακής, γεφύρωσα το pin του RTS με αυτό του CTS. Έτσι κλείνω το κύκλωμα αυτών των 2 ακίδων από τη μεριά του modem.
Η άλλη προσπάθεια που έκανα είναι ακριβώς το 1ο που μου προτείνεις.
Έχω ήδη κάνει δλδ και τα 2. Υπάρχει κάτι άλλο που μπορώ να κάνω;

stom
22-04-10, 23:31
Και το modem και το κύκλωμα λειτουργούν στα 115200bps.
Το μόντεμ είναι ήδη έτοιμο να δεχτεί εντολές, σε αυτήν την φάση ανάπτυξης έχει διαφορετική πηγή τροφοδοσίας από το κύκλωμα.

Κάθε βοήθεια είναι ευπρόσδεκτη παρακαλώ γιατί έχω φάει 2 βδομάδες με αυτό το θέμα.

115200?
Υπερβολικα μεγαλη ταχυτητα για τετοια εφαρμογη.
Πιθανον να εχεις διαφορα overrun δοκιμασε κατι πιο standard, πχ 9600...

Αυτο με την πυλη not δεν το καταλαβα...
Και πρωτου μιλησεις στο modem, θα πρεπει μεσω loopback να βεβαιωθεις οτι διαβαζεις πισω αυτα που στελνεις, ετσι για αρχη.
Το επομενο βημα ειναι να μιλησεις στο hyperterminal στο pc, μετα να λαβεις κατι απο το πληκτρολογιο του hyperterminal και στη πορεια θα βαλεις και το modem....
Χρησιμοποιεις καποια βιβλιοθηκη? interrupts? polling?
Χρησιμοποιεις uart η παιζεις με pin?
Και τελος, με assembly εχει καμποσο γραψιμο... ισως κατι πιο high level να ειναι ευκολοτερο.
Τελος ειπες τη μαγικη λεξη socket..
Αυτο αναφερεται σε tcp-ip... πες μου οτι δεν ειναι γιατι δεσαμε.....

klik
23-04-10, 09:06
Τα 115200 είναι πολλά για να διαβάσει ο PIC αξιόπιστα και σχεδόν αδύνατο να τα διαβάσει χωρίς hardware handshake, διότι οι εντολές χειρισμού πίνακα (με τον register δείκτη) μαζί με τους υπολογισμούς θέσης, κοστίζουν αρκετά σε χρόνο, οπότε αν έρθει κανένα burst χαρακτήρων, πιθανόν θα χάσει κάποιους.

Στην αποστολή όμως δεν θα έχει πρόβλημα.

Δεν έχεις ενημερώσει τι γίνεται με αυτό:

...Αντι για modem συνδεσε τη σειριακή απο ένα PC για να δεις αν στέλνεις σωστά τα δεδομένα απο το κύκλωμα....

Αυτό με την πύλη ούτε εγώ το κατάλαβα... αν είχες τάση +-12V, θα μπορούσες να χρησιμοποιήσεις πύλες αντί για max232 (ή άλλο level converter/shifter).

Μπορείς να κάνεις και υποκλοπή: να συνδέσεις την ακίδα RX απο τη σειριακή του pc και να βλέπεις τι πέρνει το modem ή τι επιστρέφει.

geepal
23-04-10, 10:12
115200 bps χρησιμοποιώ αναγκαστικά γιατί το modem επικοινωνεί με άλλες συσκευές(PC ή άλλο κύκλωμα) σε αυτό το baud rate.
Η πύλη ΝΟΤ είναι ένας πιο απλός τρόπος για αντιστροφή των σημάτων ΤΤL σε RS-232. Με αυτόν τον τρόπο δεν χρειάζονται πυκνωτές. Το μόνο που χρειάζεται είναι μια αντίσταση στο Rx του μικροελεγκτή πριν τη πύλη για προστασία
Το κύκλωμα το έχω ήδη συνδέσει στο PC και παρατήρησα τα δεδομένα φτάνουν ακριβώς όπως τα έχω γράψει στο κώδικα, ένας-ένας οι χαρακτήρες της εντολής AT+CPIN=xxxx σε μορφή ASCII. Είναι κώδικας σε πολύ απλή μορφή και το ανέβασα να το δείτε. Με αυτό το θέμα ευτυχώς δεν έχω πρόβλημα.
Το socket δεν έχει σημασία για το κώδικα του PIC, γιατί το TCP/IP stack είναι μέσα στο modem οπότε όλο το δικτυακό μέρος το αναλαμβάνει εκείνο(αφού μπορώ και το κάνω μέσω του HyperTerminal χωρίς το κύκλωμα).
Το κύκλωμα το θέλει το modem για να δέχεται τις ΑΤ εντολές και να γυρίσει σε data mode(με την αποστολή της αλληλουχίας +++) για να δεχτεί τα δεδομένα και μετά να γυρίσει σε ΑΤ mode πάλι με +++.

Οπότε το πρόβλημά μου μένει στο hardware handshaking του κυκλώματος για το οποίο δεν έχω βρει λύση. Συνολικά έχω δοκιμάσει μέχρι τώρα τα εξής πάνω στο κύκλωμα:

1)Μόνο Rx και Τx.

2)Σύνδεση 2 ακίδων(ports) από τον PIC στα CTS και RTS. Τον κώδικα τον άλλαξα έτσι ώστε να φεύγει λογικό 1 από την ακίδα που είναι συνδεδεμένη στο RTS της σειριακής και να διαβάζει την ακίδα που είναι συνδεδεμένο στο CTS της σειριακής. Αν λάβει κάτι, στέλνει την ΑΤ εντολή.

3)Γεφύρωση του RTS με το CTS και επιπλέον του DTR με το DSR της σειριακή.
Και τα 3 απέτυχαν.

klik
23-04-10, 12:04
επειδη αυτό που έχεις κάνει για σύνδεση με τις NOT δεν είναι σίγουρο ότι καλυπτει τις προδιαγραφές του rs232, ανέβασε ένα απο τα παρακάτω:
α) σχηματικό της συνδεσης που να φαίνονται και οι τάσεις τροφοδοσίας που χρησιμοποιείς

ή

β) τι τάση βγάζει η ακίδα TX στο βύσμα D9 (αμέσως πρις το περάσεις στο modem), όταν στέλνεις 0 και όταν στέλνεις 1.
(δεν χρειάζεται μικροελενκτή για να το μετρήσεις αυτό, απλά με βγαλμένο μικροελενκτη, δίνεις στη βάση του μια φορά 0V και μια 5V στην ακίδα TX και μετρας με πολύμετρο τις 2 τιμές στην έξοδο).
Θα βόλευε να έχουμε και το αντίστοιχο για το RX. Βραχυκύκλωσε στο D9 τις ακιδες 2και3 και για τις τιμές που στέλνεις απο το TX (0 ή 1), δες αν έχεις ίδιες τιμές στην ακίδα RX στη βάση του μικροελενκτη (έχει γίνει ένα loopback έτσι).

(Οταν προλάβω θα δω και το listing)

lastid
23-04-10, 13:38
Αν στέλνει ο PIC προς το modem και το modem δεν είναι έτοιμο, πως θα του πει "Περίμενε"? Μόνο με σύνδεση RTS και CTS μεταξύ τους, χωρίς loopback. Άρα πρέπει να ανεβάσεις και τον κώδικα που έγραψες για την περίπτωση αυτή. Όπως και τον κώδικα της Initialise.

Edit:
Αναφέρεις επίσης, αν κατάλαβα καλά, ότι έκανες επιτυχείς δοκιμές σύνδεσης PC - modem και PC - PIC. Μπορείς να το πας λοιπόν ανάποδα: Πειράζεις τις ρυθμίσεις του PC (π.χ. handshaking) μέχρι να χαλάσει η επικοινωνία. Κυρίως για την σύνδεση PC - modem.

geepal
01-05-10, 19:15
Λοιπόν, η συνδεσομολογία είχε προβλήματα οπότε έφτιαξα νέο κύκλωμα. Χρησιμοποίησα αυτή τη φορά MAX232 και ανέβασα και το σχηματικό (οι 2 πυκνωτές στο κρύσταλλο είναι 22nF ο καθένας).
Ο κώδικας σε assembly είναι ο εξής:


LIST P=16F688
INCLUDE P16F688.INC
INCLUDE INITMC.ASM
ERRORLEVEL -302,-205,-207

__CONFIG _FCMEN_OFF & _IESO_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC

ORG H'00'
GOTO RESET

ORG H'20'
RESET CALL INITIALIZE

BSF PORTA,2 ;rts
BTFSS PORTC,3 ;check if a cts has arrived
GOTO $-1 ;else check again
MOVLW 'A'
MOVWF TXREG
CALL TXWAIT
MOVLW 'T'
MOVWF TXREG
CALL TXWAIT
MOVLW '+'
MOVWF TXREG
CALL TXWAIT
MOVLW 'C'
MOVWF TXREG
CALL TXWAIT
MOVLW 'P'
MOVWF TXREG
CALL TXWAIT
MOVLW 'I'
MOVWF TXREG
CALL TXWAIT
MOVLW 'N'
MOVWF TXREG
CALL TXWAIT
MOVLW '='
MOVWF TXREG
CALL TXWAIT
MOVLW 0x31 ;1
MOVWF TXREG
CALL TXWAIT
MOVLW 0x32 ;2
MOVWF TXREG
CALL TXWAIT
MOVLW 0x33 ;3
MOVWF TXREG
CALL TXWAIT
MOVLW 0x34 ;4
MOVWF TXREG
CALL TXWAIT
MOVLW 0x0D ;CR
MOVWF TXREG
CALL TXWAIT
BCF PORTA,1
GOTO $
TXWAIT BTFSS TXSTA,TRMT
GOTO $-1
RETURN
END


και το αρχείο initmc.asm είναι το εξής:


ERRORLEVEL -302,-205,-207

ORG H'50'
INITIALIZE
MOVLW B'00000111' ;ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ ΣΥΓΚΡΙΤΗ
MOVWF CMCON0
MOVLW B'00011001' ;CHANNEL 6, AtoD ON
MOVWF ADCON0
BSF STATUS,RP0
BCF TRISA,2 ;PORTA,1 OUTPUT
BSF TRISC,3 ;PORTC,3 INPUT
MOVLW B'01110000' ;ΕΚΤΟΣ ΤΩΝ ΑΝ4-6 ΟΙ ΑΛΛΕΣ ΑΝΑΛΟΓΙΚΕΣ ΕΙΣΟΔΟΙ ΝΑ ΜΕΤΑΒΟΥΝ ΣΕ ΨΗΦΙΑΚΕΣ
MOVWF ANSEL
MOVLW B'01010000' ;Fosc/16,ΡΥΘΜΟΣ ΜΕΤΑΤΡΟΠΗΣ
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'00100110' ;TX ENABLE,HIGH SPEED
MOVWF TXSTA
MOVLW B'10010000'
MOVWF RCSTA ;ΕΝΕΡΓΟΠΟΙΗΣΗ ΣΕΙΡΙΑΚΗΣ,ΛΗΨΗ
MOVLW B'00001000' ;16BIT BAUD GENERATOR
MOVWF BAUDCTL ;
MOVLW D'8' ;115200BPS
MOVWF SPBRG
RETURN


Το δοκίμασα αρχικά συνδέοντας το κύκλωμα στο PC και λαμβάνει χωρίς πρόβλημα την ακολουθία των χαρακτήρων.
Μέτρησα επίσης τη τάση στο pin Tx στο βύσμα DB9 και έχει τιμή 4.3V αν δώσω 1 στο Tx pin του PIC και 0.09V αν δώσω 0.

Παρ'όλα αυτά αν το συνδέσω με το modem δεν καταφέρνω να το κάνω να δεχτεί την ΑΤ εντολή για να μπει στο δίκτυο.
Παρατήρησα επίσης κάτι ακόμα: τα pin 2 και 6 στο MAX232 δίνουν έξοδο -14 με -16.4V και τα 2 αντί για 8.5V και -8.5 αντίστοιχα όπως αναφέρει το datasheet. Γιατί συμβαίνει αυτό;