Beste allen,
Ik ben zoals in een vorig topic van mij te lezen is met RFID bezig. Ik heb de RFID module nog steeds niet 100% werkend, maar in elk geval voldoende voor mijn doel.
Als ik via mijn pc (via een USB-TTL-convertertje) het commando stuur om het soort chip te lezen krijg ik braaf het soort chip terug gestuurd. Mijn doel was om (for the time being) dit over te zetten op een PIC. Dus:
PIC stuurt het commando om het soort chip te lezen
RFID module doet dat en stuurt dat terug naar de PIC
PIC laat dit zien op een LCD schermpje en stuurt het via TTL naar mijn pc
Het eerste gaat goed, het tweede ook, het derde gaat hopeloos mis.
Hij lijkt alleen de eerste 3 hexadecimale getallen te pakken en de rest van de string negeert hij totaal. Daarbij schiet hij telkens naar de timeout terwijl hij weldegelijk data aangeboden krijgt. En als ik via de TTL-converter "meeluister" naar dat de RFID module verstuurt, is dat precies wat ik verwacht.
Hieruit maak ik op dat tijdens het ontvangen van de PIC iets mis gaat.
Kan iemand mij vertellen of deze aanname klopt en wat ik hier aan zou kunnen doen (of als mijn aanname nergens op slaat, wat het dan wel zou kunnen zijn).
Met hoopvolle groet
Daan Steeman
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
PIC laat dit zien op een LCD schermpje en stuurt het via TTL naar mijn pc
Dat kan niet. Een com poort is RS232, geen TTL. (+12/-12v)
Wat er in je code misgaat verder is zo niet veel van te zeggen. (glazen bol is weer eens kapot...
)
hadv
Just find out what you like and let it kill you
Inderdaad, maar de TS heeft het ook over een USB-TTL converter, dus het zou zomaar kunnen zijn dat die wordt bedoeld.
Maarre...een ietsje meer informatie zou wel prettig zijn. Schema, configuratie, stukje code wellicht (SerIn klinkt naar PicBasic)...
Het kan val alles zijn, maar ik zou eerst maar eens controleren of alle baudrates hetzelfde zijn (PC, PIC, RFID).
[Bericht gewijzigd door hadv op (52%)]
Op 13 april 2014 19:00:21 schreef hadv:
Inderdaad, maar de TS heeft het ook over een USB-TTL converter, dus het zou zomaar kunnen zijn dat die wordt bedoeld.
Haha excuus voor de verwarring, ik bedoel inderdaad via de USB_TTL converter
glazen bol is weer eens kapot...
Hierbij de code 
Xtal 20
All_Digital true
Declare PortB_Pullups true
Declare Serial_Baud = 9600 ;Set baud rate to 9600
Declare Hserial_RCSTA = %10010000 ;Enable serial port and continuous receive
Declare Hserial_TXSTA = %00100000 ;Enable transmit and asynchronous mode
Declare Hserial_Clear = On ; Optionally clear the buffer before receiving
Dim TTLstring As String *16
Mainpassive:
If Schk5 = Saan Then ; met de 5 toest ga je naar de instellingen
;GoTo Instellingen
SerOut Zender, 84, [Str TTLstring]
ElseIf Schkster = Saan Then ; met de * toets activeer je het alarm
PORTD.1 = PORTD.1 ^ 1
While Schkster = Saan: Wend
RFIDlezer = Aan
DelayMS 100 ;tijd voor rfidlezer om op te starten
Cls
Print At 1, 1, "ontvangen"
SerOut Zender, 84, [$07, $02, $41, $01, $52, $E8, $03] ; soort key opvragen
SerIn Ontvanger, 84, 1000, Timeout1, [Str TTLstring] ; informatie van gps-module ontvangen
DelayMS 100
SerOut Zender, 84, [Str TTLstring]
Cls
Print At 1, 1, Str TTLstring
DelayMS 1000
EndIf
Cls
Print At 1, 1, "test"
DelayMS 1000
PORTD.0 = PORTD.0 ^ 1
GoTo Mainpassive
Ik heb nu even de (naar mijn idee) relevante onderdelen gepost om zo'n megalap te voorkomen. Als dit niet voldoende is kan ik ook de hele code sturen uiteraard.
Dank voor jullie snelle reactie in elk geval
EDIT: foutje in de code van een van de probeersels, bij deze verbeterd
hadv
Just find out what you like and let it kill you
Ik weet niet welk device je gebruikt, maar ik zie wel iets vreemds in je code:
- je hebt de nodige declares voor de UART neergezet
- je gebruikt SerIn/Out met berekende waarden
Als je een device met ingebouwde UART hebt (en dat zijn er heeeel veel) dan heb je in principe Serin/Out niet nodig maar kun je de veel eenvoudigere combinatie HSerIn/Out gebruiken.
HSerIn/Out is nauwkeuriger omdat het door de hardware van het device wordt uitgevoerd terwijl SerIn/Out door de compiler moet worden gerealiseerd (bit banging).
Uit je code is nog op geen enkele manier duidelijk wat er nu waar en wanneer fout gaat. De TTLString moet op de LCD komen, maar waar de inhoud uberhaupt vandaan komt is totaal niet duidelijk.
Het zou zomaar kunnen zijn dat er ergens in die string een nul-karakter voorkomt waardoor allerlei functies daar stoppen...
[Bericht gewijzigd door hadv op (23%)]
Beste hadv,
Die declares heb ik ooit eens een keer uit en van de vele fora geplukt voor een ander project waar ik ook een module koppelde aan de PIC via TTL. (GPS ontvangertje voor de tijd).
Wat bedoel je precies met "berekende waarden"? De waarde die ik via serout verstuur is niks anders dan een commando aan de RFID module wat betekend "kijk of er een chip in de buurt is en zo ja wat voor type chip is dat dan".
Wat dat UART betreft, om heel eerlijk te zijn is de digitale communicatie nog iets nieuws voor mij en af en toe tamelijk verwarrend. Zoals ik zei heb ik al eens signalen van een GPS module ontvangen en verwerkt maar dat was tamelijk simpel. Ik dacht dat UART überhaupt TTL communicatie mogelijk maakte, maar uit wat jij zegt begrijp ik dat het aanzienlijk meer is dan dat? Ik heb inderdaad op dit en andere fora gevonden dat HSerin/out eenvoudiger is maar omdat ik zelf (zeer beperkte) ervaring met serin/out had heb ik hiervoor gekozen. Raad je aan om over te stappen naar HSerin/out?
Die string komt van de RFID-lezer die ik in het commando daarvoor opdracht geef om te check op aanwezigheid van een chip en het soort daarvan te bepalen en dit naar de PIC te verzenden.
Als je met een nul-karakter letterlijk een "0" bedoeld, dan ja die zitten er behoorlijk veel in zelfs. Dit "08 02 00 02 04 00 F3 03 " krijgt de PIC namelijk binnen. Of begrijp ik iets niet goed :$?
Bedankt voor je intresse, ik ben echt blij dat iemand me hiermee wilt helpen.
[Bericht gewijzigd door Henry S. op (24%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Normaal wordt een in een string voorkomend 'null character' (0x00) gezien als termination ofwel het einde van de string.
Als je een echte UART hebt is dat uiteraard altijd beter als bit-bangen met SerOut(). Het is veel simpeler en ontlast de controller.
Beste Arco,
De module waar het om gaat beschikt over UART dus dat is geen probleem. Ik heb even opgezocht wat bit-bangen precies is en als ik het goed begrijp moet je dat als het even kan vermijden. Ik heb giste.ravond in een probeersel de code aangepast om Hserin/out te gebruiken maar het resultaat is exact hetzelfde. Van een string van 8 hexadecimale getallen pakt hij alleen de eerste twee.... of liever gezegd tot het eerste nul-character. Wat ook meteen verklaart waarom hij de string wel pakt als ik een willekeurige string vanaf mijn pc stuur waar ik geen 00 in zet. (Ja dit besef kwam binnen vallen tijdens het typen)... is het mogelijk om het teken voor termination te veranderen of gewoon uit te zetten? (En dus de stringlengte opgeven en op basis daarvan bepalen of alles binnen is). Ik heb gevonden hoe ik slechts een deel van een string laat vullen en daarna verder ga met het programma, alleen hoe ik langs dat 0 character kom weet ik niet.
Dank voor je antwoord, nu weet ik in elk geval wat het probleem is.
[Bericht gewijzigd door Henry S. op (15%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als je de data als losse bytes verstuurt i.p.v. in een string dan heb je geen probleem. (weet niet of syntax klopt)
Dim MyByte As Byte[8]
...
...
For i = 0 to 7
HSerout MyByte[i]
Next i
Ik ontvang die bytes (waaronder ook de nullbyte) werkt dat zelfde truukje als ik het als 8 losse bytes ontvang?
[Bericht gewijzigd door Henry S. op (57%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Super, ik ga t vanavond meteen proberen, k zal het resultaat zoizo laten weten
.
Zoizo iedereen bedankt voor de input.
Groet, Daan
EDIT: jawel jawel, het is gelukt. Niet alleen moest het ontvangen op de PIC per byte maar ook het verzenden van PIC via de USB-TTL converter moest per byte (blijkbaar pakt mn pc ook 0x00 als einde van een string. Iedereen erg bedankt voor de help
Vriendelijke groet
Daan Steeman
[Bericht gewijzigd door DaanSteeman op (51%)]