|
|
|
![]() |
|||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||||||
|
||||||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
angelole
|
16f876 e TC35 (codice Mikrobasic)
Dovrei realizzare un circuito con un pic 16f876 da connettere ad un modulo gsm TC35, via RS232. Il codice del pic lo vorrei realizzare in mikrobasic.
Uno dei problemi che mi pongo è questo. All'arrivo di una chiamata telefonica il modulo gsm invia, per ogni squillo, le seguenti informazioni: RING +CLIP: "+393478798XXX",145,,,,0 Arrivati tali dati alfanumerici, dovrei immediatamente estrapolare dagli stessi il numero telefonico compreso tra virgolette, per collocarlo in una apposita variabile. Non mi è chiaro come procedere. Mi potete fornire aiuti in tal senso. grazie |
|
|
|
| Advertising | |
|
|
|
|
|
#2 | |
|
Registered User
|
Quote:
grazie. |
|
|
|
|
|
|
#5 |
|
Registered User
|
comandi AT
ecco qui il manuale dei comandi AT del tc35 RapidShare: 1-CLICK Web hosting - Easy Filehosting
|
|
|
|
|
|
#7 |
|
Mod insubrico
|
Premesso che non conosco il mikrobasic e mai vorrò cimentarmici, trovo la tua domanda una questione di programmazione e basta, in particolare la manipolazione di stringhe. Credo che qualsiasi tutorial di basic e di mikrobasic ti darà la risposta che cerchi.. Per esempio, sai che la tua stringa comincia per CLIP: " , tutto quello che segue fino alle prossime virgolette é il numero che ti interessa, di più non so che dirti..
__________________ |
|
|
|
|
|
#8 |
|
Tuned Moderator
|
Come dice Rock, il tuo problema è di banale programmazione... Devi realizzare un bufferino software di dimensione opportuna, all'interno del quale salvare le stringhe ricevute per poi analizzarle. Le risposte ai comandi AT hanno un formato classico, del tipo +<comando> = <param1>,<param2>,...,<paramn>, si tratta solo di "intercettare" determinati caratteri di separazione (la virgola, ad esempio). Io ho realizzato la stessa cosa in PicBasicPro, con 3 istruzioni fai tutto
__________________![]() |
|
|
|
|
|
#9 |
|
angelole
|
Grazie ragazzi, di solito scrivo i miei codici in assembly ma questa volta ho necessità di usare il mikrobasic, che non conosco granchè bene.
Tra l'altro è la prima volta che mi trovo a gestire le stringhe. Vediamo se ho capito almeno il concetto: in poche parole il buffer mi consente di "conservare" le stringhe ricevute per poi analizzarle, sapendo che, ciò che mi interessa, si trova ad esempio tra due virgole e quindi in una posizione ben precisa. Quindi il buffer devo intenderla come una o meglio più variabili opportunamente dimensionate? Ho provato a vedere sul libro di Di Maria (programmazione basic per pic) ma non mi pare d'avere trovato nulla di importante!!! dovrei reperire altro materiale, cosa mi suggerite? Naimah potresti scrivermi il tuo esempio in picbasic? Anche in trasmissione ritengo di avere gli stessi problemi. |
|
|
|
|
|
#10 |
|
Registered User
|
io con picbasic ho usato questa stringa :
MITT VAR BYTE[20] HSERIN 5000,NOCELL1,[WAIT ("+CLIP: "),skip 1, str mitt\13 ] oppure: HSERIN 5000,NOCELL1,[WAIT ("+CLIP: "),tmp,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8,tmp9,tmp10,tmp11,tmp12,tmp13 ] mitt[1]=tmp1 mitt[2]=tmp2 mitt[3]=tmp3 mitt[4]=tmp4 mitt[5]=tmp5 mitt[6]=tmp6 mitt[7]=tmp7 mitt[8]=tmp8 mitt[9]=tmp9 mitt[10]=tmp10 mitt[11]=tmp11 mitt[12]=tmp12 mitt[13]=tmp13 |
|
|
|
|
|
#11 |
|
Tuned Moderator
|
Dovrebbe essere in una discussione sul forum, tuttavia la sostanza è identica al codice postato da Zenite
__________________ In effetti, PBP è molto comodo quando si deve lavorare con le stringhe ![]() |
|
|
|
|
|
#12 |
|
angelole
|
Ok, sto iniziando a sbatterci su la testa... unico modo per capire qualcosa.
Sto effettuando delle prove in ordine ad alcune discussioni lette su questo forum. Tramite una funzione interna riesco adesso a filtrare tutto ciò che sta alla destra di un determinato carattere (ad esempio delim = ">"); questo mi permette di effettuare un primo filtro, ecco il codice: Codice:
program usart_new
dim delim as string[1]
dim data as string[6]
delim = ">"
usart_init(9600)
ADCON0=%00000000
ADCON1=%10000111 'Settaggio digitale - vedi conv ADC
trisa=%000000 'tutti input
porta=0
trisb=%00000001
portb=0
lcd_init(portb) 'Inizializza Portb
lcd_cmd(LCD_Clear) 'Cancella display
lcd_cmd(LCD_CURSOR_OFF) 'Cursore OFF
inizio:
WHILE (True)
if usart_data_ready = 1 then
usart_read_text(data, delim)
delay_ms(30)
lcd_out(2,1,data)
end if
wend
end.
|
|
|
|
|
|
#13 |
|
angelole
|
Mi sono imbattuto in un altro strano problema.
Dovrei inviare , tramite rs232, una stringa seguita da INVIO, quest'ultimo carattere, se non sbaglio, dovrebbe corrispondere a chr(13). Non capisco perchè, se visualizzo con hyperterminal l'invio di tale stringa seguita da INVIO, il cursore mi torna all'inizio della stringa (riscrivendola) e non a capo!!! Qualcuno mi può dire dove sbaglio... grazie |
|
|
|
|
|
#15 |
|
angelole
|
Qualcuno mi può indicare il significato di queste istruzioni:
Codice:
main: while true if Usart_Data_Ready = 1 then usart_read_text(data) ......... ........ end if wend Codice:
main: while true if Usart_Data_Ready = 1 then usart_read(data) ......... ........ end if wend |
|
|
|
|
|
#16 |
|
angelole
|
Allora... sto facendo dei passi avanti..
Ho scritto il seguente codice che funziona in parte. Purtroppo non riesco a comprendere perchè, durante la ricezione perdo o non visualizzo correttamente dei caratteri, stante che il debugger non mi dà errori? Chi mi da una mano? Codice:
program debugger2
dim receive as byte
dim i as byte
main:
usart_init(9600)
ADCON0=%00000000
ADCON1=%10000111 'Settaggio digitale - vedi conv ADC
trisa=%111111 'tutti ingresso
porta=0
trisb=%00000001
portb=0
trisc=%110111 'registro tris 0=uscita; 1=ingresso
portc=0
lcd_init(portb) 'Inizializza Portb
lcd_cmd(LCD_Clear) 'Cancella display
lcd_cmd(LCD_CURSOR_OFF) 'Cursore OFF
inizio:
i=1
while true
if usart_data_ready = 1 then
receive = usart_read
lcd_chr(1,(i),receive)
i = i +1
end if
wend
end.
|
|
|
|
|
|
#17 |
|
Registered User
|
Salve, anche io stò cercando di collegare il moduto tc35 con in pic 16f876, utilizzando lo schema di Zenite (modulo tc35 sbloccato), sono riuscito ad avere tutti i comandi AT disponibili, infatti lo stesso funziona benissimo tramite rs232 e max232 collegato al PC, ora perà vorrei fare un software in MikroBasic per il controllo dello stesso modulo, lo stesso può essere collegato direttamente al pic.
Te come l'hai collegato al pic tramite rs232 e max232, oppure direttamente, riesci ad inviare qualche comando al modulo, oppure visualizzare tramite lcd l'uscita del modulo. Se mi puoi dare dei suggerimenti. Grazie. |
|
|
|
|
|
#18 |
|
angelole
|
Allora... prima di collegare il pic al modulo, sto cercando di capire il funzionamento della usart del 16f876 tramite un max 232 e un lcd 2x16. Soltanto dopo aver testato correttamente il software mi occuperò della parte hw che, a dire il vero, mi sembra il problema minore...
|
|
|
|
|
|
#19 |
|
Registered User
|
Ti invio questo codice in MikroBasic, che tramite la RS232 riceve dati e li visualizza sull'LCD e tramite un pulsante invia un comando tramite la RS232, è stato provato collegando il PIC al PC tramite RS232 utilizzando il MAX232, e tramite poi un terminale seriale funziona benissimo.
Ora al posto del PC si dovrebbe mettere il modulo TC35, ma come collegare questo modulo tramite un ulteriore MAX232, o direttamente a RC6 e RC7? --inizio codice -- program seriale_Usart dim i, l, il, i1,m,ln as byte dim numch, textch, tx as char[16] dim code as char[7] sub procedure invio() 'Invia comando AT tramite USART tx="AT+CREG?" ln=strlen(tx) for m = 0 to ln-1 USART_Write(tx[m]) next m USART_Write(13) end sub main: ADCON1=$86 'Disabilita gli ingressi analogici TRISC=0 PORTC=0 TRISA=%001111 PORTA=0 Lcd_Init(PORTB) 'Display LCD sulla porta B Lcd_Cmd(Lcd_CURSOR_OFF) USART_init(9600) 'Inizializza l'USART a 9600 i1=0 while TRUE ' Lettura da RS232 if (USART_Data_Ready()) then il = USART_Read() if il<>13 then 'riempe la stringa textch fino al carattere CR (13) textch[i1]=il i1=i1+1 end if end if if (il=13) then 'terminata la ricezione ovvere fino al carattere CR visualizza sull'LCD la stringa ricevuta Lcd_Cmd(LCD_CLEAR) for l = 1 to i1 lcd_chr(2,l,textch[l-1]) next l il="" textch="" i1=0 end if if porta.0=1 then 'Pulsante sulla portA 0 portc.1=1 'Accende led sulla portC 1 invio() 'Richiama la procedura invia() dichiarata all'inizio while porta.0=1 ' antirepeat wend end if wend end. |
|
|
|
|
|
#20 |
|
Registered User
|
paolo ti ripeto che a me funziona benissimo collegato direttamente alle porte del pic,perchè in ingresso il pic legge dai 2.0V in su,quindi in riccezione non ci sono problemi, e nemmeno in trasmissione perchè come ti ho detto quel modulo ha un integrato (74lvh244)che si occupa di portare i 5V del pic a 3V.Altrimenti per stare proprio sicuro usa il max che gia hai per fare la comunicazione.
|
|
|
|
![]() |
Per le vostre immagini su questo forum potete usare PcTunerUp! Iscriviti gratuitamente alla nostra newsletter. |
| Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori) | |
| Strumenti Discussione | |
| Modalità Visualizzazione | |
|
|