Hallo,
Ik zou graag SMS berichten die ontvangen worden via een GSM modem (WaveCom) serieel inlezen en analyseren om hiermee dan een uitgang hoog/laag te maken van een PIC16F628.
Het lukt me om een seriële communicatie op te bouwen via Hyperterminal, maar voorlopig lukt het enkel om byte per byte iets uit te lezen en hiermee een uitgang te sturen (vb. 'A' = uitgang hoog maken, 'U' is uitgang laag maken).
Heeft iemand een voorbeeld programma hoe ik op een eenvoudige en gestruktureerde manier een ganse karakterstring (een aantal bytes lang) kan inlezen en vergelijken met een string die is opgeslagen in de PIC (Vb. om een paswoord te kontroleren)
Ik programmeer momenteel in assembler.
alvast bedankt!
Luk
eerst en vooral moet je de GSM programmeren (via hyperterminal) zodat die geschikt is voor jouw toepassing.
Iets in die aard
AT&F
AT&C0
AT&D0
ATS0=1
AT+CMGF=1
AT+IPR=9600
AT&W
De GSM moet telkens antwoorden met OK
Om het verkeer tussen je µP en de GSM te kunnen volgen, moet je met een tweede PC en een 'spionagekabel' de communicatie aftappen.
Anders lukt het nooit, geloof me, ik spreek uit ervaring.
Je zult je ook moeten verdiepen in de AT commandoset van je wavecom
ik kan via Hyperterminal reeds SMS berichten lezen uit de GSM modem, nu probeer ik die berichten te analyseren via de PIC.
Mijn probleem is echter het lezen en verwerken van een data string. Ik ben op zoek naar een voorbeeld programmatje om op gestruktureerde manier een string te vergelijken. Vb. hoe vergelijk je of een binnenkomende string gelijk is aan de string 'paswoord'
mijn kennis van PIC's is helaas beperkt tot het programmeren van Basic Stamps, hetgeen helemaal niet lijkt op ASM
Ik heb wel nog een programmaatje liggen (in basic) die met de GSM babbelt, mogelijks ligt dat op mijn werk en is het pas dinsdag dat ik het kan posten
Ik ben dat probleem van een lange tekststring binnenlezen toen ook tegengekomen. Het was inderdaad niet heel eenvoudig op te lossen maar het was uiteindelijk toch gelukt.
Ik zal het dinsdag nog s opzoeken
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Je kunt toch ipv het modem ook een terminal aansluiten en kijken wat de pic uitstuurt? Een spy kabel kan natuurlijk ook, maar alleen de terminal geeft toch ook al heel wat info. Zorg dat je zo snel mogelijk komt naar een paar basis functies zoals "send_character". Als dat stabiel werkt, dan bouw je van daaruit makkelijk je applicatie.
Voorbeeldje wat ik gebruik in mijn sms controller icm Wavecom.
Werkt prima. Tis wel in picbasic
Cls
Print At 1,1, "Checking Messages"
Print At 2,1, "Please Wait....."
SerOut TX, Baudrate, ["AT+CMGR=", Dec b, 13, 10]
For teller = 1 To 220
SerIn RX, Baudrate, 2000, verder2, [x] ; spring eruit als er geen seriele data meer wordt ontvangen
inhoud[teller] = x
Next teller
verder2:
Cls
Print At 1,1, "Testing Messages"
DelayMS 500
; test of er geen berichten meer zijn
For teller2 = 1 To teller
If inhoud[teller2] = "C" Then
If inhoud[teller2+1] = "M" Then
If inhoud[teller2+2] = "S" Then
If inhoud[teller2+3] = " " Then
If inhoud[teller2+4] = "E" Then
If inhoud[teller2+5] = "R" Then
If inhoud[teller2+6] = "R" Then
If inhoud[teller2+7] = "O" Then
Cls
Print At 1,1, "No messages!"
DelayMS 500
b = 1
SerOut TX, Baudrate, ["AT+CMGD=1,2", 13, 10]
GoTo START
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
Next teller2
[\code]jovak
meten is weten, weten is meten, maar hoe kan je weten wat je allemaal moet meten en weten.
Weet ik zo niet meer, had geloof ik te maken met de 16F628 die geen strings ondersteund in Proton pds
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Ik zou het dan liever in 1 if statement doen en ANDen tussen alle voorwaardes. Je if kan wel heel diep en onleesbaar worden zo. Als een compare van een hele string mogelijk is, dan is dat nog mooier natuurlijk (of een pointer laten loopen over een string.. hmm, het is basic....)
Waar kan ik PICBASIC downloaden? is dit ook freeware?
hetgeen ik zou willen doen is volgende:
zodra een nieuwe SMS binnenkomt in de GSM modem stuurt die serieel een string naar buiten: +CMTI: "SM",4
De 4 wijst op het nummer van het SMS bericht (het 4de in dit geval)
om dit SMS bericht op te halen moet volgend commando verstuurd worden: AT+CMGR=4
De GSM modem antwoordt vervolgens met het SMS bericht:
+CMGR: "REC UNREAD","+tel",,"09/12/26,16:49:04+04"
inhoud SMS bericht
dus, ik moet het bericht <+CMTI: "SM",4> eerst analyseren om te weten dat er een commando dient verstuurd te worden dat het SMS bericht ophaalt.
hoe zou ik dat best in ASM programmeren? karakter per karakter binnenlezen en zo analyseren? of eerst de string opslaan in registers om er nadien iets mee te doen?
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
Waar kan ik PICBASIC downloaden? is dit ook freeware?
www.picbasic.nl
Maar waarschijnlijk bedoel je proton 
Maar dat kun je terug vinden op www.picbasic.nl
Ik heb me ondertussen verdiept in PIC-basic en moet toegeven dat het programmeren veel eenvoudiger is dan in ASM.
Ik heb hierover nog een vraagje...
Ik zou graag serieel communiceren en daarna de ontvangen strings op een LCD display zichtbaar maken.
Ik merk nu dat de seriële kanalen op RB1(Rx) en RB2(Tx) zitten. Om een LCD display aan te sturen moet ik ook die 8 uitgangen van port B gebruiken. Hoe kan ik dit doen?
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
Poorten voor de lcd kun je declaren naar andere poorten : kijk maar eens op www.picbasic.nl en dan deel 4 van de curses....
DECLARE LCD_ENPIN PORT . PIN
Standaard = PORTB.2
Stel je wilt de EN (enable) lijn aan PORTA.0 aansluiten, dan schrijf je in je programma:
DECLARE LCD_ENPIN PORTA.0
Als je niets opgeeft gaat de compiler er vanuit dat je de EN lijn op PORTB.2 hebt aangesloten.DECLARE LCD_RSPIN PORT . PIN
Standaard = PORTB.3
Stel je wilt de RS (register select) lijn aan PORTA.1 aansluiten, dan schrijf je in je programma:
DECLARE LCD_RSPIN PORTA.1
Als je niets opgeeft gaat de compiler er vanuit dat je de RS lijn op PORTB.3 hebt aangesloten.DECLARE LCD_DTPIN PORT . PIN
Standaard = PORTB.4
Een LCD kan worden aangestuurd met 4 of met 8 datalijnen.
Als voor 8 datalijnen wordt gekozen, dan moeten alle 8 lijnen worden verbonden met één en dezelfde poort (bijvoorbeeld PORTB).
Bij 8 datalijnen moet dan het volgende ergens bovenin het programma staan:
DECLARE LCD_DTPIN PORTB.0Gebruik je maar 4 datalijnen (wat meestal wordt gedaan), dan moeten deze 4 lijnen óf met de onderste 4, óf met de bovenste 4 pinnen van één en dezelfde poort worden verbonden.
Stel je wilt de datalijnen op PORTB.0 t/m PORTB.3 aansluiten, dan schrijf je in je programma:
DECLARE LCD_DTPIN PORTB.0
Als je niets opgeeft gaat de compiler er vanuit dat je de datalijnen op PORTB.4 t/m PORTB.7 hebt aangesloten.DECLARE LCD_LINES 1, 2 of 4
Standaard = 2
Informeert de compiler hoeveel regels het display heeft.
LCD's zijn er in verscheidene soorten, waarvan de 2x16 (2 regels, 16 karakters per regel) de meest populaire is.
Maar ze zijn er ook met 1 of 4 regels.
Geef het aantal regels dat het aangesloten soort display heeft door aan de compiler met deze instructie.
[Bericht gewijzigd door Fredjuhh op (87%)]
kan een LCD display dan met zowel 8 als 4 datalijnen overweg? Hoe weet het LCD display uiteindelijk dat het maar met 4 datalijnen werkt?
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
Als jij zo'n standaard lcd bij dickbest of baco vandaan haalt, en je doet wat op de picbasic site staat, dan werkt dat gewoon in proton op 4 datalijnen, dat hoef je niet tegen het display te zeggen, dat doet hij zelf 
Stel je wilt de datalijnen op PORTB.0 t/m PORTB.3 aansluiten, dan schrijf je in je programma:
DECLARE LCD_DTPIN PORTB.0
Als je niets opgeeft gaat de compiler er vanuit dat je de datalijnen op PORTB.4 t/m PORTB.7 hebt aangesloten.