 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
digital Član

Pridružen-a: Ned 08 Jun 2008 23:11 Prispevkov: 253 Aktiv.: 1.22 Kraj: Slovenska Bistrica
|
Objavljeno: Ned Feb 21, 2010 9:09 pm Naslov sporočila: gsm modul A2D1, serijska komunikacija in reset |
|
|
Imam novo igračko, deluje lepo. Sicer sem se namučil, preden sem postal domač z at komandami in serijsko komunikacijo, pri tem mi je bil bray-ev terminal v veliko pomoč, da sem potem naredil program v Bascomu, ki zna pošiljat komande modemu in brati odzive. Nisem pa uspel realizirat dveh stvari.
1
V datashetu je navedeno, da lahko reset izvedemo tako, da sklenemo pin RX z maso za več kot 100 ms. No to mi ne dela - ne zgodi se nič, deluje pa reset tipka na modemu in tudi preko AT ukaza deluje. Omenjenega pa bi rabil zato, ker občasno kontroler pošlje naprimer AT in če ne dobi odgovora, bi ga v tem primeru resetiral. AT ukaz za reset mi v tem primeru (serijski port modema se ne odziva) ne pomaga.
2
Bilo bi vredu, če bi omenjeni kontroler lahko komuniciral še s kakšno drugo napravo (mikrokontroler) v hiši. Sem raziskal še rs 485. Zanima pa me varianta multimaster, pa ne bi rad (zaenkrat) začel s CAN. Normalen način delovanja multimaster sistema je zaznavanje trkov, razmišljam pa o varianti za preprečevanje trkov. RS485 rabi le eno parico, (rs422 dve) v f t p kablu pa so 4 parice in bi lahko uporabil katero za zaznavanje zasedenosti vodila - vsaka naprava bi začela oddajat če je vodilo prosto in ga tedaj rezervira in sprostila ko konča. Glede na to, da ne bo veliko "prometa" bi lahko oddajal brez preverjanj, pa bi vseeno rad naredil "ziher" varianto. Sicer pa sem navdih za multimaster dobil od Vilkota, ko sem čital njegove prispevke. Sicer sem našel tudi variante za zaznavanje trkov: omogočen sprejem hkrati z oddajanjem - in če oddajani in sprejemni "frame" ni enak je prišlo očitno do popačenja - oddajanja več naprav hkrati, potem je potrebna rutina za ponoven poskus oddajanja, ..., pa se mi zdi lažja varianta z dodatno žico. OK, še lažja varianta je z enim master in ostalaimi slave, vendar če je kdo pripravljen podati kakšno svojo rešitev ali izkušnjo bo mogoče koristilo še marsikomu na forumu.
lp |
|
Nazaj na vrh |
|
 |
gral Član


Pridružen-a: Pon 11 Jan 2010 18:07 Prispevkov: 15 Aktiv.: 0.08 Kraj: Ljubljana
|
Objavljeno: Ned Feb 21, 2010 9:24 pm Naslov sporočila: |
|
|
"program v Bascomu, ki zna pošiljat komande modemu in brati odzive" To bi tudi mene zanimalo. Imam namreč ta modem in testno ploščo z RS232. _________________ gral |
|
Nazaj na vrh |
|
 |
eddie Član

Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 723 Aktiv.: 3.05 Kraj: Severna primorska
|
Objavljeno: Ned Feb 21, 2010 10:25 pm Naslov sporočila: |
|
|
Če imaš možnost poslušanja kaj oddajaš potem si lahko "sposodiš" mehanizem, ki ga ima CAN(ker si ga ravno omenil).
1. postaje so sinhronizirane na začetek oddaje (če pride do tega da dve napravi zasedeta vodilo ga zasedeta obe v točno določenem trenutku)
2. Prvo se na vodilo pošlje ID številko postaje ki oddaja(ta številka določa prioriteto postaje - nižja kot je višja je prioriteta postaje)
Če pride do tega da dve postaji zasedeta vodilo, oddajata ID številko (npr IDja 111 in 110 binarno) in poslušata kaj je bilo oddano na vodilu. Postaja z nižjo ID prej odda ničlo, kar druga postaja tudi zazna- oddala je 1 na vodilu pa je prebrala 0!
To pomeni da je na vodilu še nekdo ki oddaja in je bolj pomemben. Postaja z nižjo prioriteto odneha z oddajanjem, tako da prva postaja sploh ne ve da je oddajal še nekdo drug!
Tako do trkov sploh ne pride!
To je zelo poljudno napisano - lahko tudi ne v detaje pravilno - a vendar mislim da je princip jasen.
Lep dan! |
|
Nazaj na vrh |
|
 |
digital Član

Pridružen-a: Ned 08 Jun 2008 23:11 Prispevkov: 253 Aktiv.: 1.22 Kraj: Slovenska Bistrica
|
Objavljeno: Ned Feb 21, 2010 11:01 pm Naslov sporočila: |
|
|
Program ni nič posebnega. Definiral sem input buffer, da se ne rabim ukvarjati z čitanjem iz USART-a, definiral podprogram za čitanje kaj prispe v buffer, in podprogram za čitanje in obdelavo SMS-a. RTC sem realiziral z dcf77, na PortD sem obesil 8 relejev, ravno danes pa sem dodal še merjenje temperature z ds1820. V planu imam še branje nekaj vhodov (on/off). Bom objavil program, ko bo končan, če se ti mudi, pa lahko dobiš inicializacijski del in podprograme za branje vnaprej.
lp |
|
Nazaj na vrh |
|
 |
digital Član

Pridružen-a: Ned 08 Jun 2008 23:11 Prispevkov: 253 Aktiv.: 1.22 Kraj: Slovenska Bistrica
|
Objavljeno: Ned Feb 21, 2010 11:12 pm Naslov sporočila: |
|
|
Eddie, ja res poljudno in razumljivo napisano. S čim so pa naprave sinhronizirane na začetek oddaje ? |
|
Nazaj na vrh |
|
 |
A.B. Član

Pridružen-a: Sob 24 Jan 2009 14:50 Prispevkov: 91 Aktiv.: 0.46
|
Objavljeno: Ned Feb 21, 2010 11:33 pm Naslov sporočila: |
|
|
V CAN-u se vsak začetek ovirja začne z 0 (SOF) in potem ID postaje. Ko imajo vse postaje v istem trenutku 0 so sinhronizirane. |
|
Nazaj na vrh |
|
 |
gral Član


Pridružen-a: Pon 11 Jan 2010 18:07 Prispevkov: 15 Aktiv.: 0.08 Kraj: Ljubljana
|
Objavljeno: Pon Feb 22, 2010 5:34 pm Naslov sporočila: |
|
|
"če se ti mudi, pa lahko dobiš inicializacijski del in podprograme za branje vnaprej."
Bi prosil, ja, da si malo pogledam, kako naj bi to šlo. _________________ gral |
|
Nazaj na vrh |
|
 |
klemen88 Član


Pridružen-a: Tor 01 Jan 2008 17:37 Prispevkov: 747 Aktiv.: 3.51 Kraj: Slovenj Gradec
|
Objavljeno: Tor Feb 23, 2010 5:10 pm Naslov sporočila: |
|
|
gral je napisal/a: |
"če se ti mudi, pa lahko dobiš inicializacijski del in podprograme za branje vnaprej."
Bi prosil, ja, da si malo pogledam, kako naj bi to šlo. |
Lahko prilepiš na forum ali ZS?
Drugače glede reseta za modem. Stvar je takšna kot si napiso, modemu pošleš vsake toliko časa AT komando in videš, če se odziva. Če se ne ga resetiraš. A2D moduli imajo poleg napajanja ter GND tudi Ignition, da stvar deluje moraš na ta pin potegnit napajanje. In bi lahko preko kakšnega pina mikroprocesorja vezal rele ali tranzistor. In če se nebi odzval modul na AT komande bi mu lepo odvzel napetost za kratek čas in potem nazaj vklopil. |
|
Nazaj na vrh |
|
 |
digital Član

Pridružen-a: Ned 08 Jun 2008 23:11 Prispevkov: 253 Aktiv.: 1.22 Kraj: Slovenska Bistrica
|
Objavljeno: Tor Feb 23, 2010 9:36 pm Naslov sporočila: |
|
|
klpzm: Imaš parav, če ignition izklopiš iz napajanja ter vklopiš nazaj se izvede reset. Napajanje lahko ostane. Se mi zdi še boljša rešitev kot preko serijskega porta, saj bi tudi tukaj potreboval tranzistor ali rele, pa še napajanje max232 bi moral izklopiti.
Kar se tiče protokola za multimaster in RS458 pa sem se odločil, da se zaenkrat še ne bom ukvarjal s CAN-om. 485 se vsekakor splača naštudirat, saj je uporabljen kot layer1 v večih profesionalnih mrežnih komunikacijah - napr profibus, ... Ker rad delam stvari sam, bom že zaradi učnih namenov spacal nek protokol za multimaster (magari s tretjo žico). CAN pa pride na vrsto čez kakega pol leta (če bo čas).
Spodaj sem prilepil program. Je še v razvoju, vendar to kar sem objavil deluje. Skopiraj ga v Bascom, da bo bolje berljiv. Inicilalizacja se malo vleče, vendar je to namerno in izpisujem vse na lcd, kar pride v fazi razvoja zelo prav. Potem bom že pobrisal, kar je viška oz. nepotrebno. Temperaturo program zaenkrat bere s pritiskom na tipko (pind.2), končna verzija bo po potrebi stanje temperature pošiljala občasno, ob prekoračitvi določenega praga ali na zahtevo (klic, prejet sms), pa tudi case stavek v proceduri branja temperature še ni gotov. Če mogoče kdo ve za lažji način, kako spremenljivko integer spremeniti v string naj mi namigne. Tudi izhod PORTC zaenkrat prižiga le dve ledici. Seveda moram narediti še preverjanje delovanja in po potrebi reset. Pin kodo je bolje onemogočiti, vendar za to rabiš telefon. Ker nisem našel nobenega, ki bi sprejel novo kartico (070), sem pin vpisal kar s programom. V podprogramu za branje odziva modema je branje buferja narejeno s for zanko in ne z do-loop, kot v večini primerov na spletu, da program ne ostane v podprogramu, ko pride do nepričakovanih odzivov modema. Mislim, da je program dovolj komentiran, če pa bo kakšno vprašanje, pa ga lahko še dodatno pokomentiram.
V programu mi na dveh ali treh koncih piše da sem butl, idiot, konju jedan, glupan, ... za slovenščino. Evo take (takšne) gluposti pa pusti pisat. Modem ob prejetem Sms-u da odgovor v obliki : +CMTI: "S_M",10 - no tisti S_M mora biti brez vezaja spodaj, cenzura pa mi to ne pusti objavit ker očitno kljub temu da je beseda v narekovaju misli, da bi moralo pisati : sem .
lp
Koda: |
'------------------------------------------------------------------------------
' sprejem SMS in krmiljenje portC.BAS
' 2010 B_L' Program za nastavitev parametrov modema in sprejem SMS
' ter krmiljenje preko porta C
'------------------------------------------------------------------------------
$regfile = "m8515.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32
'port C za izhod
Config Portc = Output
Config Portd = Input
Portd = 255 'vklop pull up
Config Debounce = 30
'konfiguracija LCD na port B (miniPin)
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.1
Config Lcd = 16 * 2
Cursor Off Noblink
'podprogrami za obdelavo
Declare Sub Beri_modem(s As String) 'Preverja stanje na RS232 z inkey()
Declare Sub Izprazni_buf() 'izprazni bufer - enako kot clear serial
Declare Sub Beri_sms(s As String ) 'čita SMS preko indeksa (zap. številka) - tel. številka, ura, vsebina
Declare Sub Brisi_sms(s As String) 'briše SMS iz SIM preko zaporedne številke - podana kot string
'uporabljene spremenljivke
Dim I As Byte , B As Byte , J As Integer , A As Byte , T As Integer , Temp As String * 2
Dim Odgovor As String * 60 , Odgovor_1 As String * 20 , Stev As String * 12 , Ura As String * 5 , Datum As String * 8
I = 0 : B = 0 : J = 0 : A = 0
'uporabim serijski input buffer
Config Serialin = Buffered , Size = 100
'omogočim prekinitve zaradi input bufferja
Enable Interrupts
Config Dcf77 = Pine.0 , Timer = 1 , Update = 0
Config 1wire = Portd.7
Config Date = Dmy , Separator = .
Time$ = "17:59:00"
Date$ = "20/02/10"
Const Stevilka_poslji_sms = "AT+CMGS=+38641xxxxxx" ' na to številko pošljem SMS
Portc = 0
Zacetek:
Cls
Lcd "SMS krmiljenje"
Locate 2 , 1
Lcd "Inicializacija!"
Wait 2
Cls
Lcd "Cakam na odziv"
Wait 1
Print "AT" ' dvakrat pošljemo AT za inicializacijo
Print "AT"
Izprazni_buf
Print "ATE0" ' izklopim ECHO
Cls : Lcd "posiljam ATE0"
Beri_modem Odgovor
Locate 2 , 1 : Lcd Odgovor
Wait 1
' spraznimo buffer
Izprazni_buf
' preverim če modem deluje - na LCD
Cls : Lcd "grem v AT" : Wait 1
Print "AT" : Waitms 100
Beri_modem Odgovor ' preberi kaj pošilja modem v spremenljivko Odgovor
Locate 2 , 1
Lcd "at odgovor = " : Lcd Odgovor ' na LCD kaj je odgovoril modem
Wait 1
' izpraznim buffer
Izprazni_buf
' prberi številko SMS centra
Print "AT+CSCA?"
Beri_modem Odgovor
Cls : Lcd "odg " : Locate 2 , 1 : Lcd Odgovor
Wait 3
Cls
Lcd "Kako je s pin"
Print "AT+cpin?" ' pridobi pin status
Beri_modem Odgovor
Locate 2 , 1
Lcd "odg " : Lcd Odgovor
If Odgovor = "+CPIN: SIM PIN" Then
Print "AT+CPIN=0798" ' vpiši pin kodo
End If
Wait 1
Cls
Clear Serialin
Lcd "preverjam param."
Locate 2 , 1
Lcd "text mode SMS ?"
Wait 1
Print "AT+CMGF?" ' poizvedba o nastavitvi
Beri_modem Odgovor
Cls : Lcd Odgovor : Wait 1
Odgovor_1 = Left(odgovor , 8)
If Odgovor = "+CMGF: 1" Then
Wait 1
Cls
Lcd "Nastavljen je" : Locate 2 , 1 : Lcd "tekstovni nacin" : Wait 2 : Cls
End If
If Odgovor = "+CMGF: 0" Then
Cls
Print "AT+CMGF=1"
Beri_modem Odgovor
Lcd Odgovor
Wait 2
Cls
End If
Clear Serialin
' Glavna zanka
Zanka:
Cls
Lcd "Cakam na ukaz"
Do
Locate 2 , 1 : Lcd Time$ : Locate 2 , 9 : Lcd Date$
Debounce Pind.3 , 0 , Zacetek
Debounce Pind.2 , 0 , Beri_temp , Sub
Beri_modem Odgovor ' čitaj kaj pošilja modem čakam na +CMTI: "[slovenščina je zame španska vas]",x
Home Lower : Lcd Odgovor
I = Instr(odgovor , ":") ' iščem dvopičje
If I > 0 Then ' če ni dvopičja je odgovor 0, če je I>0 je prispelo sporočilo
Odgovor_1 = Left(odgovor , I)
Select Case Odgovor_1
Case "+CMTI:" : Beri_sms Odgovor ' odgovor +CMTI da podatek o sprejetem sporočilu
' prostor za obravnavo drugih dogodkov - sporočil modema
End Select
End If
Loop ' konec glavne zanke
'podprogram, ki ga kličemo, ko je SMS sprejet
's vsebuje string napr: +CMTI: "[slovenščina je zame španska vas]",5
Sub Beri_sms(s As String )
Cls
I = Instr(s , ",") ' poišče vejico
I = I + 1
Odgovor_1 = Mid(s , I) ' s tem sem prebral zaporedno številko sprejetega SMS-a
Lcd "SMS stev.: " ; Odgovor_1 'in jo izpisal na LCD
Wait 2
Print "AT+CMGR=" ; Odgovor_1 ' preberi sporočilo z zaporedno številko v spremenljivki Odgovor_1
Beri_modem S ' prebrano bo nekaj takega +CMGR: "REC READ","+38640xxxxxx",,"08/02/10,08:42:49+00"
Stev = Mid(s , 22 , 12) ' izrežemo telefonsko številko
Datum = Mid(s , 38 , 8) 'izrežemo datum
Ura = Mid(s , 47 , 5) 'izrežemo uro
Cls
Lcd Stev 'izpišem tel številko s katere je bil poslan SMS
Locate 2 , 1 : Lcd Datum ; " " ; Ura 'v spodnjo vrstico pa še datum in uro
Wait 2
Beri_modem S ' prejšnji niz je zaključen z <CR> in zato podprogram zaključi z branjem, za vsebino gremo še enkrat v odprogram za branje modema.
Cls : Lcd S : Wait 2 'vsebino izpišem tudi na LCD
Select Case S
Case "led1" : 'ko je vsebina "led1" se vklopi pinc.1 za 6 sekund in vklopi LED_1
Cls : Lcd "Sem vklopil luc1"
Portc.1 = 1 'lahko bi uporabil tudi set PORTC.0 in reset PORTC.1
Wait 6
Portc.1 = 0
Case "led2" : 'ko je vsebina "led2" se vklopi pinc.0 za 10 sekund
Cls : Lcd "Sem vklopil led2"
Portc.0 = 1
Wait 10
Portc.0 = 0
Case "OK" : ' modem na koncu vrne sporočilo OK
Cls : Lcd "Sms zakljucen" : Wait 1
End Select
Brisi_sms Odgovor_1
A = 0
End Sub
'Beremo podtke ki jih pošilja modem
Sub Beri_modem(s As String)
Waitms 200
S = ""
For J = 1 To 100
B = Inkey()
Select Case B
Case 0 'nič ne naredi
Case 13 'nič ne naredi - našli smo <CR>, lahko bi ga tudi izpustil in string bi se zaključil z <CR>
Case 10 : If S <> "" Then Exit For ' na koncu vsakega sporočila je znak za <CR> - 13 in <LF> - 10
Case Else
S = S + Chr(b) ' beremo byte in jih spreminjamo v string
End Select
Next
End Sub
'Praznimo input buffer
Sub Izprazni_buf()
Waitms 100 'malo pavze
Do
B = Inkey() ' beremo in s tem raznimo buffer
Loop Until B = 0 'ko preberemo 0 naj bi bil buffer prazen
End Sub
'Brišemo prebrani SMS
Sub Brisi_sms(s As String)
Dim Odgovor_2 As String * 5
Cls
Lcd "Brisem sms "
Print "AT+CMGD=" ; S ' brišem sporočilo z zaporedno številko v spremenljivki S
Beri_modem Odgovor_2 ' dobiti moramo OK
Lcd Odgovor_2
Wait 1
Home Lower : Lcd "brisan SMSst " ; S
Wait 2
Clear Serialin
Cls
Lcd "CAKAM NA UKAZ"
End Sub
Beri_temp:
1wreset 'reset
1wwrite &HCC 'skip ROM
1wwrite &HBE 'READ Scratchpad
T = 1wread(2)
1wreset
T = T / 2
1wreset
1wwrite &HCC 'skip ROM
1wwrite &H44 'convert temperature
Locate 1 , 1 : Lcd "TEMP " : Lcd T ; "C "
If T < 10 Then
Select Case T
Case 0 : Temp = Chr(48)
Case 1 : Temp = Chr(49)
Case 2 : Temp = Chr(50)
Case 3 : Temp = Chr(51)
Case 4 : Temp = Chr(52)
Case 5 : Temp = Chr(53)
Case 6 : Temp = Chr(54)
Case 7 : Temp = Chr(55)
Case 8 : Temp = Chr(56)
Case 9 : Temp = Chr(57)
End Select
Else
Select Case T
Case 20 : Temp = Chr(50) + Chr(48)
Case 21 : Temp = Chr(50) + Chr(49)
Case 22 : Temp = Chr(50) + Chr(50)
Case 23 : Temp = Chr(50) + Chr(51)
Case 24 : Temp = Chr(50) + Chr(52)
End Select
End If
Locate 2 , 1 : Lcd Temp : Wait 3
Print Stevilka_poslji_sms
Print "TEMPERATURA V PISARNI JE " : Print Temp : Print " STOPINJ"
Print Chr(26)
T = 0
Temp = "0"
Return
|
|
|
Nazaj na vrh |
|
 |
klemen88 Član


Pridružen-a: Tor 01 Jan 2008 17:37 Prispevkov: 747 Aktiv.: 3.51 Kraj: Slovenj Gradec
|
Objavljeno: Tor Feb 23, 2010 11:08 pm Naslov sporočila: |
|
|
digital je napisal/a: |
klpzm: Imaš parav, če ignition izklopiš iz napajanja ter vklopiš nazaj se izvede reset. Napajanje lahko ostane. Se mi zdi še boljša rešitev kot preko serijskega porta, saj bi tudi tukaj potreboval tranzistor ali rele, pa še napajanje max232 bi moral izklopiti.
|
No super! Ker tako sem ga tudi jaz uporabil v eni izmed mojih ''naprav'' z omenjenim modemom. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 497 dni
Powered by phpBB © 2001, 2005 phpBB Group
|